[ffigen] Remove structs members for bit field members, Added tests (#85)
diff --git a/pkgs/ffigen/CHANGELOG.md b/pkgs/ffigen/CHANGELOG.md index 12fe1b5..f496c70 100644 --- a/pkgs/ffigen/CHANGELOG.md +++ b/pkgs/ffigen/CHANGELOG.md
@@ -1,3 +1,6 @@ +# 0.2.3 +- Fixed parsing structs with bitfields, all members of structs with bit field members will now be removed. See [#84](https://github.com/dart-lang/ffigen/issues/84) + # 0.2.2+1 - Updated `package:meta` version to `^1.1.8` for compatibility with flutter sdk.
diff --git a/pkgs/ffigen/lib/src/clang_library/wrapper.c b/pkgs/ffigen/lib/src/clang_library/wrapper.c index 2482e36..96f64ba 100644 --- a/pkgs/ffigen/lib/src/clang_library/wrapper.c +++ b/pkgs/ffigen/lib/src/clang_library/wrapper.c
@@ -363,4 +363,8 @@ return ptrToCXString(clang_getCursorUSR(*cursor)); } +int clang_getFieldDeclBitWidth_wrap(CXCursor *cursor){ + return clang_getFieldDeclBitWidth(*cursor); +} + // END ===== WRAPPER FUNCTIONS =====================
diff --git a/pkgs/ffigen/lib/src/clang_library/wrapper.def b/pkgs/ffigen/lib/src/clang_library/wrapper.def index 5cb8a5c..8a984b0 100644 --- a/pkgs/ffigen/lib/src/clang_library/wrapper.def +++ b/pkgs/ffigen/lib/src/clang_library/wrapper.def
@@ -359,3 +359,4 @@ clang_Cursor_isAnonymous_wrap clang_Cursor_isAnonymousRecordDecl_wrap clang_getCursorUSR_wrap +clang_getFieldDeclBitWidth_wrap
diff --git a/pkgs/ffigen/lib/src/header_parser/clang_bindings/clang_bindings.dart b/pkgs/ffigen/lib/src/header_parser/clang_bindings/clang_bindings.dart index 82222c7..b108302 100644 --- a/pkgs/ffigen/lib/src/header_parser/clang_bindings/clang_bindings.dart +++ b/pkgs/ffigen/lib/src/header_parser/clang_bindings/clang_bindings.dart
@@ -791,6 +791,20 @@ } _dart_clang_getCursorUSR_wrap _clang_getCursorUSR_wrap; + + int clang_getFieldDeclBitWidth_wrap( + ffi.Pointer<CXCursor> cursor, + ) { + _clang_getFieldDeclBitWidth_wrap ??= _dylib.lookupFunction< + _c_clang_getFieldDeclBitWidth_wrap, + _dart_clang_getFieldDeclBitWidth_wrap>( + 'clang_getFieldDeclBitWidth_wrap'); + return _clang_getFieldDeclBitWidth_wrap( + cursor, + ); + } + + _dart_clang_getFieldDeclBitWidth_wrap _clang_getFieldDeclBitWidth_wrap; } /// A character string. @@ -2662,3 +2676,11 @@ typedef _dart_clang_getCursorUSR_wrap = ffi.Pointer<CXString> Function( ffi.Pointer<CXCursor> cursor, ); + +typedef _c_clang_getFieldDeclBitWidth_wrap = ffi.Int32 Function( + ffi.Pointer<CXCursor> cursor, +); + +typedef _dart_clang_getFieldDeclBitWidth_wrap = int Function( + ffi.Pointer<CXCursor> cursor, +);
diff --git a/pkgs/ffigen/lib/src/header_parser/sub_parsers/structdecl_parser.dart b/pkgs/ffigen/lib/src/header_parser/sub_parsers/structdecl_parser.dart index 6ae4c80..44ece8d 100644 --- a/pkgs/ffigen/lib/src/header_parser/sub_parsers/structdecl_parser.dart +++ b/pkgs/ffigen/lib/src/header_parser/sub_parsers/structdecl_parser.dart
@@ -21,6 +21,7 @@ bool unimplementedMemberType = false; bool flexibleArrayMember = false; bool arrayMember = false; + bool bitFieldMember = false; _ParsedStruc(); } @@ -108,6 +109,12 @@ _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(); + } else if (_stack.top.bitFieldMember) { + _logger.fine( + '---- Removed Struct members, reason: bitfield members ${cursor.completeStringRepr()}'); + _logger.warning( + 'Removed All Struct Members from ${_stack.top.struc.name}(${_stack.top.struc.originalName}), Bit Field members not supported.'); + return _stack.top.struc.members.clear(); } } @@ -121,7 +128,6 @@ _logger.finer('===== member: ${cursor.completeStringRepr()}'); final mt = cursor.type().toCodeGenTypeAndDispose(); - //TODO(4): Remove these when support for Structs by value arrives. if (mt.broadType == BroadType.Struct) { // Setting this flag will exclude adding members for this struct's @@ -137,6 +143,9 @@ } else if (mt.broadType == BroadType.IncompleteArray) { // TODO(68): Structs with flexible Array Members are not supported. _stack.top.flexibleArrayMember = true; + } else if (clang.clang_getFieldDeclBitWidth_wrap(cursor) != -1) { + // TODO(84): Struct with bitfields are not suppoorted. + _stack.top.bitFieldMember = true; } if (mt.getBaseType().broadType == BroadType.Unimplemented) {
diff --git a/pkgs/ffigen/lib/src/strings.dart b/pkgs/ffigen/lib/src/strings.dart index 726e2f5..9337fa1 100644 --- a/pkgs/ffigen/lib/src/strings.dart +++ b/pkgs/ffigen/lib/src/strings.dart
@@ -7,7 +7,7 @@ as clang; // This version must be updated whenever we update the libclang wrapper. -const dylibVersion = 'v3'; +const dylibVersion = 'v4'; /// Name of the dynamic library file according to current platform. String get dylibFileName {
diff --git a/pkgs/ffigen/pubspec.yaml b/pkgs/ffigen/pubspec.yaml index ca0fb44..9695da5 100644 --- a/pkgs/ffigen/pubspec.yaml +++ b/pkgs/ffigen/pubspec.yaml
@@ -3,7 +3,7 @@ # BSD-style license that can be found in the LICENSE file. name: ffigen -version: 0.2.2+1 +version: 0.2.3 homepage: https://github.com/dart-lang/ffigen description: Experimental generator for FFI bindings, using LibClang to parse C/C++ header files.
diff --git a/pkgs/ffigen/test/header_parser_tests/function_n_struct.h b/pkgs/ffigen/test/header_parser_tests/function_n_struct.h index 3ee27b8..629c0ba 100644 --- a/pkgs/ffigen/test/header_parser_tests/function_n_struct.h +++ b/pkgs/ffigen/test/header_parser_tests/function_n_struct.h
@@ -18,6 +18,13 @@ int b[]; // Flexible array member. }; +// All members should be removed, Bit fields are not supported. +struct Struct4 +{ + int a:3; + int :2; // Unnamed bit field. +}; + void func1(struct Struct2 *s); // Incomplete array parameter will be treated as a pointer.
diff --git a/pkgs/ffigen/test/header_parser_tests/function_n_struct_test.dart b/pkgs/ffigen/test/header_parser_tests/function_n_struct_test.dart index 38951f1..909c13a 100644 --- a/pkgs/ffigen/test/header_parser_tests/function_n_struct_test.dart +++ b/pkgs/ffigen/test/header_parser_tests/function_n_struct_test.dart
@@ -46,6 +46,9 @@ test('Struct3 flexible array member', () { expect((actual.getBinding('Struct3') as Struc).members.isEmpty, true); }); + test('Struct4 bit field member', () { + expect((actual.getBinding('Struct4') as Struc).members.isEmpty, true); + }); }); } @@ -81,6 +84,7 @@ SupportedNativeType.Void, ), ), + Struc(name: 'Struct4'), ], ); }
diff --git a/pkgs/ffigen/tool/libclang_config.yaml b/pkgs/ffigen/tool/libclang_config.yaml index c6baf25..4262736 100644 --- a/pkgs/ffigen/tool/libclang_config.yaml +++ b/pkgs/ffigen/tool/libclang_config.yaml
@@ -100,3 +100,4 @@ - clang_Cursor_isAnonymous_wrap - clang_Cursor_isAnonymousRecordDecl_wrap - clang_getCursorUSR_wrap + - clang_getFieldDeclBitWidth_wrap