diff --git a/pkgs/ffigen/CHANGELOG.md b/pkgs/ffigen/CHANGELOG.md index 8dc3b7440..819ec7558 100644 --- a/pkgs/ffigen/CHANGELOG.md +++ b/pkgs/ffigen/CHANGELOG.md @@ -9,6 +9,8 @@ `Declarations.includeMemberSet`, `Declarations.useOriginalName`, `Declarations.renameWithMap`, `Declarations.useMemberOriginalName`, and `Declarations.renameMemberWithMap`. +- Fix [a bug](https://github.com/dart-lang/native/issues/2760) in the internal + variables generated by function bindings. ## 20.0.0 diff --git a/pkgs/ffigen/lib/src/code_generator/func.dart b/pkgs/ffigen/lib/src/code_generator/func.dart index 37028b8a7..e84b61b82 100644 --- a/pkgs/ffigen/lib/src/code_generator/func.dart +++ b/pkgs/ffigen/lib/src/code_generator/func.dart @@ -110,7 +110,7 @@ class Func extends LookUpBinding with HasLocalScope { functionType.getFfiDartType(context, writeArgumentNames: false); final needsWrapper = !functionType.sameDartAndFfiDartType && !isInternal; - final funcVarName = localScope.addPrivate('_$name'); + final funcVarName = context.rootScope.addPrivate('_$name'); final ffiReturnType = functionType.returnType.getFfiDartType(context); final ffiArgDeclString = functionType.dartTypeParameters .map((p) => '${p.type.getFfiDartType(context)} ${p.name},\n') @@ -182,7 +182,7 @@ $dartReturnType $enclosingFuncName($dartArgDeclString) => $funcImplCall; ); } } else { - final funcPointerName = localScope.addPrivate('_${name}Ptr'); + final funcPointerName = context.rootScope.addPrivate('_${name}Ptr'); final isLeafString = isLeaf ? 'isLeaf:true' : ''; // Write enclosing function. diff --git a/pkgs/ffigen/test/native_objc_test/method_test.dart b/pkgs/ffigen/test/native_objc_test/method_test.dart index c86bba026..de03b95b2 100644 --- a/pkgs/ffigen/test/native_objc_test/method_test.dart +++ b/pkgs/ffigen/test/native_objc_test/method_test.dart @@ -37,10 +37,10 @@ void main() { 'objc_test.dylib', ), ); - // verifySetupFile(dylib); + verifySetupFile(dylib); DynamicLibrary.open(dylib.absolute.path); testInstance = MethodInterface(); - // generateBindingsForCoverage('method'); + generateBindingsForCoverage('method'); }); group('Instance methods', () { diff --git a/pkgs/ffigen/test/native_objc_test/static_func_config.yaml b/pkgs/ffigen/test/native_objc_test/static_func_config.yaml index 1a958c886..42c62ee3e 100644 --- a/pkgs/ffigen/test/native_objc_test/static_func_config.yaml +++ b/pkgs/ffigen/test/native_objc_test/static_func_config.yaml @@ -5,6 +5,8 @@ output: 'static_func_bindings.dart' exclude-all-by-default: true functions: include: + - foo + - fooPtr - staticFuncOfObject - staticFuncOfNullableObject - staticFuncOfBlock diff --git a/pkgs/ffigen/test/native_objc_test/static_func_native_config.yaml b/pkgs/ffigen/test/native_objc_test/static_func_native_config.yaml index 8efce2e6b..e462f4cb8 100644 --- a/pkgs/ffigen/test/native_objc_test/static_func_native_config.yaml +++ b/pkgs/ffigen/test/native_objc_test/static_func_native_config.yaml @@ -6,6 +6,8 @@ exclude-all-by-default: true ffi-native: functions: include: + - foo + - fooPtr - staticFuncOfObject - staticFuncOfNullableObject - staticFuncOfBlock diff --git a/pkgs/ffigen/test/native_objc_test/static_func_native_test.dart b/pkgs/ffigen/test/native_objc_test/static_func_native_test.dart index bf3a33697..337ce6fc9 100644 --- a/pkgs/ffigen/test/native_objc_test/static_func_native_test.dart +++ b/pkgs/ffigen/test/native_objc_test/static_func_native_test.dart @@ -192,5 +192,11 @@ void main() { expect(counter.value, 0); calloc.free(counter); }, skip: !canDoGC); + + test('Internal variable conflict resolution', () { + // Regression test for https://github.com/dart-lang/native/issues/2760 + expect(foo(123), 1230); + expect(fooPtr(123), 12300); + }); }); } diff --git a/pkgs/ffigen/test/native_objc_test/static_func_test.dart b/pkgs/ffigen/test/native_objc_test/static_func_test.dart index 7c90e65a5..07a881533 100644 --- a/pkgs/ffigen/test/native_objc_test/static_func_test.dart +++ b/pkgs/ffigen/test/native_objc_test/static_func_test.dart @@ -194,5 +194,11 @@ void main() { expect(counter.value, 0); calloc.free(counter); }, skip: !canDoGC); + + test('Internal variable conflict resolution', () { + // Regression test for https://github.com/dart-lang/native/issues/2760 + expect(lib.foo(123), 1230); + expect(lib.fooPtr(123), 12300); + }); }); } diff --git a/pkgs/ffigen/test/native_objc_test/static_func_test.m b/pkgs/ffigen/test/native_objc_test/static_func_test.m index 77964f8da..fc858d5e1 100644 --- a/pkgs/ffigen/test/native_objc_test/static_func_test.m +++ b/pkgs/ffigen/test/native_objc_test/static_func_test.m @@ -58,3 +58,6 @@ - (void)dealloc { if (counter != nil) --*counter; } @end + +int foo(int x) { return 10 * x; } +int fooPtr(int x) { return 100 * x; }