Remove structs members for bit field members, Added tests (#85)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 12fe1b5..f496c70 100644
--- a/CHANGELOG.md
+++ b/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/lib/src/clang_library/wrapper.c b/lib/src/clang_library/wrapper.c
index 2482e36..96f64ba 100644
--- a/lib/src/clang_library/wrapper.c
+++ b/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/lib/src/clang_library/wrapper.def b/lib/src/clang_library/wrapper.def
index 5cb8a5c..8a984b0 100644
--- a/lib/src/clang_library/wrapper.def
+++ b/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/lib/src/header_parser/clang_bindings/clang_bindings.dart b/lib/src/header_parser/clang_bindings/clang_bindings.dart
index 82222c7..b108302 100644
--- a/lib/src/header_parser/clang_bindings/clang_bindings.dart
+++ b/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/lib/src/header_parser/sub_parsers/structdecl_parser.dart b/lib/src/header_parser/sub_parsers/structdecl_parser.dart
index 6ae4c80..44ece8d 100644
--- a/lib/src/header_parser/sub_parsers/structdecl_parser.dart
+++ b/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/lib/src/strings.dart b/lib/src/strings.dart
index 726e2f5..9337fa1 100644
--- a/lib/src/strings.dart
+++ b/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/pubspec.yaml b/pubspec.yaml
index ca0fb44..9695da5 100644
--- a/pubspec.yaml
+++ b/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/test/header_parser_tests/function_n_struct.h b/test/header_parser_tests/function_n_struct.h
index 3ee27b8..629c0ba 100644
--- a/test/header_parser_tests/function_n_struct.h
+++ b/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/test/header_parser_tests/function_n_struct_test.dart b/test/header_parser_tests/function_n_struct_test.dart
index 38951f1..909c13a 100644
--- a/test/header_parser_tests/function_n_struct_test.dart
+++ b/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/tool/libclang_config.yaml b/tool/libclang_config.yaml
index c6baf25..4262736 100644
--- a/tool/libclang_config.yaml
+++ b/tool/libclang_config.yaml
@@ -100,3 +100,4 @@
- clang_Cursor_isAnonymous_wrap
- clang_Cursor_isAnonymousRecordDecl_wrap
- clang_getCursorUSR_wrap
+ - clang_getFieldDeclBitWidth_wrap