diff --git a/.github/workflows/ffigen.yml b/.github/workflows/ffigen.yml index c06836a36b..ca1502b913 100644 --- a/.github/workflows/ffigen.yml +++ b/.github/workflows/ffigen.yml @@ -41,6 +41,7 @@ jobs: - name: Check formatting run: dart format --output=none --set-exit-if-changed . if: always() && steps.install.outcome == 'success' + - run: git diff - name: Build test dylib and bindings run: dart --enable-asserts test/setup.dart - name: Analyze code diff --git a/pkgs/ffigen/example/objective_c/avf_audio_bindings.dart b/pkgs/ffigen/example/objective_c/avf_audio_bindings.dart index e34e32b3e7..feac9caab4 100644 --- a/pkgs/ffigen/example/objective_c/avf_audio_bindings.dart +++ b/pkgs/ffigen/example/objective_c/avf_audio_bindings.dart @@ -729,7 +729,16 @@ extension type CASpatialAudioExperience._(objc.ObjCObject object$) }) : object$ = objc.ObjCObject(other, retain: retain, release: release) {} } -late final _class_AVAudioPlayer = objc.getClass("AVAudioPlayer"); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_AVAudioPlayer', +) +external ffi.Pointer _class_AVAudioPlayer_raw; +final _class_AVAudioPlayer = objc.getClass( + "AVAudioPlayer", + () => ffi.Native.addressOf>( + _class_AVAudioPlayer_raw, + ).cast(), +); final _objc_msgSend_151sglz = objc.msgSendPointer .cast< ffi.NativeFunction< diff --git a/pkgs/ffigen/example/swift/swift_api_bindings.dart b/pkgs/ffigen/example/swift/swift_api_bindings.dart index 5f8eff4044..b1165b588e 100644 --- a/pkgs/ffigen/example/swift/swift_api_bindings.dart +++ b/pkgs/ffigen/example/swift/swift_api_bindings.dart @@ -94,7 +94,16 @@ extension SwiftClass$Methods on SwiftClass { } } -late final _class_SwiftClass = objc.getClass("swift_module.SwiftClass"); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_swift_module.SwiftClass', +) +external ffi.Pointer _class_SwiftClass_raw; +final _class_SwiftClass = objc.getClass( + "swift_module.SwiftClass", + () => ffi.Native.addressOf>( + _class_SwiftClass_raw, + ).cast(), +); final _objc_msgSend_151sglz = objc.msgSendPointer .cast< ffi.NativeFunction< diff --git a/pkgs/ffigen/lib/src/code_generator/objc_built_in_functions.dart b/pkgs/ffigen/lib/src/code_generator/objc_built_in_functions.dart index a2179c9afc..e2ceb36392 100644 --- a/pkgs/ffigen/lib/src/code_generator/objc_built_in_functions.dart +++ b/pkgs/ffigen/lib/src/code_generator/objc_built_in_functions.dart @@ -276,7 +276,7 @@ class ObjCImport { String gen(Context context) => '${context.libs.prefix(objcPkgImport)}.$name'; } -/// Globals only used internally by ObjC bindings, such as classes and SELs. +/// Globals only used internally by ObjC bindings, such as selectors. class ObjCInternalGlobal extends NoLookUpBinding { final String Function() makeValue; @@ -294,6 +294,83 @@ class ObjCInternalGlobal extends NoLookUpBinding { } } +/// A global variable for an ObjC class, loaded via @Native. +class ObjCClassGlobal extends NoLookUpBinding { + final String lookupName; + final Symbol rawSymbol; + ObjCClassGlobal(String name, this.lookupName) + : rawSymbol = Symbol('${name}_raw', SymbolKind.field), + super( + originalName: name, + symbol: Symbol(name, SymbolKind.field), + isInternal: true, + ); + + @override + BindingString toBindingString(Writer w) { + final context = w.context; + final ffi = context.libs.prefix(ffiImport); + final type = PointerType(objCObjectType).getCType(context); + final symbol = Namer.stringLiteral('OBJC_CLASS_\$_$lookupName'); + final getClass = ObjCBuiltInFunctions.getClass.gen(context); + final address = '$ffi.Native.addressOf<$type>(${rawSymbol.name})'; + final s = + ''' +@$ffi.Native<$type>(symbol: '$symbol') +external $type ${rawSymbol.name}; +final $name = $getClass("$lookupName", () => $address.cast()); +'''; + return BindingString(type: BindingStringType.global, string: s); + } + + @override + void visitChildren(Visitor visitor) { + super.visitChildren(visitor); + visitor.visit(ffiImport); + visitor.visit(objcPkgImport); + visitor.visit(objCObjectType); + visitor.visit(rawSymbol); + } +} + +/// A global variable for an ObjC protocol, loaded via @Native. +class ObjCProtocolGlobal extends NoLookUpBinding { + final String loaderName; + final String lookupName; + final Symbol rawSymbol; + ObjCProtocolGlobal(String name, this.lookupName, this.loaderName) + : rawSymbol = Symbol('${name}_raw', SymbolKind.field), + super( + originalName: name, + symbol: Symbol(name, SymbolKind.field), + isInternal: true, + ); + + @override + BindingString toBindingString(Writer w) { + final context = w.context; + final ffi = context.libs.prefix(ffiImport); + final ptrType = PointerType(objCProtocolType).getCType(context); + final getProtocol = ObjCBuiltInFunctions.getProtocol.gen(context); + final s = + ''' +@$ffi.Native<$ptrType Function()>(symbol: '$loaderName') +external $ptrType ${rawSymbol.name}(); +final $name = $getProtocol("$lookupName", ${rawSymbol.name}); +'''; + return BindingString(type: BindingStringType.global, string: s); + } + + @override + void visitChildren(Visitor visitor) { + super.visitChildren(visitor); + visitor.visit(ffiImport); + visitor.visit(objcPkgImport); + visitor.visit(objCProtocolType); + visitor.visit(rawSymbol); + } +} + enum ObjCMsgSendVariant { normal(ObjCBuiltInFunctions.msgSendPointer), stret(ObjCBuiltInFunctions.msgSendStretPointer), diff --git a/pkgs/ffigen/lib/src/code_generator/objc_category.dart b/pkgs/ffigen/lib/src/code_generator/objc_category.dart index 0b0ecad469..9dc5235389 100644 --- a/pkgs/ffigen/lib/src/code_generator/objc_category.dart +++ b/pkgs/ffigen/lib/src/code_generator/objc_category.dart @@ -15,7 +15,7 @@ class ObjCCategory extends NoLookUpBinding with ObjCMethods, HasLocalScope { @override final Context context; final ObjCInterface parent; - final ObjCInternalGlobal classObject; + final NoLookUpBinding classObject; final protocols = []; diff --git a/pkgs/ffigen/lib/src/code_generator/objc_interface.dart b/pkgs/ffigen/lib/src/code_generator/objc_interface.dart index 7d00c4ec3a..b0fae50f93 100644 --- a/pkgs/ffigen/lib/src/code_generator/objc_interface.dart +++ b/pkgs/ffigen/lib/src/code_generator/objc_interface.dart @@ -18,7 +18,7 @@ class ObjCInterface extends BindingType with ObjCMethods, HasLocalScope { bool filled = false; final String lookupName; - late final ObjCInternalGlobal classObject; + late final NoLookUpBinding classObject; late final ObjCInternalGlobal _isKindOfClass; late final ObjCMsgSendFunc _isKindOfClassMsgSend; final protocols = []; @@ -46,10 +46,7 @@ class ObjCInterface extends BindingType with ObjCMethods, HasLocalScope { name ?? originalName, ) { - classObject = ObjCInternalGlobal( - '_class_$originalName', - () => '${ObjCBuiltInFunctions.getClass.gen(context)}("$lookupName")', - ); + classObject = ObjCClassGlobal('_class_$originalName', this.lookupName); _isKindOfClass = context.objCBuiltInFunctions.getSelObject( 'isKindOfClass:', ); diff --git a/pkgs/ffigen/lib/src/code_generator/objc_protocol.dart b/pkgs/ffigen/lib/src/code_generator/objc_protocol.dart index 2a32eabccd..a6d1d2dcd4 100644 --- a/pkgs/ffigen/lib/src/code_generator/objc_protocol.dart +++ b/pkgs/ffigen/lib/src/code_generator/objc_protocol.dart @@ -16,7 +16,7 @@ class ObjCProtocol extends BindingType with ObjCMethods, HasLocalScope { final Context context; final superProtocols = []; final String lookupName; - final ObjCInternalGlobal _protocolPointer; + final NoLookUpBinding _protocolPointer; late final ObjCInternalGlobal _conformsTo; late final ObjCMsgSendFunc _conformsToMsgSend; final ApiAvailability apiAvailability; @@ -33,10 +33,10 @@ class ObjCProtocol extends BindingType with ObjCMethods, HasLocalScope { required this.apiAvailability, required this.context, }) : lookupName = lookupName ?? originalName, - _protocolPointer = ObjCInternalGlobal( + _protocolPointer = ObjCProtocolGlobal( '_protocol_$originalName', - () => - '${ObjCBuiltInFunctions.getProtocol.gen(context)}("$lookupName")', + lookupName ?? originalName, + '_${context.objCBuiltInFunctions.libraryId}_$originalName', ), super( name: @@ -337,6 +337,7 @@ ${generateInstanceMethodBindings(w, this)} final mainString = ''' +__attribute__((visibility("default"))) __attribute__((used)) Protocol* _${libraryId}_$originalName(void) { return @protocol($originalName); } '''; diff --git a/pkgs/ffigen/test/example_tests/swift_example_test.dart b/pkgs/ffigen/test/example_tests/swift_example_test.dart index 1ac866c46c..147a7a4d8e 100644 --- a/pkgs/ffigen/test/example_tests/swift_example_test.dart +++ b/pkgs/ffigen/test/example_tests/swift_example_test.dart @@ -59,15 +59,7 @@ void main() { expect(actual, contains('set someField(int value) {')); // Verify that SwiftClass is loaded using the swift_module prefix. - expect( - actual, - contains( - RegExp( - r'late final _class_SwiftClass.* = ' - r'objc.getClass.*\("swift_module\.SwiftClass"\)', - ), - ), - ); + expect(actual, contains(r'OBJC_CLASS_\$_swift_module.SwiftClass')); return true; }, diff --git a/pkgs/ffigen/test/native_objc_test/arc_test_bindings.dart b/pkgs/ffigen/test/native_objc_test/arc_test_bindings.dart index bd0f84b8b5..0d34f99d62 100644 --- a/pkgs/ffigen/test/native_objc_test/arc_test_bindings.dart +++ b/pkgs/ffigen/test/native_objc_test/arc_test_bindings.dart @@ -364,8 +364,26 @@ extension ArcTestObject$Methods on ArcTestObject { } } -late final _class_ArcDtorTestObject = objc.getClass("ArcDtorTestObject"); -late final _class_ArcTestObject = objc.getClass("ArcTestObject"); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_ArcDtorTestObject', +) +external ffi.Pointer _class_ArcDtorTestObject_raw; +final _class_ArcDtorTestObject = objc.getClass( + "ArcDtorTestObject", + () => ffi.Native.addressOf>( + _class_ArcDtorTestObject_raw, + ).cast(), +); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_ArcTestObject', +) +external ffi.Pointer _class_ArcTestObject_raw; +final _class_ArcTestObject = objc.getClass( + "ArcTestObject", + () => ffi.Native.addressOf>( + _class_ArcTestObject_raw, + ).cast(), +); final _objc_msgSend_129vhbw = objc.msgSendPointer .cast< ffi.NativeFunction< diff --git a/pkgs/ffigen/test/native_objc_test/bad_method_test_bindings.dart b/pkgs/ffigen/test/native_objc_test/bad_method_test_bindings.dart index 9adaafcc63..7f7f949d40 100644 --- a/pkgs/ffigen/test/native_objc_test/bad_method_test_bindings.dart +++ b/pkgs/ffigen/test/native_objc_test/bad_method_test_bindings.dart @@ -112,7 +112,16 @@ final class BitField extends ffi.Opaque {} final class IncompleteStruct extends ffi.Opaque {} -late final _class_BadMethodTestObject = objc.getClass("BadMethodTestObject"); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_BadMethodTestObject', +) +external ffi.Pointer _class_BadMethodTestObject_raw; +final _class_BadMethodTestObject = objc.getClass( + "BadMethodTestObject", + () => ffi.Native.addressOf>( + _class_BadMethodTestObject_raw, + ).cast(), +); final _objc_msgSend_151sglz = objc.msgSendPointer .cast< ffi.NativeFunction< diff --git a/pkgs/ffigen/test/native_objc_test/bad_override_test_bindings.dart b/pkgs/ffigen/test/native_objc_test/bad_override_test_bindings.dart index 6ee57f2d0a..f65df3bfba 100644 --- a/pkgs/ffigen/test/native_objc_test/bad_override_test_bindings.dart +++ b/pkgs/ffigen/test/native_objc_test/bad_override_test_bindings.dart @@ -879,21 +879,108 @@ extension Triangle$Methods on Triangle { } } -late final _class_BadOverrideAunt = objc.getClass("BadOverrideAunt"); -late final _class_BadOverrideChild = objc.getClass("BadOverrideChild"); -late final _class_BadOverrideGrandchild = objc.getClass( +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_BadOverrideAunt', +) +external ffi.Pointer _class_BadOverrideAunt_raw; +final _class_BadOverrideAunt = objc.getClass( + "BadOverrideAunt", + () => ffi.Native.addressOf>( + _class_BadOverrideAunt_raw, + ).cast(), +); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_BadOverrideChild', +) +external ffi.Pointer _class_BadOverrideChild_raw; +final _class_BadOverrideChild = objc.getClass( + "BadOverrideChild", + () => ffi.Native.addressOf>( + _class_BadOverrideChild_raw, + ).cast(), +); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_BadOverrideGrandchild', +) +external ffi.Pointer _class_BadOverrideGrandchild_raw; +final _class_BadOverrideGrandchild = objc.getClass( "BadOverrideGrandchild", + () => ffi.Native.addressOf>( + _class_BadOverrideGrandchild_raw, + ).cast(), ); -late final _class_BadOverrideGrandparent = objc.getClass( +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_BadOverrideGrandparent', +) +external ffi.Pointer _class_BadOverrideGrandparent_raw; +final _class_BadOverrideGrandparent = objc.getClass( "BadOverrideGrandparent", + () => ffi.Native.addressOf>( + _class_BadOverrideGrandparent_raw, + ).cast(), +); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_BadOverrideParent', +) +external ffi.Pointer _class_BadOverrideParent_raw; +final _class_BadOverrideParent = objc.getClass( + "BadOverrideParent", + () => ffi.Native.addressOf>( + _class_BadOverrideParent_raw, + ).cast(), +); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_BadOverrideSibbling', +) +external ffi.Pointer _class_BadOverrideSibbling_raw; +final _class_BadOverrideSibbling = objc.getClass( + "BadOverrideSibbling", + () => ffi.Native.addressOf>( + _class_BadOverrideSibbling_raw, + ).cast(), +); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_BadOverrideUncle', +) +external ffi.Pointer _class_BadOverrideUncle_raw; +final _class_BadOverrideUncle = objc.getClass( + "BadOverrideUncle", + () => ffi.Native.addressOf>( + _class_BadOverrideUncle_raw, + ).cast(), +); +@ffi.Native>(symbol: 'OBJC_CLASS_\$_Polygon') +external ffi.Pointer _class_Polygon_raw; +final _class_Polygon = objc.getClass( + "Polygon", + () => ffi.Native.addressOf>( + _class_Polygon_raw, + ).cast(), +); +@ffi.Native>(symbol: 'OBJC_CLASS_\$_Rectangle') +external ffi.Pointer _class_Rectangle_raw; +final _class_Rectangle = objc.getClass( + "Rectangle", + () => ffi.Native.addressOf>( + _class_Rectangle_raw, + ).cast(), +); +@ffi.Native>(symbol: 'OBJC_CLASS_\$_Square') +external ffi.Pointer _class_Square_raw; +final _class_Square = objc.getClass( + "Square", + () => ffi.Native.addressOf>( + _class_Square_raw, + ).cast(), +); +@ffi.Native>(symbol: 'OBJC_CLASS_\$_Triangle') +external ffi.Pointer _class_Triangle_raw; +final _class_Triangle = objc.getClass( + "Triangle", + () => ffi.Native.addressOf>( + _class_Triangle_raw, + ).cast(), ); -late final _class_BadOverrideParent = objc.getClass("BadOverrideParent"); -late final _class_BadOverrideSibbling = objc.getClass("BadOverrideSibbling"); -late final _class_BadOverrideUncle = objc.getClass("BadOverrideUncle"); -late final _class_Polygon = objc.getClass("Polygon"); -late final _class_Rectangle = objc.getClass("Rectangle"); -late final _class_Square = objc.getClass("Square"); -late final _class_Triangle = objc.getClass("Triangle"); final _objc_msgSend_151sglz = objc.msgSendPointer .cast< ffi.NativeFunction< diff --git a/pkgs/ffigen/test/native_objc_test/block_annotation_test_bindings.dart b/pkgs/ffigen/test/native_objc_test/block_annotation_test_bindings.dart index 80e46f5171..65701f063e 100644 --- a/pkgs/ffigen/test/native_objc_test/block_annotation_test_bindings.dart +++ b/pkgs/ffigen/test/native_objc_test/block_annotation_test_bindings.dart @@ -3163,9 +3163,34 @@ extension ObjCBlock_ffiVoid_ffiVoid_EmptyObject$1$CallExtension >()(ref.pointer, arg0, arg1.ref.retainAndReturnPointer()); } -late final _class_BlockAnnotationTest = objc.getClass("BlockAnnotationTest"); -late final _class_EmptyObject = objc.getClass("EmptyObject"); -late final _class_NSThread = objc.getClass("NSThread"); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_BlockAnnotationTest', +) +external ffi.Pointer _class_BlockAnnotationTest_raw; +final _class_BlockAnnotationTest = objc.getClass( + "BlockAnnotationTest", + () => ffi.Native.addressOf>( + _class_BlockAnnotationTest_raw, + ).cast(), +); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_EmptyObject', +) +external ffi.Pointer _class_EmptyObject_raw; +final _class_EmptyObject = objc.getClass( + "EmptyObject", + () => ffi.Native.addressOf>( + _class_EmptyObject_raw, + ).cast(), +); +@ffi.Native>(symbol: 'OBJC_CLASS_\$_NSThread') +external ffi.Pointer _class_NSThread_raw; +final _class_NSThread = objc.getClass( + "NSThread", + () => ffi.Native.addressOf>( + _class_NSThread_raw, + ).cast(), +); final _objc_msgSend_151sglz = objc.msgSendPointer .cast< ffi.NativeFunction< @@ -3566,8 +3591,14 @@ final _objc_msgSend_xw2lbc = objc.msgSendPointer ffi.Pointer, ) >(); -late final _protocol_BlockAnnotationTestProtocol = objc.getProtocol( +@ffi.Native Function()>( + symbol: '_z0xonr_BlockAnnotationTestProtocol', +) +external ffi.Pointer +_protocol_BlockAnnotationTestProtocol_raw(); +final _protocol_BlockAnnotationTestProtocol = objc.getProtocol( "BlockAnnotationTestProtocol", + _protocol_BlockAnnotationTestProtocol_raw, ); late final _sel_alloc = objc.registerName("alloc"); late final _sel_allocWithZone_ = objc.registerName("allocWithZone:"); diff --git a/pkgs/ffigen/test/native_objc_test/block_annotation_test_bindings.m b/pkgs/ffigen/test/native_objc_test/block_annotation_test_bindings.m index 85c977c9ec..f52b46c20d 100644 --- a/pkgs/ffigen/test/native_objc_test/block_annotation_test_bindings.m +++ b/pkgs/ffigen/test/native_objc_test/block_annotation_test_bindings.m @@ -49,6 +49,7 @@ }; +__attribute__((visibility("default"))) __attribute__((used)) Protocol* _z0xonr_BlockAnnotationTestProtocol(void) { return @protocol(BlockAnnotationTestProtocol); } typedef id (^_ProtocolTrampoline)(void * sel); diff --git a/pkgs/ffigen/test/native_objc_test/block_inherit_test_bindings.dart b/pkgs/ffigen/test/native_objc_test/block_inherit_test_bindings.dart index 873bd0d2a1..ebb7b78ee5 100644 --- a/pkgs/ffigen/test/native_objc_test/block_inherit_test_bindings.dart +++ b/pkgs/ffigen/test/native_objc_test/block_inherit_test_bindings.dart @@ -812,12 +812,42 @@ typedef ReturnMammal = ffi.Pointer; typedef DartReturnMammal = objc.ObjCBlock; typedef ReturnPlatypus = ffi.Pointer; typedef DartReturnPlatypus = objc.ObjCBlock; -late final _class_BlockInheritTestBase = objc.getClass("BlockInheritTestBase"); -late final _class_BlockInheritTestChild = objc.getClass( +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_BlockInheritTestBase', +) +external ffi.Pointer _class_BlockInheritTestBase_raw; +final _class_BlockInheritTestBase = objc.getClass( + "BlockInheritTestBase", + () => ffi.Native.addressOf>( + _class_BlockInheritTestBase_raw, + ).cast(), +); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_BlockInheritTestChild', +) +external ffi.Pointer _class_BlockInheritTestChild_raw; +final _class_BlockInheritTestChild = objc.getClass( "BlockInheritTestChild", + () => ffi.Native.addressOf>( + _class_BlockInheritTestChild_raw, + ).cast(), +); +@ffi.Native>(symbol: 'OBJC_CLASS_\$_Mammal') +external ffi.Pointer _class_Mammal_raw; +final _class_Mammal = objc.getClass( + "Mammal", + () => ffi.Native.addressOf>( + _class_Mammal_raw, + ).cast(), +); +@ffi.Native>(symbol: 'OBJC_CLASS_\$_Platypus') +external ffi.Pointer _class_Platypus_raw; +final _class_Platypus = objc.getClass( + "Platypus", + () => ffi.Native.addressOf>( + _class_Platypus_raw, + ).cast(), ); -late final _class_Mammal = objc.getClass("Mammal"); -late final _class_Platypus = objc.getClass("Platypus"); final _objc_msgSend_151sglz = objc.msgSendPointer .cast< ffi.NativeFunction< diff --git a/pkgs/ffigen/test/native_objc_test/block_test_bindings.dart b/pkgs/ffigen/test/native_objc_test/block_test_bindings.dart index dd59565495..582d4fdb5b 100644 --- a/pkgs/ffigen/test/native_objc_test/block_test_bindings.dart +++ b/pkgs/ffigen/test/native_objc_test/block_test_bindings.dart @@ -4533,9 +4533,34 @@ typedef Vec4Block = ffi.Pointer; typedef DartVec4Block = objc.ObjCBlock; typedef VoidBlock = ffi.Pointer; typedef DartVoidBlock = objc.ObjCBlock; -late final _class_BlockTester = objc.getClass("BlockTester"); -late final _class_DummyObject = objc.getClass("DummyObject"); -late final _class_NSThread = objc.getClass("NSThread"); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_BlockTester', +) +external ffi.Pointer _class_BlockTester_raw; +final _class_BlockTester = objc.getClass( + "BlockTester", + () => ffi.Native.addressOf>( + _class_BlockTester_raw, + ).cast(), +); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_DummyObject', +) +external ffi.Pointer _class_DummyObject_raw; +final _class_DummyObject = objc.getClass( + "DummyObject", + () => ffi.Native.addressOf>( + _class_DummyObject_raw, + ).cast(), +); +@ffi.Native>(symbol: 'OBJC_CLASS_\$_NSThread') +external ffi.Pointer _class_NSThread_raw; +final _class_NSThread = objc.getClass( + "NSThread", + () => ffi.Native.addressOf>( + _class_NSThread_raw, + ).cast(), +); final _objc_msgSend_129vhbw = objc.msgSendPointer .cast< ffi.NativeFunction< diff --git a/pkgs/ffigen/test/native_objc_test/cast_test_bindings.dart b/pkgs/ffigen/test/native_objc_test/cast_test_bindings.dart index 0a5c68d647..cba604f6ee 100644 --- a/pkgs/ffigen/test/native_objc_test/cast_test_bindings.dart +++ b/pkgs/ffigen/test/native_objc_test/cast_test_bindings.dart @@ -85,7 +85,14 @@ extension Castaway$Methods on Castaway { } } -late final _class_Castaway = objc.getClass("Castaway"); +@ffi.Native>(symbol: 'OBJC_CLASS_\$_Castaway') +external ffi.Pointer _class_Castaway_raw; +final _class_Castaway = objc.getClass( + "Castaway", + () => ffi.Native.addressOf>( + _class_Castaway_raw, + ).cast(), +); final _objc_msgSend_151sglz = objc.msgSendPointer .cast< ffi.NativeFunction< diff --git a/pkgs/ffigen/test/native_objc_test/category_test_bindings.dart b/pkgs/ffigen/test/native_objc_test/category_test_bindings.dart index 1cc525d533..4693515268 100644 --- a/pkgs/ffigen/test/native_objc_test/category_test_bindings.dart +++ b/pkgs/ffigen/test/native_objc_test/category_test_bindings.dart @@ -1274,11 +1274,50 @@ extension Thing$Methods on Thing { } } -late final _class_ChildOfNSString = objc.getClass("ChildOfNSString"); -late final _class_ChildOfThing = objc.getClass("ChildOfThing"); -late final _class_NSString = objc.getClass("NSString"); -late final _class_NSURL = objc.getClass("NSURL"); -late final _class_Thing = objc.getClass("Thing"); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_ChildOfNSString', +) +external ffi.Pointer _class_ChildOfNSString_raw; +final _class_ChildOfNSString = objc.getClass( + "ChildOfNSString", + () => ffi.Native.addressOf>( + _class_ChildOfNSString_raw, + ).cast(), +); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_ChildOfThing', +) +external ffi.Pointer _class_ChildOfThing_raw; +final _class_ChildOfThing = objc.getClass( + "ChildOfThing", + () => ffi.Native.addressOf>( + _class_ChildOfThing_raw, + ).cast(), +); +@ffi.Native>(symbol: 'OBJC_CLASS_\$_NSString') +external ffi.Pointer _class_NSString_raw; +final _class_NSString = objc.getClass( + "NSString", + () => ffi.Native.addressOf>( + _class_NSString_raw, + ).cast(), +); +@ffi.Native>(symbol: 'OBJC_CLASS_\$_NSURL') +external ffi.Pointer _class_NSURL_raw; +final _class_NSURL = objc.getClass( + "NSURL", + () => ffi.Native.addressOf>( + _class_NSURL_raw, + ).cast(), +); +@ffi.Native>(symbol: 'OBJC_CLASS_\$_Thing') +external ffi.Pointer _class_Thing_raw; +final _class_Thing = objc.getClass( + "Thing", + () => ffi.Native.addressOf>( + _class_Thing_raw, + ).cast(), +); final _objc_msgSend_151sglz = objc.msgSendPointer .cast< ffi.NativeFunction< diff --git a/pkgs/ffigen/test/native_objc_test/enum_test_bindings.dart b/pkgs/ffigen/test/native_objc_test/enum_test_bindings.dart index bd87e4daa6..f371485d3b 100644 --- a/pkgs/ffigen/test/native_objc_test/enum_test_bindings.dart +++ b/pkgs/ffigen/test/native_objc_test/enum_test_bindings.dart @@ -121,7 +121,16 @@ const int SOME_MACRO = 123; const int UnnamedEnumValue = 0; -late final _class_EnumTestInterface = objc.getClass("EnumTestInterface"); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_EnumTestInterface', +) +external ffi.Pointer _class_EnumTestInterface_raw; +final _class_EnumTestInterface = objc.getClass( + "EnumTestInterface", + () => ffi.Native.addressOf>( + _class_EnumTestInterface_raw, + ).cast(), +); final _objc_msgSend_151sglz = objc.msgSendPointer .cast< ffi.NativeFunction< diff --git a/pkgs/ffigen/test/native_objc_test/error_method_test_bindings.dart b/pkgs/ffigen/test/native_objc_test/error_method_test_bindings.dart index 301e88ff90..994f7ddac3 100644 --- a/pkgs/ffigen/test/native_objc_test/error_method_test_bindings.dart +++ b/pkgs/ffigen/test/native_objc_test/error_method_test_bindings.dart @@ -163,8 +163,15 @@ extension ErrorMethodTestObject$Methods on ErrorMethodTestObject { } } -late final _class_ErrorMethodTestObject = objc.getClass( +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_ErrorMethodTestObject', +) +external ffi.Pointer _class_ErrorMethodTestObject_raw; +final _class_ErrorMethodTestObject = objc.getClass( "ErrorMethodTestObject", + () => ffi.Native.addressOf>( + _class_ErrorMethodTestObject_raw, + ).cast(), ); final _objc_msgSend_151sglz = objc.msgSendPointer .cast< diff --git a/pkgs/ffigen/test/native_objc_test/failed_to_load_test_bindings.dart b/pkgs/ffigen/test/native_objc_test/failed_to_load_test_bindings.dart index 89ba4b8a66..fb54759bde 100644 --- a/pkgs/ffigen/test/native_objc_test/failed_to_load_test_bindings.dart +++ b/pkgs/ffigen/test/native_objc_test/failed_to_load_test_bindings.dart @@ -101,8 +101,15 @@ extension ClassThatWillFailToLoad$Methods on ClassThatWillFailToLoad { } } -late final _class_ClassThatWillFailToLoad = objc.getClass( +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_ClassThatWillFailToLoad', +) +external ffi.Pointer _class_ClassThatWillFailToLoad_raw; +final _class_ClassThatWillFailToLoad = objc.getClass( "ClassThatWillFailToLoad", + () => ffi.Native.addressOf>( + _class_ClassThatWillFailToLoad_raw, + ).cast(), ); final _objc_msgSend_151sglz = objc.msgSendPointer .cast< diff --git a/pkgs/ffigen/test/native_objc_test/forward_decl_test_bindings.dart b/pkgs/ffigen/test/native_objc_test/forward_decl_test_bindings.dart index 26d0f5298b..691a35d055 100644 --- a/pkgs/ffigen/test/native_objc_test/forward_decl_test_bindings.dart +++ b/pkgs/ffigen/test/native_objc_test/forward_decl_test_bindings.dart @@ -79,7 +79,16 @@ extension ForwardDeclaredClass$Methods on ForwardDeclaredClass { } } -late final _class_ForwardDeclaredClass = objc.getClass("ForwardDeclaredClass"); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_ForwardDeclaredClass', +) +external ffi.Pointer _class_ForwardDeclaredClass_raw; +final _class_ForwardDeclaredClass = objc.getClass( + "ForwardDeclaredClass", + () => ffi.Native.addressOf>( + _class_ForwardDeclaredClass_raw, + ).cast(), +); final _objc_msgSend_151sglz = objc.msgSendPointer .cast< ffi.NativeFunction< diff --git a/pkgs/ffigen/test/native_objc_test/inherited_instancetype_test_bindings.dart b/pkgs/ffigen/test/native_objc_test/inherited_instancetype_test_bindings.dart index 1a3eb453ca..ddbc6965e4 100644 --- a/pkgs/ffigen/test/native_objc_test/inherited_instancetype_test_bindings.dart +++ b/pkgs/ffigen/test/native_objc_test/inherited_instancetype_test_bindings.dart @@ -176,8 +176,24 @@ extension ChildClass$Methods on ChildClass { } } -late final _class_BaseClass = objc.getClass("BaseClass"); -late final _class_ChildClass = objc.getClass("ChildClass"); +@ffi.Native>(symbol: 'OBJC_CLASS_\$_BaseClass') +external ffi.Pointer _class_BaseClass_raw; +final _class_BaseClass = objc.getClass( + "BaseClass", + () => ffi.Native.addressOf>( + _class_BaseClass_raw, + ).cast(), +); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_ChildClass', +) +external ffi.Pointer _class_ChildClass_raw; +final _class_ChildClass = objc.getClass( + "ChildClass", + () => ffi.Native.addressOf>( + _class_ChildClass_raw, + ).cast(), +); final _objc_msgSend_151sglz = objc.msgSendPointer .cast< ffi.NativeFunction< diff --git a/pkgs/ffigen/test/native_objc_test/is_instance_test_bindings.dart b/pkgs/ffigen/test/native_objc_test/is_instance_test_bindings.dart index fa615a6a28..943b989b69 100644 --- a/pkgs/ffigen/test/native_objc_test/is_instance_test_bindings.dart +++ b/pkgs/ffigen/test/native_objc_test/is_instance_test_bindings.dart @@ -232,10 +232,35 @@ extension IsInstanceUnrelatedClass$Methods on IsInstanceUnrelatedClass { } } -late final _class_IsInstanceBaseClass = objc.getClass("IsInstanceBaseClass"); -late final _class_IsInstanceChildClass = objc.getClass("IsInstanceChildClass"); -late final _class_IsInstanceUnrelatedClass = objc.getClass( +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_IsInstanceBaseClass', +) +external ffi.Pointer _class_IsInstanceBaseClass_raw; +final _class_IsInstanceBaseClass = objc.getClass( + "IsInstanceBaseClass", + () => ffi.Native.addressOf>( + _class_IsInstanceBaseClass_raw, + ).cast(), +); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_IsInstanceChildClass', +) +external ffi.Pointer _class_IsInstanceChildClass_raw; +final _class_IsInstanceChildClass = objc.getClass( + "IsInstanceChildClass", + () => ffi.Native.addressOf>( + _class_IsInstanceChildClass_raw, + ).cast(), +); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_IsInstanceUnrelatedClass', +) +external ffi.Pointer _class_IsInstanceUnrelatedClass_raw; +final _class_IsInstanceUnrelatedClass = objc.getClass( "IsInstanceUnrelatedClass", + () => ffi.Native.addressOf>( + _class_IsInstanceUnrelatedClass_raw, + ).cast(), ); final _objc_msgSend_151sglz = objc.msgSendPointer .cast< diff --git a/pkgs/ffigen/test/native_objc_test/isolate_test_bindings.dart b/pkgs/ffigen/test/native_objc_test/isolate_test_bindings.dart index caca893f90..8a6e1cd801 100644 --- a/pkgs/ffigen/test/native_objc_test/isolate_test_bindings.dart +++ b/pkgs/ffigen/test/native_objc_test/isolate_test_bindings.dart @@ -333,7 +333,14 @@ extension Sendable$Methods on Sendable { } } -late final _class_Sendable = objc.getClass("Sendable"); +@ffi.Native>(symbol: 'OBJC_CLASS_\$_Sendable') +external ffi.Pointer _class_Sendable_raw; +final _class_Sendable = objc.getClass( + "Sendable", + () => ffi.Native.addressOf>( + _class_Sendable_raw, + ).cast(), +); final _objc_msgSend_151sglz = objc.msgSendPointer .cast< ffi.NativeFunction< diff --git a/pkgs/ffigen/test/native_objc_test/log_test_bindings.dart b/pkgs/ffigen/test/native_objc_test/log_test_bindings.dart index 8d8ca71b50..5976d222fd 100644 --- a/pkgs/ffigen/test/native_objc_test/log_test_bindings.dart +++ b/pkgs/ffigen/test/native_objc_test/log_test_bindings.dart @@ -170,8 +170,26 @@ extension LogSpamChildClass$Methods on LogSpamChildClass { } } -late final _class_LogSpamBaseClass = objc.getClass("LogSpamBaseClass"); -late final _class_LogSpamChildClass = objc.getClass("LogSpamChildClass"); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_LogSpamBaseClass', +) +external ffi.Pointer _class_LogSpamBaseClass_raw; +final _class_LogSpamBaseClass = objc.getClass( + "LogSpamBaseClass", + () => ffi.Native.addressOf>( + _class_LogSpamBaseClass_raw, + ).cast(), +); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_LogSpamChildClass', +) +external ffi.Pointer _class_LogSpamChildClass_raw; +final _class_LogSpamChildClass = objc.getClass( + "LogSpamChildClass", + () => ffi.Native.addressOf>( + _class_LogSpamChildClass_raw, + ).cast(), +); final _objc_msgSend_151sglz = objc.msgSendPointer .cast< ffi.NativeFunction< diff --git a/pkgs/ffigen/test/native_objc_test/method_filtering_test_bindings.dart b/pkgs/ffigen/test/native_objc_test/method_filtering_test_bindings.dart index bf6a623478..ade0cb0771 100644 --- a/pkgs/ffigen/test/native_objc_test/method_filtering_test_bindings.dart +++ b/pkgs/ffigen/test/native_objc_test/method_filtering_test_bindings.dart @@ -314,8 +314,16 @@ extension ObjCBlock_instancetype_ffiVoid$CallExtension ); } -late final _class_MethodFilteringTestInterface = objc.getClass( +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_MethodFilteringTestInterface', +) +external ffi.Pointer +_class_MethodFilteringTestInterface_raw; +final _class_MethodFilteringTestInterface = objc.getClass( "MethodFilteringTestInterface", + () => ffi.Native.addressOf>( + _class_MethodFilteringTestInterface_raw, + ).cast(), ); final _objc_msgSend_151sglz = objc.msgSendPointer .cast< @@ -385,8 +393,14 @@ final _objc_msgSend_e3qsqz = objc.msgSendPointer ffi.Pointer, ) >(); -late final _protocol_MethodFilteringTestProtocol = objc.getProtocol( +@ffi.Native Function()>( + symbol: '_n85dd5_MethodFilteringTestProtocol', +) +external ffi.Pointer +_protocol_MethodFilteringTestProtocol_raw(); +final _protocol_MethodFilteringTestProtocol = objc.getProtocol( "MethodFilteringTestProtocol", + _protocol_MethodFilteringTestProtocol_raw, ); late final _sel_conformsToProtocol_ = objc.registerName("conformsToProtocol:"); late final _sel_includedInstanceMethod_with_ = objc.registerName( diff --git a/pkgs/ffigen/test/native_objc_test/method_filtering_test_bindings.m b/pkgs/ffigen/test/native_objc_test/method_filtering_test_bindings.m index 419697a49f..efb5a86fce 100644 --- a/pkgs/ffigen/test/native_objc_test/method_filtering_test_bindings.m +++ b/pkgs/ffigen/test/native_objc_test/method_filtering_test_bindings.m @@ -49,6 +49,7 @@ }; +__attribute__((visibility("default"))) __attribute__((used)) Protocol* _n85dd5_MethodFilteringTestProtocol(void) { return @protocol(MethodFilteringTestProtocol); } typedef id (^_ProtocolTrampoline)(void * sel); diff --git a/pkgs/ffigen/test/native_objc_test/method_test_bindings.dart b/pkgs/ffigen/test/native_objc_test/method_test_bindings.dart index a5a6c35713..b4df031b7a 100644 --- a/pkgs/ffigen/test/native_objc_test/method_test_bindings.dart +++ b/pkgs/ffigen/test/native_objc_test/method_test_bindings.dart @@ -212,7 +212,16 @@ final class Vec4 extends ffi.Struct { ..ref.w = w; } -late final _class_MethodInterface = objc.getClass("MethodInterface"); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_MethodInterface', +) +external ffi.Pointer _class_MethodInterface_raw; +final _class_MethodInterface = objc.getClass( + "MethodInterface", + () => ffi.Native.addressOf>( + _class_MethodInterface_raw, + ).cast(), +); final _objc_msgSend_151sglz = objc.msgSendPointer .cast< ffi.NativeFunction< diff --git a/pkgs/ffigen/test/native_objc_test/native_objc_test_bindings.dart b/pkgs/ffigen/test/native_objc_test/native_objc_test_bindings.dart index 902675e107..6d9d3519bf 100644 --- a/pkgs/ffigen/test/native_objc_test/native_objc_test_bindings.dart +++ b/pkgs/ffigen/test/native_objc_test/native_objc_test_bindings.dart @@ -162,7 +162,14 @@ extension Foo$Methods on Foo { } } -late final _class_Foo = objc.getClass("Foo"); +@ffi.Native>(symbol: 'OBJC_CLASS_\$_Foo') +external ffi.Pointer _class_Foo_raw; +final _class_Foo = objc.getClass( + "Foo", + () => ffi.Native.addressOf>( + _class_Foo_raw, + ).cast(), +); final _objc_msgSend_151sglz = objc.msgSendPointer .cast< ffi.NativeFunction< diff --git a/pkgs/ffigen/test/native_objc_test/nullable_inheritance_test_bindings.dart b/pkgs/ffigen/test/native_objc_test/nullable_inheritance_test_bindings.dart index 3976a18cd8..3d1ea907d6 100644 --- a/pkgs/ffigen/test/native_objc_test/nullable_inheritance_test_bindings.dart +++ b/pkgs/ffigen/test/native_objc_test/nullable_inheritance_test_bindings.dart @@ -284,9 +284,36 @@ extension NullableIntermediate$Methods on NullableIntermediate { } } -late final _class_NullableBase = objc.getClass("NullableBase"); -late final _class_NullableChild = objc.getClass("NullableChild"); -late final _class_NullableIntermediate = objc.getClass("NullableIntermediate"); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_NullableBase', +) +external ffi.Pointer _class_NullableBase_raw; +final _class_NullableBase = objc.getClass( + "NullableBase", + () => ffi.Native.addressOf>( + _class_NullableBase_raw, + ).cast(), +); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_NullableChild', +) +external ffi.Pointer _class_NullableChild_raw; +final _class_NullableChild = objc.getClass( + "NullableChild", + () => ffi.Native.addressOf>( + _class_NullableChild_raw, + ).cast(), +); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_NullableIntermediate', +) +external ffi.Pointer _class_NullableIntermediate_raw; +final _class_NullableIntermediate = objc.getClass( + "NullableIntermediate", + () => ffi.Native.addressOf>( + _class_NullableIntermediate_raw, + ).cast(), +); final _objc_msgSend_151sglz = objc.msgSendPointer .cast< ffi.NativeFunction< diff --git a/pkgs/ffigen/test/native_objc_test/nullable_test_bindings.dart b/pkgs/ffigen/test/native_objc_test/nullable_test_bindings.dart index 8ef5ef4898..5b3d5f4f11 100644 --- a/pkgs/ffigen/test/native_objc_test/nullable_test_bindings.dart +++ b/pkgs/ffigen/test/native_objc_test/nullable_test_bindings.dart @@ -163,7 +163,16 @@ extension NullableInterface$Methods on NullableInterface { } } -late final _class_NullableInterface = objc.getClass("NullableInterface"); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_NullableInterface', +) +external ffi.Pointer _class_NullableInterface_raw; +final _class_NullableInterface = objc.getClass( + "NullableInterface", + () => ffi.Native.addressOf>( + _class_NullableInterface_raw, + ).cast(), +); final _objc_msgSend_11spmsz = objc.msgSendPointer .cast< ffi.NativeFunction< diff --git a/pkgs/ffigen/test/native_objc_test/property_test_bindings.dart b/pkgs/ffigen/test/native_objc_test/property_test_bindings.dart index f7e6aa06e1..7e114b7e65 100644 --- a/pkgs/ffigen/test/native_objc_test/property_test_bindings.dart +++ b/pkgs/ffigen/test/native_objc_test/property_test_bindings.dart @@ -241,7 +241,16 @@ final class Vec4 extends ffi.Struct { ..ref.w = w; } -late final _class_PropertyInterface = objc.getClass("PropertyInterface"); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_PropertyInterface', +) +external ffi.Pointer _class_PropertyInterface_raw; +final _class_PropertyInterface = objc.getClass( + "PropertyInterface", + () => ffi.Native.addressOf>( + _class_PropertyInterface_raw, + ).cast(), +); final _objc_msgSend_151sglz = objc.msgSendPointer .cast< ffi.NativeFunction< diff --git a/pkgs/ffigen/test/native_objc_test/protocol_test_bindings.dart b/pkgs/ffigen/test/native_objc_test/protocol_test_bindings.dart index eb2e33edb8..2097ea6518 100644 --- a/pkgs/ffigen/test/native_objc_test/protocol_test_bindings.dart +++ b/pkgs/ffigen/test/native_objc_test/protocol_test_bindings.dart @@ -3011,11 +3011,37 @@ interface class UnusedProtocol$Builder { ); } -late final _class_ObjCProtocolImpl = objc.getClass("ObjCProtocolImpl"); -late final _class_ObjCProtocolImplMissingMethod = objc.getClass( +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_ObjCProtocolImpl', +) +external ffi.Pointer _class_ObjCProtocolImpl_raw; +final _class_ObjCProtocolImpl = objc.getClass( + "ObjCProtocolImpl", + () => ffi.Native.addressOf>( + _class_ObjCProtocolImpl_raw, + ).cast(), +); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_ObjCProtocolImplMissingMethod', +) +external ffi.Pointer +_class_ObjCProtocolImplMissingMethod_raw; +final _class_ObjCProtocolImplMissingMethod = objc.getClass( "ObjCProtocolImplMissingMethod", + () => ffi.Native.addressOf>( + _class_ObjCProtocolImplMissingMethod_raw, + ).cast(), +); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_ProtocolConsumer', +) +external ffi.Pointer _class_ProtocolConsumer_raw; +final _class_ProtocolConsumer = objc.getClass( + "ProtocolConsumer", + () => ffi.Native.addressOf>( + _class_ProtocolConsumer_raw, + ).cast(), ); -late final _class_ProtocolConsumer = objc.getClass("ProtocolConsumer"); final _objc_msgSend_151sglz = objc.msgSendPointer .cast< ffi.NativeFunction< @@ -3241,10 +3267,38 @@ final _objc_msgSend_yhkuco = objc.msgSendPointer ffi.Pointer, ) >(); -late final _protocol_EmptyProtocol = objc.getProtocol("EmptyProtocol"); -late final _protocol_MyProtocol = objc.getProtocol("MyProtocol"); -late final _protocol_SecondaryProtocol = objc.getProtocol("SecondaryProtocol"); -late final _protocol_UnusedProtocol = objc.getProtocol("UnusedProtocol"); +@ffi.Native Function()>( + symbol: '_13hhotk_EmptyProtocol', +) +external ffi.Pointer _protocol_EmptyProtocol_raw(); +final _protocol_EmptyProtocol = objc.getProtocol( + "EmptyProtocol", + _protocol_EmptyProtocol_raw, +); +@ffi.Native Function()>( + symbol: '_13hhotk_MyProtocol', +) +external ffi.Pointer _protocol_MyProtocol_raw(); +final _protocol_MyProtocol = objc.getProtocol( + "MyProtocol", + _protocol_MyProtocol_raw, +); +@ffi.Native Function()>( + symbol: '_13hhotk_SecondaryProtocol', +) +external ffi.Pointer _protocol_SecondaryProtocol_raw(); +final _protocol_SecondaryProtocol = objc.getProtocol( + "SecondaryProtocol", + _protocol_SecondaryProtocol_raw, +); +@ffi.Native Function()>( + symbol: '_13hhotk_UnusedProtocol', +) +external ffi.Pointer _protocol_UnusedProtocol_raw(); +final _protocol_UnusedProtocol = objc.getProtocol( + "UnusedProtocol", + _protocol_UnusedProtocol_raw, +); late final _sel_alloc = objc.registerName("alloc"); late final _sel_allocWithZone_ = objc.registerName("allocWithZone:"); late final _sel_callBlockingMethodOnRandomThread_ = objc.registerName( diff --git a/pkgs/ffigen/test/native_objc_test/protocol_test_bindings.m b/pkgs/ffigen/test/native_objc_test/protocol_test_bindings.m index 2c5b9eea1b..c54d30af9f 100644 --- a/pkgs/ffigen/test/native_objc_test/protocol_test_bindings.m +++ b/pkgs/ffigen/test/native_objc_test/protocol_test_bindings.m @@ -49,8 +49,10 @@ }; +__attribute__((visibility("default"))) __attribute__((used)) Protocol* _13hhotk_EmptyProtocol(void) { return @protocol(EmptyProtocol); } +__attribute__((visibility("default"))) __attribute__((used)) Protocol* _13hhotk_MyProtocol(void) { return @protocol(MyProtocol); } typedef int32_t (^_ProtocolTrampoline)(void * sel); @@ -141,8 +143,10 @@ id _13hhotk_protocolTrampoline_1mbt9g9(id target, void * sel) { return ((_ProtocolTrampoline_6)((id (*)(id, SEL, SEL))objc_msgSend)(target, @selector(getDOBJCDartProtocolMethodForSelector:), sel))(sel); } +__attribute__((visibility("default"))) __attribute__((used)) Protocol* _13hhotk_SecondaryProtocol(void) { return @protocol(SecondaryProtocol); } +__attribute__((visibility("default"))) __attribute__((used)) Protocol* _13hhotk_UnusedProtocol(void) { return @protocol(UnusedProtocol); } #undef BLOCKING_BLOCK_IMPL diff --git a/pkgs/ffigen/test/native_objc_test/ref_count_test_bindings.dart b/pkgs/ffigen/test/native_objc_test/ref_count_test_bindings.dart index 39210fe062..593becb0cd 100644 --- a/pkgs/ffigen/test/native_objc_test/ref_count_test_bindings.dart +++ b/pkgs/ffigen/test/native_objc_test/ref_count_test_bindings.dart @@ -371,8 +371,26 @@ extension RefCounted$Methods on RefCounted { } } -late final _class_RefCountTestObject = objc.getClass("RefCountTestObject"); -late final _class_RefCounted = objc.getClass("RefCounted"); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_RefCountTestObject', +) +external ffi.Pointer _class_RefCountTestObject_raw; +final _class_RefCountTestObject = objc.getClass( + "RefCountTestObject", + () => ffi.Native.addressOf>( + _class_RefCountTestObject_raw, + ).cast(), +); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_RefCounted', +) +external ffi.Pointer _class_RefCounted_raw; +final _class_RefCounted = objc.getClass( + "RefCounted", + () => ffi.Native.addressOf>( + _class_RefCounted_raw, + ).cast(), +); final _objc_msgSend_129vhbw = objc.msgSendPointer .cast< ffi.NativeFunction< diff --git a/pkgs/ffigen/test/native_objc_test/rename_test_bindings.dart b/pkgs/ffigen/test/native_objc_test/rename_test_bindings.dart index 614426f501..0257413923 100644 --- a/pkgs/ffigen/test/native_objc_test/rename_test_bindings.dart +++ b/pkgs/ffigen/test/native_objc_test/rename_test_bindings.dart @@ -117,7 +117,14 @@ extension Renamed$Methods on Renamed { } } -late final _class__Renamed = objc.getClass("_Renamed"); +@ffi.Native>(symbol: 'OBJC_CLASS_\$__Renamed') +external ffi.Pointer _class__Renamed_raw; +final _class__Renamed = objc.getClass( + "_Renamed", + () => ffi.Native.addressOf>( + _class__Renamed_raw, + ).cast(), +); final _objc_msgSend_151sglz = objc.msgSendPointer .cast< ffi.NativeFunction< diff --git a/pkgs/ffigen/test/native_objc_test/runtime_version_test_bindings.dart b/pkgs/ffigen/test/native_objc_test/runtime_version_test_bindings.dart index 0bcb28ebf2..857bae393b 100644 --- a/pkgs/ffigen/test/native_objc_test/runtime_version_test_bindings.dart +++ b/pkgs/ffigen/test/native_objc_test/runtime_version_test_bindings.dart @@ -276,9 +276,34 @@ extension FutureAPIMethods$Methods on FutureAPIMethods { } } -late final _class_FutureAPIInterface = objc.getClass("FutureAPIInterface"); -late final _class_FutureAPIMethods = objc.getClass("FutureAPIMethods"); -late final _class_NSObject = objc.getClass("NSObject"); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_FutureAPIInterface', +) +external ffi.Pointer _class_FutureAPIInterface_raw; +final _class_FutureAPIInterface = objc.getClass( + "FutureAPIInterface", + () => ffi.Native.addressOf>( + _class_FutureAPIInterface_raw, + ).cast(), +); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_FutureAPIMethods', +) +external ffi.Pointer _class_FutureAPIMethods_raw; +final _class_FutureAPIMethods = objc.getClass( + "FutureAPIMethods", + () => ffi.Native.addressOf>( + _class_FutureAPIMethods_raw, + ).cast(), +); +@ffi.Native>(symbol: 'OBJC_CLASS_\$_NSObject') +external ffi.Pointer _class_NSObject_raw; +final _class_NSObject = objc.getClass( + "NSObject", + () => ffi.Native.addressOf>( + _class_NSObject_raw, + ).cast(), +); final _objc_msgSend_13yqbb6 = objc.msgSendPointer .cast< ffi.NativeFunction< diff --git a/pkgs/ffigen/test/native_objc_test/sdk_variable_test_bindings.dart b/pkgs/ffigen/test/native_objc_test/sdk_variable_test_bindings.dart index 8bf6d32f54..be2f8f27ba 100644 --- a/pkgs/ffigen/test/native_objc_test/sdk_variable_test_bindings.dart +++ b/pkgs/ffigen/test/native_objc_test/sdk_variable_test_bindings.dart @@ -1026,9 +1026,36 @@ extension type UIPickerViewDelegate._(objc.ObjCProtocol object$) }) : object$ = objc.ObjCProtocol(other, retain: retain, release: release); } -late final _class_NSColorPicker = objc.getClass("NSColorPicker"); -late final _class_NSTextList = objc.getClass("NSTextList"); -late final _class_UIPickerView = objc.getClass("UIPickerView"); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_NSColorPicker', +) +external ffi.Pointer _class_NSColorPicker_raw; +final _class_NSColorPicker = objc.getClass( + "NSColorPicker", + () => ffi.Native.addressOf>( + _class_NSColorPicker_raw, + ).cast(), +); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_NSTextList', +) +external ffi.Pointer _class_NSTextList_raw; +final _class_NSTextList = objc.getClass( + "NSTextList", + () => ffi.Native.addressOf>( + _class_NSTextList_raw, + ).cast(), +); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_UIPickerView', +) +external ffi.Pointer _class_UIPickerView_raw; +final _class_UIPickerView = objc.getClass( + "UIPickerView", + () => ffi.Native.addressOf>( + _class_UIPickerView_raw, + ).cast(), +); final _objc_msgSend_12hwf9n = objc.msgSendPointer .cast< ffi.NativeFunction< diff --git a/pkgs/ffigen/test/native_objc_test/static_func_native_test_bindings.dart b/pkgs/ffigen/test/native_objc_test/static_func_native_test_bindings.dart index 9e36181b7a..76baad4c1a 100644 --- a/pkgs/ffigen/test/native_objc_test/static_func_native_test_bindings.dart +++ b/pkgs/ffigen/test/native_objc_test/static_func_native_test_bindings.dart @@ -280,7 +280,16 @@ extension StaticFuncTestObj$Methods on StaticFuncTestObj { } } -late final _class_StaticFuncTestObj = objc.getClass("StaticFuncTestObj"); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_StaticFuncTestObj', +) +external ffi.Pointer _class_StaticFuncTestObj_raw; +final _class_StaticFuncTestObj = objc.getClass( + "StaticFuncTestObj", + () => ffi.Native.addressOf>( + _class_StaticFuncTestObj_raw, + ).cast(), +); final _objc_msgSend_129vhbw = objc.msgSendPointer .cast< ffi.NativeFunction< diff --git a/pkgs/ffigen/test/native_objc_test/static_func_test_bindings.dart b/pkgs/ffigen/test/native_objc_test/static_func_test_bindings.dart index 3026238b96..aa94a4b6f5 100644 --- a/pkgs/ffigen/test/native_objc_test/static_func_test_bindings.dart +++ b/pkgs/ffigen/test/native_objc_test/static_func_test_bindings.dart @@ -369,7 +369,16 @@ extension StaticFuncTestObj$Methods on StaticFuncTestObj { } } -late final _class_StaticFuncTestObj = objc.getClass("StaticFuncTestObj"); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_StaticFuncTestObj', +) +external ffi.Pointer _class_StaticFuncTestObj_raw; +final _class_StaticFuncTestObj = objc.getClass( + "StaticFuncTestObj", + () => ffi.Native.addressOf>( + _class_StaticFuncTestObj_raw, + ).cast(), +); final _objc_msgSend_129vhbw = objc.msgSendPointer .cast< ffi.NativeFunction< diff --git a/pkgs/ffigen/test/native_objc_test/string_test_bindings.dart b/pkgs/ffigen/test/native_objc_test/string_test_bindings.dart index 947f828618..d9bad1bf3e 100644 --- a/pkgs/ffigen/test/native_objc_test/string_test_bindings.dart +++ b/pkgs/ffigen/test/native_objc_test/string_test_bindings.dart @@ -88,7 +88,16 @@ extension StringUtil$Methods on StringUtil { } } -late final _class_StringUtil = objc.getClass("StringUtil"); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_StringUtil', +) +external ffi.Pointer _class_StringUtil_raw; +final _class_StringUtil = objc.getClass( + "StringUtil", + () => ffi.Native.addressOf>( + _class_StringUtil_raw, + ).cast(), +); final _objc_msgSend_151sglz = objc.msgSendPointer .cast< ffi.NativeFunction< diff --git a/pkgs/ffigen/test/native_objc_test/swift_class_test_bindings.dart b/pkgs/ffigen/test/native_objc_test/swift_class_test_bindings.dart index b4a515ba61..eb3802f4b3 100644 --- a/pkgs/ffigen/test/native_objc_test/swift_class_test_bindings.dart +++ b/pkgs/ffigen/test/native_objc_test/swift_class_test_bindings.dart @@ -84,7 +84,16 @@ extension MySwiftClass$Methods on MySwiftClass { } } -late final _class_MySwiftClass = objc.getClass("swift_class_test.MySwiftClass"); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_swift_class_test.MySwiftClass', +) +external ffi.Pointer _class_MySwiftClass_raw; +final _class_MySwiftClass = objc.getClass( + "swift_class_test.MySwiftClass", + () => ffi.Native.addressOf>( + _class_MySwiftClass_raw, + ).cast(), +); final _objc_msgSend_151sglz = objc.msgSendPointer .cast< ffi.NativeFunction< diff --git a/pkgs/ffigen/test/native_objc_test/typedef_test_bindings.dart b/pkgs/ffigen/test/native_objc_test/typedef_test_bindings.dart index 320a9b0269..5c8e0be95f 100644 --- a/pkgs/ffigen/test/native_objc_test/typedef_test_bindings.dart +++ b/pkgs/ffigen/test/native_objc_test/typedef_test_bindings.dart @@ -159,8 +159,24 @@ extension SomeClass$Methods on SomeClass { typedef SomeClassPtr = ffi.Pointer; typedef DartSomeClassPtr = SomeClass; -late final _class_AnotherClass = objc.getClass("AnotherClass"); -late final _class_SomeClass = objc.getClass("SomeClass"); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_AnotherClass', +) +external ffi.Pointer _class_AnotherClass_raw; +final _class_AnotherClass = objc.getClass( + "AnotherClass", + () => ffi.Native.addressOf>( + _class_AnotherClass_raw, + ).cast(), +); +@ffi.Native>(symbol: 'OBJC_CLASS_\$_SomeClass') +external ffi.Pointer _class_SomeClass_raw; +final _class_SomeClass = objc.getClass( + "SomeClass", + () => ffi.Native.addressOf>( + _class_SomeClass_raw, + ).cast(), +); final _objc_msgSend_151sglz = objc.msgSendPointer .cast< ffi.NativeFunction< diff --git a/pkgs/objective_c/ffigen_runtime.yaml b/pkgs/objective_c/ffigen_runtime.yaml index 5d14eeaf7d..bd84125802 100644 --- a/pkgs/objective_c/ffigen_runtime.yaml +++ b/pkgs/objective_c/ffigen_runtime.yaml @@ -11,6 +11,8 @@ generate-for-package-objective-c: true sort: true functions: include: + - 'class_getName' + - 'class_isMetaClass' - 'objc_.*' - 'object_getClass' - 'sel_registerName' @@ -23,6 +25,8 @@ functions: exclude: - 'objc_msgSend.*' rename: + 'class_getName': 'getClassName' + 'class_isMetaClass': 'isMetaClass' 'sel_registerName': 'registerName' 'sel_getName': 'getName' 'objc_getClass': 'getClass' diff --git a/pkgs/objective_c/lib/src/internal.dart b/pkgs/objective_c/lib/src/internal.dart index 87d76361ee..7c43cd5f99 100644 --- a/pkgs/objective_c/lib/src/internal.dart +++ b/pkgs/objective_c/lib/src/internal.dart @@ -123,8 +123,19 @@ Pointer registerName(String name) { } /// Only for use by FFIgen bindings. -ObjectPtr getClass(String name) { +ObjectPtr getClass(String name, [ObjectPtr Function()? loader]) { _ensureDartAPI(); + + if (loader != null) { + try { + return loader(); + // ignore: avoid_catching_errors + } on ArgumentError { + // The class is not in the user's dylib. This means the class is probably + // part of a built-in framework. Try to load it by name instead. + } + } + final cstr = name.toNativeUtf8(); final clazz = r.getClass(cstr.cast()); calloc.free(cstr); @@ -135,15 +146,23 @@ ObjectPtr getClass(String name) { } /// Only for use by ffigen bindings. -Pointer getProtocol(String name) { +Pointer getProtocol( + String name, [ + Pointer Function()? loader, +]) { _ensureDartAPI(); - final cstr = name.toNativeUtf8(); - final clazz = r.getProtocol(cstr.cast()); - calloc.free(cstr); - if (clazz == nullptr) { + final Pointer protocol; + if (loader != null) { + protocol = loader(); + } else { + final cstr = name.toNativeUtf8(); + protocol = r.getProtocol(cstr.cast()); + calloc.free(cstr); + } + if (protocol == nullptr) { throw FailedToLoadProtocolException(name); } - return clazz; + return protocol; } /// Only for use by FFIgen bindings. diff --git a/pkgs/objective_c/lib/src/objective_c_bindings_generated.dart b/pkgs/objective_c/lib/src/objective_c_bindings_generated.dart index 5dd0602fbb..3b915e5268 100644 --- a/pkgs/objective_c/lib/src/objective_c_bindings_generated.dart +++ b/pkgs/objective_c/lib/src/objective_c_bindings_generated.dart @@ -2106,8 +2106,7 @@ enum NSAttributedStringMarkdownParsingFailurePolicy { /// macOS: introduced 12.0.0 extension type NSAttributedStringMarkdownParsingOptions._( objc.ObjCObject object$ -) - implements objc.ObjCObject, NSObject, NSCopying { +) implements objc.ObjCObject, NSObject, NSCopying { /// Constructs a [NSAttributedStringMarkdownParsingOptions] that points to the same underlying object as [other]. NSAttributedStringMarkdownParsingOptions.as(objc.ObjCObject other) : object$ = other { @@ -35480,67 +35479,462 @@ extension type Protocol._(objc.ObjCObject object$) implements objc.ObjCObject { extension Protocol$Methods on Protocol {} -late final _class_DOBJCDartInputStreamAdapter = objc.getClass( +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_DOBJCDartInputStreamAdapter', +) +external ffi.Pointer +_class_DOBJCDartInputStreamAdapter_raw; +final _class_DOBJCDartInputStreamAdapter = objc.getClass( "DOBJCDartInputStreamAdapter", + () => ffi.Native.addressOf>( + _class_DOBJCDartInputStreamAdapter_raw, + ).cast(), ); -late final _class_DOBJCDartInputStreamAdapterWeakHolder = objc.getClass( +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_DOBJCDartInputStreamAdapterWeakHolder', +) +external ffi.Pointer +_class_DOBJCDartInputStreamAdapterWeakHolder_raw; +final _class_DOBJCDartInputStreamAdapterWeakHolder = objc.getClass( "DOBJCDartInputStreamAdapterWeakHolder", + () => ffi.Native.addressOf>( + _class_DOBJCDartInputStreamAdapterWeakHolder_raw, + ).cast(), ); -late final _class_DOBJCDartProtocol = objc.getClass("DOBJCDartProtocol"); -late final _class_DOBJCDartProtocolBuilder = objc.getClass( +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_DOBJCDartProtocol', +) +external ffi.Pointer _class_DOBJCDartProtocol_raw; +final _class_DOBJCDartProtocol = objc.getClass( + "DOBJCDartProtocol", + () => ffi.Native.addressOf>( + _class_DOBJCDartProtocol_raw, + ).cast(), +); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_DOBJCDartProtocolBuilder', +) +external ffi.Pointer _class_DOBJCDartProtocolBuilder_raw; +final _class_DOBJCDartProtocolBuilder = objc.getClass( "DOBJCDartProtocolBuilder", + () => ffi.Native.addressOf>( + _class_DOBJCDartProtocolBuilder_raw, + ).cast(), ); -late final _class_DOBJCObservation = objc.getClass("DOBJCObservation"); -late final _class_NSArray = objc.getClass("NSArray"); -late final _class_NSAttributedString = objc.getClass("NSAttributedString"); -late final _class_NSAttributedStringMarkdownParsingOptions = objc.getClass( +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_DOBJCObservation', +) +external ffi.Pointer _class_DOBJCObservation_raw; +final _class_DOBJCObservation = objc.getClass( + "DOBJCObservation", + () => ffi.Native.addressOf>( + _class_DOBJCObservation_raw, + ).cast(), +); +@ffi.Native>(symbol: 'OBJC_CLASS_\$_NSArray') +external ffi.Pointer _class_NSArray_raw; +final _class_NSArray = objc.getClass( + "NSArray", + () => ffi.Native.addressOf>( + _class_NSArray_raw, + ).cast(), +); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_NSAttributedString', +) +external ffi.Pointer _class_NSAttributedString_raw; +final _class_NSAttributedString = objc.getClass( + "NSAttributedString", + () => ffi.Native.addressOf>( + _class_NSAttributedString_raw, + ).cast(), +); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_NSAttributedStringMarkdownParsingOptions', +) +external ffi.Pointer +_class_NSAttributedStringMarkdownParsingOptions_raw; +final _class_NSAttributedStringMarkdownParsingOptions = objc.getClass( "NSAttributedStringMarkdownParsingOptions", -); -late final _class_NSBundle = objc.getClass("NSBundle"); -late final _class_NSCharacterSet = objc.getClass("NSCharacterSet"); -late final _class_NSCoder = objc.getClass("NSCoder"); -late final _class_NSData = objc.getClass("NSData"); -late final _class_NSDate = objc.getClass("NSDate"); -late final _class_NSDictionary = objc.getClass("NSDictionary"); -late final _class_NSEnumerator = objc.getClass("NSEnumerator"); -late final _class_NSError = objc.getClass("NSError"); -late final _class_NSIndexSet = objc.getClass("NSIndexSet"); -late final _class_NSInputStream = objc.getClass("NSInputStream"); -late final _class_NSInvocation = objc.getClass("NSInvocation"); -late final _class_NSItemProvider = objc.getClass("NSItemProvider"); -late final _class_NSLocale = objc.getClass("NSLocale"); -late final _class_NSMethodSignature = objc.getClass("NSMethodSignature"); -late final _class_NSMutableArray = objc.getClass("NSMutableArray"); -late final _class_NSMutableData = objc.getClass("NSMutableData"); -late final _class_NSMutableDictionary = objc.getClass("NSMutableDictionary"); -late final _class_NSMutableIndexSet = objc.getClass("NSMutableIndexSet"); -late final _class_NSMutableOrderedSet = objc.getClass("NSMutableOrderedSet"); -late final _class_NSMutableSet = objc.getClass("NSMutableSet"); -late final _class_NSMutableString = objc.getClass("NSMutableString"); -late final _class_NSNotification = objc.getClass("NSNotification"); -late final _class_NSNull = objc.getClass("NSNull"); -late final _class_NSNumber = objc.getClass("NSNumber"); -late final _class_NSObject = objc.getClass("NSObject"); -late final _class_NSOrderedCollectionChange = objc.getClass( + () => ffi.Native.addressOf>( + _class_NSAttributedStringMarkdownParsingOptions_raw, + ).cast(), +); +@ffi.Native>(symbol: 'OBJC_CLASS_\$_NSBundle') +external ffi.Pointer _class_NSBundle_raw; +final _class_NSBundle = objc.getClass( + "NSBundle", + () => ffi.Native.addressOf>( + _class_NSBundle_raw, + ).cast(), +); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_NSCharacterSet', +) +external ffi.Pointer _class_NSCharacterSet_raw; +final _class_NSCharacterSet = objc.getClass( + "NSCharacterSet", + () => ffi.Native.addressOf>( + _class_NSCharacterSet_raw, + ).cast(), +); +@ffi.Native>(symbol: 'OBJC_CLASS_\$_NSCoder') +external ffi.Pointer _class_NSCoder_raw; +final _class_NSCoder = objc.getClass( + "NSCoder", + () => ffi.Native.addressOf>( + _class_NSCoder_raw, + ).cast(), +); +@ffi.Native>(symbol: 'OBJC_CLASS_\$_NSData') +external ffi.Pointer _class_NSData_raw; +final _class_NSData = objc.getClass( + "NSData", + () => ffi.Native.addressOf>( + _class_NSData_raw, + ).cast(), +); +@ffi.Native>(symbol: 'OBJC_CLASS_\$_NSDate') +external ffi.Pointer _class_NSDate_raw; +final _class_NSDate = objc.getClass( + "NSDate", + () => ffi.Native.addressOf>( + _class_NSDate_raw, + ).cast(), +); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_NSDictionary', +) +external ffi.Pointer _class_NSDictionary_raw; +final _class_NSDictionary = objc.getClass( + "NSDictionary", + () => ffi.Native.addressOf>( + _class_NSDictionary_raw, + ).cast(), +); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_NSEnumerator', +) +external ffi.Pointer _class_NSEnumerator_raw; +final _class_NSEnumerator = objc.getClass( + "NSEnumerator", + () => ffi.Native.addressOf>( + _class_NSEnumerator_raw, + ).cast(), +); +@ffi.Native>(symbol: 'OBJC_CLASS_\$_NSError') +external ffi.Pointer _class_NSError_raw; +final _class_NSError = objc.getClass( + "NSError", + () => ffi.Native.addressOf>( + _class_NSError_raw, + ).cast(), +); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_NSIndexSet', +) +external ffi.Pointer _class_NSIndexSet_raw; +final _class_NSIndexSet = objc.getClass( + "NSIndexSet", + () => ffi.Native.addressOf>( + _class_NSIndexSet_raw, + ).cast(), +); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_NSInputStream', +) +external ffi.Pointer _class_NSInputStream_raw; +final _class_NSInputStream = objc.getClass( + "NSInputStream", + () => ffi.Native.addressOf>( + _class_NSInputStream_raw, + ).cast(), +); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_NSInvocation', +) +external ffi.Pointer _class_NSInvocation_raw; +final _class_NSInvocation = objc.getClass( + "NSInvocation", + () => ffi.Native.addressOf>( + _class_NSInvocation_raw, + ).cast(), +); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_NSItemProvider', +) +external ffi.Pointer _class_NSItemProvider_raw; +final _class_NSItemProvider = objc.getClass( + "NSItemProvider", + () => ffi.Native.addressOf>( + _class_NSItemProvider_raw, + ).cast(), +); +@ffi.Native>(symbol: 'OBJC_CLASS_\$_NSLocale') +external ffi.Pointer _class_NSLocale_raw; +final _class_NSLocale = objc.getClass( + "NSLocale", + () => ffi.Native.addressOf>( + _class_NSLocale_raw, + ).cast(), +); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_NSMethodSignature', +) +external ffi.Pointer _class_NSMethodSignature_raw; +final _class_NSMethodSignature = objc.getClass( + "NSMethodSignature", + () => ffi.Native.addressOf>( + _class_NSMethodSignature_raw, + ).cast(), +); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_NSMutableArray', +) +external ffi.Pointer _class_NSMutableArray_raw; +final _class_NSMutableArray = objc.getClass( + "NSMutableArray", + () => ffi.Native.addressOf>( + _class_NSMutableArray_raw, + ).cast(), +); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_NSMutableData', +) +external ffi.Pointer _class_NSMutableData_raw; +final _class_NSMutableData = objc.getClass( + "NSMutableData", + () => ffi.Native.addressOf>( + _class_NSMutableData_raw, + ).cast(), +); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_NSMutableDictionary', +) +external ffi.Pointer _class_NSMutableDictionary_raw; +final _class_NSMutableDictionary = objc.getClass( + "NSMutableDictionary", + () => ffi.Native.addressOf>( + _class_NSMutableDictionary_raw, + ).cast(), +); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_NSMutableIndexSet', +) +external ffi.Pointer _class_NSMutableIndexSet_raw; +final _class_NSMutableIndexSet = objc.getClass( + "NSMutableIndexSet", + () => ffi.Native.addressOf>( + _class_NSMutableIndexSet_raw, + ).cast(), +); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_NSMutableOrderedSet', +) +external ffi.Pointer _class_NSMutableOrderedSet_raw; +final _class_NSMutableOrderedSet = objc.getClass( + "NSMutableOrderedSet", + () => ffi.Native.addressOf>( + _class_NSMutableOrderedSet_raw, + ).cast(), +); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_NSMutableSet', +) +external ffi.Pointer _class_NSMutableSet_raw; +final _class_NSMutableSet = objc.getClass( + "NSMutableSet", + () => ffi.Native.addressOf>( + _class_NSMutableSet_raw, + ).cast(), +); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_NSMutableString', +) +external ffi.Pointer _class_NSMutableString_raw; +final _class_NSMutableString = objc.getClass( + "NSMutableString", + () => ffi.Native.addressOf>( + _class_NSMutableString_raw, + ).cast(), +); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_NSNotification', +) +external ffi.Pointer _class_NSNotification_raw; +final _class_NSNotification = objc.getClass( + "NSNotification", + () => ffi.Native.addressOf>( + _class_NSNotification_raw, + ).cast(), +); +@ffi.Native>(symbol: 'OBJC_CLASS_\$_NSNull') +external ffi.Pointer _class_NSNull_raw; +final _class_NSNull = objc.getClass( + "NSNull", + () => ffi.Native.addressOf>( + _class_NSNull_raw, + ).cast(), +); +@ffi.Native>(symbol: 'OBJC_CLASS_\$_NSNumber') +external ffi.Pointer _class_NSNumber_raw; +final _class_NSNumber = objc.getClass( + "NSNumber", + () => ffi.Native.addressOf>( + _class_NSNumber_raw, + ).cast(), +); +@ffi.Native>(symbol: 'OBJC_CLASS_\$_NSObject') +external ffi.Pointer _class_NSObject_raw; +final _class_NSObject = objc.getClass( + "NSObject", + () => ffi.Native.addressOf>( + _class_NSObject_raw, + ).cast(), +); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_NSOrderedCollectionChange', +) +external ffi.Pointer _class_NSOrderedCollectionChange_raw; +final _class_NSOrderedCollectionChange = objc.getClass( "NSOrderedCollectionChange", + () => ffi.Native.addressOf>( + _class_NSOrderedCollectionChange_raw, + ).cast(), ); -late final _class_NSOrderedCollectionDifference = objc.getClass( +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_NSOrderedCollectionDifference', +) +external ffi.Pointer +_class_NSOrderedCollectionDifference_raw; +final _class_NSOrderedCollectionDifference = objc.getClass( "NSOrderedCollectionDifference", + () => ffi.Native.addressOf>( + _class_NSOrderedCollectionDifference_raw, + ).cast(), +); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_NSOrderedSet', +) +external ffi.Pointer _class_NSOrderedSet_raw; +final _class_NSOrderedSet = objc.getClass( + "NSOrderedSet", + () => ffi.Native.addressOf>( + _class_NSOrderedSet_raw, + ).cast(), +); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_NSOutputStream', +) +external ffi.Pointer _class_NSOutputStream_raw; +final _class_NSOutputStream = objc.getClass( + "NSOutputStream", + () => ffi.Native.addressOf>( + _class_NSOutputStream_raw, + ).cast(), +); +@ffi.Native>(symbol: 'OBJC_CLASS_\$_NSPort') +external ffi.Pointer _class_NSPort_raw; +final _class_NSPort = objc.getClass( + "NSPort", + () => ffi.Native.addressOf>( + _class_NSPort_raw, + ).cast(), +); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_NSPortMessage', +) +external ffi.Pointer _class_NSPortMessage_raw; +final _class_NSPortMessage = objc.getClass( + "NSPortMessage", + () => ffi.Native.addressOf>( + _class_NSPortMessage_raw, + ).cast(), +); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_NSProgress', +) +external ffi.Pointer _class_NSProgress_raw; +final _class_NSProgress = objc.getClass( + "NSProgress", + () => ffi.Native.addressOf>( + _class_NSProgress_raw, + ).cast(), +); +@ffi.Native>(symbol: 'OBJC_CLASS_\$_NSRunLoop') +external ffi.Pointer _class_NSRunLoop_raw; +final _class_NSRunLoop = objc.getClass( + "NSRunLoop", + () => ffi.Native.addressOf>( + _class_NSRunLoop_raw, + ).cast(), +); +@ffi.Native>(symbol: 'OBJC_CLASS_\$_NSSet') +external ffi.Pointer _class_NSSet_raw; +final _class_NSSet = objc.getClass( + "NSSet", + () => ffi.Native.addressOf>( + _class_NSSet_raw, + ).cast(), +); +@ffi.Native>(symbol: 'OBJC_CLASS_\$_NSStream') +external ffi.Pointer _class_NSStream_raw; +final _class_NSStream = objc.getClass( + "NSStream", + () => ffi.Native.addressOf>( + _class_NSStream_raw, + ).cast(), +); +@ffi.Native>(symbol: 'OBJC_CLASS_\$_NSString') +external ffi.Pointer _class_NSString_raw; +final _class_NSString = objc.getClass( + "NSString", + () => ffi.Native.addressOf>( + _class_NSString_raw, + ).cast(), +); +@ffi.Native>(symbol: 'OBJC_CLASS_\$_NSTimer') +external ffi.Pointer _class_NSTimer_raw; +final _class_NSTimer = objc.getClass( + "NSTimer", + () => ffi.Native.addressOf>( + _class_NSTimer_raw, + ).cast(), +); +@ffi.Native>(symbol: 'OBJC_CLASS_\$_NSURL') +external ffi.Pointer _class_NSURL_raw; +final _class_NSURL = objc.getClass( + "NSURL", + () => ffi.Native.addressOf>( + _class_NSURL_raw, + ).cast(), +); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_NSURLHandle', +) +external ffi.Pointer _class_NSURLHandle_raw; +final _class_NSURLHandle = objc.getClass( + "NSURLHandle", + () => ffi.Native.addressOf>( + _class_NSURLHandle_raw, + ).cast(), +); +@ffi.Native>(symbol: 'OBJC_CLASS_\$_NSValue') +external ffi.Pointer _class_NSValue_raw; +final _class_NSValue = objc.getClass( + "NSValue", + () => ffi.Native.addressOf>( + _class_NSValue_raw, + ).cast(), +); +@ffi.Native>(symbol: 'OBJC_CLASS_\$_Protocol') +external ffi.Pointer _class_Protocol_raw; +final _class_Protocol = objc.getClass( + "Protocol", + () => ffi.Native.addressOf>( + _class_Protocol_raw, + ).cast(), ); -late final _class_NSOrderedSet = objc.getClass("NSOrderedSet"); -late final _class_NSOutputStream = objc.getClass("NSOutputStream"); -late final _class_NSPort = objc.getClass("NSPort"); -late final _class_NSPortMessage = objc.getClass("NSPortMessage"); -late final _class_NSProgress = objc.getClass("NSProgress"); -late final _class_NSRunLoop = objc.getClass("NSRunLoop"); -late final _class_NSSet = objc.getClass("NSSet"); -late final _class_NSStream = objc.getClass("NSStream"); -late final _class_NSString = objc.getClass("NSString"); -late final _class_NSTimer = objc.getClass("NSTimer"); -late final _class_NSURL = objc.getClass("NSURL"); -late final _class_NSURLHandle = objc.getClass("NSURLHandle"); -late final _class_NSValue = objc.getClass("NSValue"); -late final _class_Protocol = objc.getClass("Protocol"); final _objc_msgSend_102xxo4 = objc.msgSendPointer .cast< ffi.NativeFunction< @@ -39961,21 +40355,87 @@ final _objc_msgSend_zug4wi = objc.msgSendPointer NSRange, ) >(); -late final _protocol_NSCoding = objc.getProtocol("NSCoding"); -late final _protocol_NSCopying = objc.getProtocol("NSCopying"); -late final _protocol_NSFastEnumeration = objc.getProtocol("NSFastEnumeration"); -late final _protocol_NSItemProviderReading = objc.getProtocol( +@ffi.Native Function()>( + symbol: '_1wx624s_NSCoding', +) +external ffi.Pointer _protocol_NSCoding_raw(); +final _protocol_NSCoding = objc.getProtocol("NSCoding", _protocol_NSCoding_raw); +@ffi.Native Function()>( + symbol: '_1wx624s_NSCopying', +) +external ffi.Pointer _protocol_NSCopying_raw(); +final _protocol_NSCopying = objc.getProtocol( + "NSCopying", + _protocol_NSCopying_raw, +); +@ffi.Native Function()>( + symbol: '_1wx624s_NSFastEnumeration', +) +external ffi.Pointer _protocol_NSFastEnumeration_raw(); +final _protocol_NSFastEnumeration = objc.getProtocol( + "NSFastEnumeration", + _protocol_NSFastEnumeration_raw, +); +@ffi.Native Function()>( + symbol: '_1wx624s_NSItemProviderReading', +) +external ffi.Pointer +_protocol_NSItemProviderReading_raw(); +final _protocol_NSItemProviderReading = objc.getProtocol( "NSItemProviderReading", + _protocol_NSItemProviderReading_raw, ); -late final _protocol_NSItemProviderWriting = objc.getProtocol( +@ffi.Native Function()>( + symbol: '_1wx624s_NSItemProviderWriting', +) +external ffi.Pointer +_protocol_NSItemProviderWriting_raw(); +final _protocol_NSItemProviderWriting = objc.getProtocol( "NSItemProviderWriting", + _protocol_NSItemProviderWriting_raw, +); +@ffi.Native Function()>( + symbol: '_1wx624s_NSMutableCopying', +) +external ffi.Pointer _protocol_NSMutableCopying_raw(); +final _protocol_NSMutableCopying = objc.getProtocol( + "NSMutableCopying", + _protocol_NSMutableCopying_raw, +); +@ffi.Native Function()>( + symbol: '_1wx624s_NSObject', +) +external ffi.Pointer _protocol_NSObject_raw(); +final _protocol_NSObject = objc.getProtocol("NSObject", _protocol_NSObject_raw); +@ffi.Native Function()>( + symbol: '_1wx624s_NSPortDelegate', +) +external ffi.Pointer _protocol_NSPortDelegate_raw(); +final _protocol_NSPortDelegate = objc.getProtocol( + "NSPortDelegate", + _protocol_NSPortDelegate_raw, +); +@ffi.Native Function()>( + symbol: '_1wx624s_NSSecureCoding', +) +external ffi.Pointer _protocol_NSSecureCoding_raw(); +final _protocol_NSSecureCoding = objc.getProtocol( + "NSSecureCoding", + _protocol_NSSecureCoding_raw, ); -late final _protocol_NSMutableCopying = objc.getProtocol("NSMutableCopying"); -late final _protocol_NSObject = objc.getProtocol("NSObject"); -late final _protocol_NSPortDelegate = objc.getProtocol("NSPortDelegate"); -late final _protocol_NSSecureCoding = objc.getProtocol("NSSecureCoding"); -late final _protocol_NSStreamDelegate = objc.getProtocol("NSStreamDelegate"); -late final _protocol_Observer = objc.getProtocol("Observer"); +@ffi.Native Function()>( + symbol: '_1wx624s_NSStreamDelegate', +) +external ffi.Pointer _protocol_NSStreamDelegate_raw(); +final _protocol_NSStreamDelegate = objc.getProtocol( + "NSStreamDelegate", + _protocol_NSStreamDelegate_raw, +); +@ffi.Native Function()>( + symbol: '_1wx624s_Observer', +) +external ffi.Pointer _protocol_Observer_raw(); +final _protocol_Observer = objc.getProtocol("Observer", _protocol_Observer_raw); late final _sel_URLByResolvingAliasFileAtURL_options_error_ = objc.registerName( "URLByResolvingAliasFileAtURL:options:error:", ); diff --git a/pkgs/objective_c/lib/src/runtime_bindings_generated.dart b/pkgs/objective_c/lib/src/runtime_bindings_generated.dart index 0cb438ddb7..f0e986838a 100644 --- a/pkgs/objective_c/lib/src/runtime_bindings_generated.dart +++ b/pkgs/objective_c/lib/src/runtime_bindings_generated.dart @@ -92,6 +92,12 @@ external ffi.Pointer> copyClassList( ) external ffi.Pointer getClass(ffi.Pointer name); +@ffi.Native Function(ffi.Pointer)>( + symbol: 'class_getName', + isLeaf: true, +) +external ffi.Pointer getClassName(ffi.Pointer cls); + @ffi.Native< ObjCMethodDesc Function( ffi.Pointer, @@ -135,6 +141,12 @@ external ffi.Pointer getProtocolName( ffi.Pointer proto, ); +@ffi.Native)>( + symbol: 'class_isMetaClass', + isLeaf: true, +) +external bool isMetaClass(ffi.Pointer cls); + @ffi.Native(symbol: 'objc_msgSend') external void msgSend(); diff --git a/pkgs/objective_c/src/objective_c_bindings_generated.m b/pkgs/objective_c/src/objective_c_bindings_generated.m index c3c69aea45..fc48e7dedb 100644 --- a/pkgs/objective_c/src/objective_c_bindings_generated.m +++ b/pkgs/objective_c/src/objective_c_bindings_generated.m @@ -53,24 +53,34 @@ }; +__attribute__((visibility("default"))) __attribute__((used)) Protocol* _1wx624s_NSCoding(void) { return @protocol(NSCoding); } +__attribute__((visibility("default"))) __attribute__((used)) Protocol* _1wx624s_NSCopying(void) { return @protocol(NSCopying); } +__attribute__((visibility("default"))) __attribute__((used)) Protocol* _1wx624s_NSFastEnumeration(void) { return @protocol(NSFastEnumeration); } +__attribute__((visibility("default"))) __attribute__((used)) Protocol* _1wx624s_NSItemProviderReading(void) { return @protocol(NSItemProviderReading); } +__attribute__((visibility("default"))) __attribute__((used)) Protocol* _1wx624s_NSItemProviderWriting(void) { return @protocol(NSItemProviderWriting); } +__attribute__((visibility("default"))) __attribute__((used)) Protocol* _1wx624s_NSMutableCopying(void) { return @protocol(NSMutableCopying); } +__attribute__((visibility("default"))) __attribute__((used)) Protocol* _1wx624s_NSObject(void) { return @protocol(NSObject); } +__attribute__((visibility("default"))) __attribute__((used)) Protocol* _1wx624s_NSPortDelegate(void) { return @protocol(NSPortDelegate); } +__attribute__((visibility("default"))) __attribute__((used)) Protocol* _1wx624s_NSSecureCoding(void) { return @protocol(NSSecureCoding); } +__attribute__((visibility("default"))) __attribute__((used)) Protocol* _1wx624s_NSStreamDelegate(void) { return @protocol(NSStreamDelegate); } typedef id (^_ProtocolTrampoline)(void * sel); @@ -595,6 +605,7 @@ id _1wx624s_protocolTrampoline_c7gk2u(id target, void * sel, struct objc_select return ((_ProtocolTrampoline_17)((id (*)(id, SEL, SEL))objc_msgSend)(target, @selector(getDOBJCDartProtocolMethodForSelector:), sel))(sel, arg1, arg2, arg3); } +__attribute__((visibility("default"))) __attribute__((used)) Protocol* _1wx624s_Observer(void) { return @protocol(Observer); } #undef BLOCKING_BLOCK_IMPL diff --git a/pkgs/objective_c/src/objective_c_runtime.h b/pkgs/objective_c/src/objective_c_runtime.h index 33cffaaf8d..4ecd742709 100644 --- a/pkgs/objective_c/src/objective_c_runtime.h +++ b/pkgs/objective_c/src/objective_c_runtime.h @@ -18,6 +18,7 @@ typedef struct _ObjCProtocolImpl ObjCProtocolImpl; ObjCSelector *sel_registerName(const char *name); const char * sel_getName(ObjCSelector* sel); ObjCObjectImpl *objc_getClass(const char *name); +const char *class_getName(ObjCObjectImpl* cls); ObjCObjectImpl *objc_retain(ObjCObjectImpl *object); ObjCObjectImpl *objc_retainBlock(const ObjCObjectImpl *object); void objc_release(ObjCObjectImpl *object); @@ -26,6 +27,7 @@ ObjCObjectImpl *object_getClass(ObjCObjectImpl *object); ObjCObjectImpl** objc_copyClassList(unsigned int* count); void *objc_autoreleasePoolPush(void); void objc_autoreleasePoolPop(void *pool); +bool class_isMetaClass(ObjCObjectImpl *cls); // The signature of this function is just a placeholder. This function is used // by every method invocation, and is cast to every signature we need. diff --git a/pkgs/objective_c/test/main.c b/pkgs/objective_c/test/main.c index 9b61079a22..3ba0613c87 100644 --- a/pkgs/objective_c/test/main.c +++ b/pkgs/objective_c/test/main.c @@ -23,6 +23,6 @@ int main() { ASSERT_SYMBOL("OBJC_CLASS_$_DOBJCDartProtocol"); // protocol.m ASSERT_SYMBOL("OBJC_CLASS_$_DOBJCObservation"); // observer.m // objective_c_bindings_generated.m - ASSERT_SYMBOL("_ObjectiveCBindings_wrapListenerBlock_ovsamd"); + ASSERT_SYMBOL("_1wx624s_Observer"); return 0; } diff --git a/pkgs/objective_c/test/setup.dart b/pkgs/objective_c/test/setup.dart index cdce9d1e33..6d8d2da2aa 100644 --- a/pkgs/objective_c/test/setup.dart +++ b/pkgs/objective_c/test/setup.dart @@ -90,7 +90,7 @@ void main(List arguments) { lib.lookup('OBJC_CLASS_\$_DOBJCDartProtocol'); // protocol.m lib.lookup('OBJC_CLASS_\$_DOBJCObservation'); // observer.m // objective_c_bindings_generated.m - lib.lookup('_ObjectiveCBindings_wrapListenerBlock_ovsamd'); + lib.lookup('_1wx624s_Observer'); // Sanity check that the executable can find FFI symbols. _linkMain([...objFiles, cMain], '$cMain.exe'); diff --git a/pkgs/swiftgen/test/integration/callbacks_bindings.dart b/pkgs/swiftgen/test/integration/callbacks_bindings.dart index 41222b16a9..9a87f89a4e 100644 --- a/pkgs/swiftgen/test/integration/callbacks_bindings.dart +++ b/pkgs/swiftgen/test/integration/callbacks_bindings.dart @@ -638,8 +638,15 @@ extension TestMessageService$Methods on TestMessageService { } } -late final _class_TestMessageService = objc.getClass( +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_callbacks.TestMessageService', +) +external ffi.Pointer _class_TestMessageService_raw; +final _class_TestMessageService = objc.getClass( "callbacks.TestMessageService", + () => ffi.Native.addressOf>( + _class_TestMessageService_raw, + ).cast(), ); final _objc_msgSend_151sglz = objc.msgSendPointer .cast< diff --git a/pkgs/swiftgen/test/integration/classes_bindings.dart b/pkgs/swiftgen/test/integration/classes_bindings.dart index 4e20bc17da..dd47564694 100644 --- a/pkgs/swiftgen/test/integration/classes_bindings.dart +++ b/pkgs/swiftgen/test/integration/classes_bindings.dart @@ -130,9 +130,25 @@ extension TestOtherClassWrapper$Methods on TestOtherClassWrapper { } } -late final _class_TestClassWrapper = objc.getClass("classes.TestClassWrapper"); -late final _class_TestOtherClassWrapper = objc.getClass( +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_classes.TestClassWrapper', +) +external ffi.Pointer _class_TestClassWrapper_raw; +final _class_TestClassWrapper = objc.getClass( + "classes.TestClassWrapper", + () => ffi.Native.addressOf>( + _class_TestClassWrapper_raw, + ).cast(), +); +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_classes.TestOtherClassWrapper', +) +external ffi.Pointer _class_TestOtherClassWrapper_raw; +final _class_TestOtherClassWrapper = objc.getClass( "classes.TestOtherClassWrapper", + () => ffi.Native.addressOf>( + _class_TestOtherClassWrapper_raw, + ).cast(), ); final _objc_msgSend_12hwf9n = objc.msgSendPointer .cast< diff --git a/pkgs/swiftgen/test/integration/protocols_bindings.dart b/pkgs/swiftgen/test/integration/protocols_bindings.dart index 8ca1d2f3b0..16749a3320 100644 --- a/pkgs/swiftgen/test/integration/protocols_bindings.dart +++ b/pkgs/swiftgen/test/integration/protocols_bindings.dart @@ -1666,11 +1666,25 @@ interface class TestWeatherServiceDelegate$Builder { ); } -late final _class_TestSwiftInvoker = objc.getClass( +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_protocols.TestSwiftInvoker', +) +external ffi.Pointer _class_TestSwiftInvoker_raw; +final _class_TestSwiftInvoker = objc.getClass( "protocols.TestSwiftInvoker", + () => ffi.Native.addressOf>( + _class_TestSwiftInvoker_raw, + ).cast(), ); -late final _class_TestWeatherService = objc.getClass( +@ffi.Native>( + symbol: 'OBJC_CLASS_\$_protocols.TestWeatherService', +) +external ffi.Pointer _class_TestWeatherService_raw; +final _class_TestWeatherService = objc.getClass( "protocols.TestWeatherService", + () => ffi.Native.addressOf>( + _class_TestWeatherService_raw, + ).cast(), ); final _objc_msgSend_151sglz = objc.msgSendPointer .cast< @@ -1795,11 +1809,22 @@ final _objc_msgSend_xtuoz7 = objc.msgSendPointer ffi.Pointer, ) >(); -late final _protocol_TestAsyncProtocol = objc.getProtocol( +@ffi.Native Function()>( + symbol: '_1yx5rho_TestAsyncProtocol', +) +external ffi.Pointer _protocol_TestAsyncProtocol_raw(); +final _protocol_TestAsyncProtocol = objc.getProtocol( "protocols.TestAsyncProtocol", + _protocol_TestAsyncProtocol_raw, ); -late final _protocol_TestWeatherServiceDelegate = objc.getProtocol( +@ffi.Native Function()>( + symbol: '_1yx5rho_TestWeatherServiceDelegate', +) +external ffi.Pointer +_protocol_TestWeatherServiceDelegate_raw(); +final _protocol_TestWeatherServiceDelegate = objc.getProtocol( "protocols.TestWeatherServiceDelegate", + _protocol_TestWeatherServiceDelegate_raw, ); late final _sel_alloc = objc.registerName("alloc"); late final _sel_allocWithZone_ = objc.registerName("allocWithZone:");