diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/objcexport/ObjCExportCodeGenerator.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/objcexport/ObjCExportCodeGenerator.kt index 9f122191b9c..3f5481b78f0 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/objcexport/ObjCExportCodeGenerator.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/objcexport/ObjCExportCodeGenerator.kt @@ -1257,6 +1257,13 @@ private fun ObjCExportCodeGenerator.createTypeAdapter( is ObjCClassMethodForKotlinEnumValues -> { classAdapters += createEnumValuesAdapter(it.valuesFunctionSymbol.owner, it.selector) } + is ObjCGetterForObjectInstance -> { + classAdapters += if (irClass.isUnit()) { + createUnitInstanceAdapter(it.selector) + } else { + createObjectInstanceAdapter(irClass, it.selector) + } + } is ObjCMethodForKotlinMethod -> {} // Handled below. }.let {} // Force exhaustive. } @@ -1309,19 +1316,6 @@ private fun ObjCExportCodeGenerator.createTypeAdapter( else -> Pair(emptyList(), -1) } - when (irClass.kind) { - ClassKind.OBJECT -> { - classAdapters += if (irClass.isUnit()) { - createUnitInstanceAdapter() - } else { - createObjectInstanceAdapter(irClass) - } - } - else -> { - // Nothing special. - } - } - return ObjCTypeAdapter( irClass, typeInfo, @@ -1464,23 +1458,20 @@ private fun ObjCExportCodeGenerator.objCToKotlinMethodAdapter( return ObjCToKotlinMethodAdapter(selector, getEncoding(methodBridge), constPointer(imp)) } -private fun ObjCExportCodeGenerator.createUnitInstanceAdapter() = - generateObjCToKotlinSyntheticGetter( - namer.getObjectInstanceSelector(context.builtIns.unit) - ) { +private fun ObjCExportCodeGenerator.createUnitInstanceAdapter(selector: String) = + generateObjCToKotlinSyntheticGetter(selector) { initRuntimeIfNeeded() // For instance methods it gets called when allocating. ret(callFromBridge(context.llvm.Kotlin_ObjCExport_convertUnit, listOf(codegen.theUnitInstanceRef.llvm))) } private fun ObjCExportCodeGenerator.createObjectInstanceAdapter( - irClass: IrClass + irClass: IrClass, + selector: String ): ObjCExportCodeGenerator.ObjCToKotlinMethodAdapter { assert(irClass.kind == ClassKind.OBJECT) assert(!irClass.isUnit()) - val selector = namer.getObjectInstanceSelector(irClass.descriptor) - return generateObjCToKotlinSyntheticGetter(selector) { initRuntimeIfNeeded() // For instance methods it gets called when allocating. val value = getObjectValue(irClass, startLocationInfo = null, exceptionHandler = ExceptionHandler.Caller) diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportCodeSpec.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportCodeSpec.kt index 88dae17e0b9..af8154c613d 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportCodeSpec.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportCodeSpec.kt @@ -63,6 +63,10 @@ internal fun ObjCExportedInterface.createCodeSpec(symbolTable: SymbolTable): Obj } } + if (descriptor.kind == ClassKind.OBJECT) { + methods += ObjCGetterForObjectInstance(namer.getObjectInstanceSelector(descriptor)) + } + if (descriptor.kind == ClassKind.ENUM_CLASS) { descriptor.enumEntries.mapTo(methods) { ObjCGetterForKotlinEnumEntry(symbolTable.referenceEnumEntry(it)) @@ -112,6 +116,8 @@ internal class ObjCClassMethodForKotlinEnumValues( val selector: String ) : ObjCMethodSpec() +internal class ObjCGetterForObjectInstance(val selector: String) : ObjCMethodSpec() + internal sealed class ObjCTypeSpec(val binaryName: String) internal sealed class ObjCTypeForKotlinType(