diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/cgen/CBridgeGen.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/cgen/CBridgeGen.kt index 7bc79416aac..62d66aac6d2 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/cgen/CBridgeGen.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/cgen/CBridgeGen.kt @@ -12,14 +12,12 @@ import org.jetbrains.kotlin.backend.common.lower.at import org.jetbrains.kotlin.backend.common.lower.irNot import org.jetbrains.kotlin.backend.konan.PrimitiveBinaryType import org.jetbrains.kotlin.backend.konan.RuntimeNames -import org.jetbrains.kotlin.backend.konan.descriptors.createAnnotation import org.jetbrains.kotlin.backend.konan.ir.* import org.jetbrains.kotlin.backend.konan.isObjCMetaClass import org.jetbrains.kotlin.builtins.UnsignedType import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Visibilities -import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET @@ -534,19 +532,7 @@ private fun KotlinStubs.createFakeKotlinExternalFunction( cFunctionName: String, isObjCMethod: Boolean ): IrSimpleFunction { - val objCMethodImpAnnotation = if (isObjCMethod) { - val methodInfo = signature.getObjCMethodInfo()!! - createObjCMethodImpAnnotation(methodInfo.selector, methodInfo.encoding, symbols) - } else { - null - } - val bridgeAnnotations = Annotations.create( - listOfNotNull( - createAnnotation(symbols.symbolName.descriptor, "value" to cFunctionName), - objCMethodImpAnnotation - ) - ) - val bridgeDescriptor = WrappedSimpleFunctionDescriptor(bridgeAnnotations) + val bridgeDescriptor = WrappedSimpleFunctionDescriptor() val bridge = IrFunctionImpl( UNDEFINED_OFFSET, UNDEFINED_OFFSET, @@ -563,12 +549,18 @@ private fun KotlinStubs.createFakeKotlinExternalFunction( ) bridgeDescriptor.bind(bridge) + bridge.annotations += buildSimpleAnnotation(irBuiltIns, UNDEFINED_OFFSET, UNDEFINED_OFFSET, + symbols.symbolName.owner, cFunctionName) + + if (isObjCMethod) { + val methodInfo = signature.getObjCMethodInfo()!! + bridge.annotations += buildSimpleAnnotation(irBuiltIns, UNDEFINED_OFFSET, UNDEFINED_OFFSET, + symbols.objCMethodImp.owner, methodInfo.selector, methodInfo.encoding) + } + return bridge } -private fun createObjCMethodImpAnnotation(selector: String, encoding: String, symbols: KonanSymbols) = - createAnnotation(symbols.objCMethodImp.descriptor, "selector" to selector, "encoding" to encoding) - private val cCall = RuntimeNames.cCall private fun IrType.isUnsigned(unsignedType: UnsignedType) = this is IrSimpleType && !this.hasQuestionMark && diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/cgen/CBridgeGenUtils.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/cgen/CBridgeGenUtils.kt index b58af40a5da..a3eb119828f 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/cgen/CBridgeGenUtils.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/cgen/CBridgeGenUtils.kt @@ -5,20 +5,17 @@ import org.jetbrains.kotlin.backend.common.descriptors.WrappedValueParameterDesc import org.jetbrains.kotlin.backend.common.ir.simpleFunctions import org.jetbrains.kotlin.backend.common.lower.irBlock import org.jetbrains.kotlin.backend.common.lower.irThrow -import org.jetbrains.kotlin.backend.konan.descriptors.createAnnotation import org.jetbrains.kotlin.backend.konan.ir.KonanSymbols +import org.jetbrains.kotlin.backend.konan.ir.buildSimpleAnnotation import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Visibilities -import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.builders.* import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.impl.IrFunctionImpl import org.jetbrains.kotlin.ir.declarations.impl.IrValueParameterImpl -import org.jetbrains.kotlin.ir.expressions.IrCall import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.IrMemberAccessExpression -import org.jetbrains.kotlin.ir.expressions.impl.IrConstructorCallImpl import org.jetbrains.kotlin.ir.expressions.impl.IrTryImpl import org.jetbrains.kotlin.ir.symbols.impl.IrSimpleFunctionSymbolImpl import org.jetbrains.kotlin.ir.symbols.impl.IrValueParameterSymbolImpl @@ -72,7 +69,7 @@ internal class KotlinBridgeBuilder( isExternal: Boolean ) { private var counter = 0 - private val bridge: IrFunction = createKotlinBridge(startOffset, endOffset, cName, stubs.symbols, isExternal) + private val bridge: IrFunction = createKotlinBridge(startOffset, endOffset, cName, stubs, isExternal) val irBuilder: IrBuilderWithScope = irBuilder(stubs.irBuiltIns, bridge.symbol).at(startOffset, endOffset) fun addParameter(type: IrType): IrValueParameter { @@ -102,19 +99,10 @@ private fun createKotlinBridge( startOffset: Int, endOffset: Int, cBridgeName: String, - symbols: KonanSymbols, + stubs: KotlinStubs, isExternal: Boolean ): IrFunctionImpl { - val bridgeAnnotations = Annotations.create( - listOf( - if (isExternal) { - createAnnotation(symbols.symbolName.descriptor, "value" to cBridgeName) - } else { - createAnnotation(symbols.exportForCppRuntime.descriptor, "name" to cBridgeName) - } - ) - ) - val bridgeDescriptor = WrappedSimpleFunctionDescriptor(bridgeAnnotations) + val bridgeDescriptor = WrappedSimpleFunctionDescriptor() val bridge = IrFunctionImpl( startOffset, endOffset, @@ -131,9 +119,13 @@ private fun createKotlinBridge( ) bridgeDescriptor.bind(bridge) if (isExternal) { - val constructor = symbols.filterExceptions.owner.constructors.single() - bridge.annotations += - IrConstructorCallImpl.fromSymbolOwner(startOffset, endOffset, constructor.returnType, constructor.symbol) + bridge.annotations += buildSimpleAnnotation(stubs.irBuiltIns, startOffset, endOffset, + stubs.symbols.symbolName.owner, cBridgeName) + bridge.annotations += buildSimpleAnnotation(stubs.irBuiltIns, startOffset, endOffset, + stubs.symbols.filterExceptions.owner) + } else { + bridge.annotations += buildSimpleAnnotation(stubs.irBuiltIns, startOffset, endOffset, + stubs.symbols.exportForCppRuntime.owner, cBridgeName) } return bridge } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/NewIrUtils.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/NewIrUtils.kt index dbd08071a1a..b01b392b6e4 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/NewIrUtils.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/NewIrUtils.kt @@ -7,18 +7,19 @@ package org.jetbrains.kotlin.backend.konan.ir import org.jetbrains.kotlin.backend.common.atMostOne import org.jetbrains.kotlin.backend.konan.descriptors.getArgumentValueOrNull -import org.jetbrains.kotlin.backend.konan.descriptors.isInterface import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.ir.declarations.* -import org.jetbrains.kotlin.ir.expressions.IrCall +import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns import org.jetbrains.kotlin.ir.expressions.IrConst +import org.jetbrains.kotlin.ir.expressions.IrConstructorCall +import org.jetbrains.kotlin.ir.expressions.impl.IrConstImpl +import org.jetbrains.kotlin.ir.expressions.impl.IrConstructorCallImpl import org.jetbrains.kotlin.ir.symbols.IrClassSymbol import org.jetbrains.kotlin.ir.types.classifierOrFail import org.jetbrains.kotlin.ir.types.isMarkedNullable import org.jetbrains.kotlin.ir.util.* -import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name @@ -124,3 +125,16 @@ val IrDeclaration.isGetter get() = this is IrSimpleFunction && this == this.corr val IrDeclaration.isSetter get() = this is IrSimpleFunction && this == this.correspondingProperty?.setter val IrDeclaration.isAccessor get() = this.isGetter || this.isSetter + +fun buildSimpleAnnotation(irBuiltIns: IrBuiltIns, startOffset: Int, endOffset: Int, + annotationClass: IrClass, vararg args: String): IrConstructorCall { + val constructor = annotationClass.constructors.single() + return IrConstructorCallImpl.fromSymbolOwner(startOffset, endOffset, constructor.returnType, constructor.symbol).apply { + args.forEachIndexed { index, arg -> + assert(constructor.valueParameters[index].type == irBuiltIns.stringType) { + "String type expected but was ${constructor.valueParameters[index].type}" + } + putValueArgument(index, IrConstImpl.string(startOffset, endOffset, irBuiltIns.stringType, arg)) + } + } +} \ No newline at end of file diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/InteropLowering.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/InteropLowering.kt index c184545b38e..a046b61e308 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/InteropLowering.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/InteropLowering.kt @@ -24,7 +24,6 @@ import org.jetbrains.kotlin.backend.konan.llvm.llvmSymbolOrigin import org.jetbrains.kotlin.backend.konan.llvm.tryGetIntrinsicType import org.jetbrains.kotlin.builtins.UnsignedTypes import org.jetbrains.kotlin.descriptors.* -import org.jetbrains.kotlin.descriptors.ClassConstructorDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor @@ -390,12 +389,9 @@ internal class InteropLoweringPart1(val context: Context) : BaseInteropIrTransfo } } - // Annotations to be detected in KotlinObjCClassInfoGenerator: - val annotations = createObjCMethodImpAnnotations(selector = selector, encoding = signatureEncoding) - val newDescriptor = SimpleFunctionDescriptorImpl.create( function.descriptor.containingDeclaration, - annotations, + Annotations.EMPTY, ("imp:" + selector).synthesizedName, CallableMemberDescriptor.Kind.SYNTHESIZED, SourceElement.NO_SOURCE @@ -444,6 +440,11 @@ internal class InteropLoweringPart1(val context: Context) : BaseInteropIrTransfo } } + // Annotations to be detected in KotlinObjCClassInfoGenerator: + + newFunction.annotations += buildSimpleAnnotation(context.irBuiltIns, function.startOffset, function.endOffset, + symbols.objCMethodImp.owner, selector, signatureEncoding) + val builder = context.createIrBuilder(newFunction.symbol) newFunction.body = builder.irBlockBody(newFunction) { +irCall(function).apply {