Skip to content
This repository was archived by the owner on Jan 28, 2024. It is now read-only.

Handle Incomplete array members in structs #69

Merged
merged 1 commit into from
Aug 7, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion lib/src/code_generator/type.dart
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ class Type {
}
factory Type.incompleteArray(Type elementType) {
return Type._(
broadType: BroadType.ConstantArray,
broadType: BroadType.IncompleteArray,
child: elementType,
);
}
Expand Down
10 changes: 10 additions & 0 deletions lib/src/header_parser/sub_parsers/structdecl_parser.dart
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ class _ParsedStruc {
Struc struc;
bool nestedStructMember = false;
bool unimplementedMemberType = false;
bool flexibleArrayMember = false;
bool arrayMember = false;
_ParsedStruc();
}
Expand Down Expand Up @@ -92,6 +93,12 @@ void _setStructMembers(Pointer<clang_types.CXCursor> cursor) {
_logger.warning(
'Removed All Struct Members from ${_stack.top.struc.name}(${_stack.top.struc.originalName}), struct member has an unsupported type.');
return _stack.top.struc.members.clear();
} else if (_stack.top.flexibleArrayMember) {
_logger.fine(
'---- Removed Struct members, reason: incomplete array member ${cursor.completeStringRepr()}');
_logger.warning(
'Removed All Struct Members from ${_stack.top.struc.name}(${_stack.top.struc.originalName}), Flexible array members not supported.');
return _stack.top.struc.members.clear();
}
}

Expand All @@ -118,6 +125,9 @@ int _structMembersVisitor(Pointer<clang_types.CXCursor> cursor,
// bindings.
_stack.top.nestedStructMember = true;
}
} else if (mt.broadType == BroadType.IncompleteArray) {
// TODO(68): Structs with flexible Array Members are not supported.
_stack.top.flexibleArrayMember = true;
}

if (mt.getBaseType().broadType == BroadType.Unimplemented) {
Expand Down
9 changes: 9 additions & 0 deletions test/header_parser_tests/function_n_struct.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,13 @@ struct Struct2
struct Struct1 a;
};

struct Struct3
{
int a;
int b[]; // Flexible array member.
};

void func1(struct Struct2 *s);

// Incomplete array parameter will be treated as a pointer.
void func2(struct Struct3 s[]);
22 changes: 20 additions & 2 deletions test/header_parser_tests/function_n_struct_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -32,22 +32,31 @@ ${strings.headers}:
);
});

test('func1', () {
test('func1 struct pointer parameter', () {
expect(actual.getBindingAsString('func1'),
expected.getBindingAsString('func1'));
});
test('Struct2', () {
test('func2 incomplete array parameter', () {
expect(actual.getBindingAsString('func2'),
expected.getBindingAsString('func2'));
});
test('Struct2 nested struct member', () {
expect((actual.getBinding('Struct2') as Struc).members.isEmpty, true);
});
test('Struct3 flexible array member', () {
expect((actual.getBinding('Struct3') as Struc).members.isEmpty, true);
});
});
}

Library expectedLibrary() {
final struc2 = Struc(name: 'Struct2', members: []);
final struc3 = Struc(name: 'Struct3', members: []);
return Library(
name: 'Bindings',
bindings: [
struc2,
struc3,
Struc(name: 'Struct1', members: [
Member(
name: 'a',
Expand All @@ -63,6 +72,15 @@ Library expectedLibrary() {
SupportedNativeType.Void,
),
),
Func(
name: 'func2',
parameters: [
Parameter(name: 's', type: Type.pointer(Type.struct(struc3))),
],
returnType: Type.nativeType(
SupportedNativeType.Void,
),
),
],
);
}