diff --git a/lib/src/code_generator/type.dart b/lib/src/code_generator/type.dart index 9622ee47..694bacf0 100644 --- a/lib/src/code_generator/type.dart +++ b/lib/src/code_generator/type.dart @@ -116,7 +116,7 @@ class Type { } factory Type.incompleteArray(Type elementType) { return Type._( - broadType: BroadType.ConstantArray, + broadType: BroadType.IncompleteArray, child: elementType, ); } diff --git a/lib/src/header_parser/sub_parsers/structdecl_parser.dart b/lib/src/header_parser/sub_parsers/structdecl_parser.dart index 5081aedd..39c56dea 100644 --- a/lib/src/header_parser/sub_parsers/structdecl_parser.dart +++ b/lib/src/header_parser/sub_parsers/structdecl_parser.dart @@ -19,6 +19,7 @@ class _ParsedStruc { Struc struc; bool nestedStructMember = false; bool unimplementedMemberType = false; + bool flexibleArrayMember = false; bool arrayMember = false; _ParsedStruc(); } @@ -92,6 +93,12 @@ void _setStructMembers(Pointer 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(); } } @@ -118,6 +125,9 @@ int _structMembersVisitor(Pointer 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) { diff --git a/test/header_parser_tests/function_n_struct.h b/test/header_parser_tests/function_n_struct.h index e779d5fb..3ee27b8a 100644 --- a/test/header_parser_tests/function_n_struct.h +++ b/test/header_parser_tests/function_n_struct.h @@ -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[]); diff --git a/test/header_parser_tests/function_n_struct_test.dart b/test/header_parser_tests/function_n_struct_test.dart index b3da1d89..38951f19 100644 --- a/test/header_parser_tests/function_n_struct_test.dart +++ b/test/header_parser_tests/function_n_struct_test.dart @@ -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', @@ -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, + ), + ), ], ); }