Add quick fix for foreign Kotlin bridges when producing framework

Should fix #1420
This commit is contained in:
Svyatoslav Scherbina
2018-03-19 09:53:29 +03:00
committed by SvyatoslavScherbina
parent cb4e5399d4
commit e9f0db8e70
@@ -27,6 +27,7 @@ import org.jetbrains.kotlin.backend.konan.llvm.objc.ObjCCodeGenerator
import org.jetbrains.kotlin.backend.konan.objcexport.* import org.jetbrains.kotlin.backend.konan.objcexport.*
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.ir.declarations.IrConstructor import org.jetbrains.kotlin.ir.declarations.IrConstructor
import org.jetbrains.kotlin.ir.declarations.IrFunction
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.resolve.descriptorUtil.getSuperClassOrAny import org.jetbrains.kotlin.resolve.descriptorUtil.getSuperClassOrAny
@@ -459,7 +460,7 @@ private fun ObjCExportCodeGenerator.emitSpecialClassesConvertions() {
} }
private fun ObjCExportCodeGenerator.generateObjCImp( private fun ObjCExportCodeGenerator.generateObjCImp(
target: FunctionDescriptor?, target: IrFunction?,
methodBridge: MethodBridge, methodBridge: MethodBridge,
isVirtual: Boolean = false isVirtual: Boolean = false
): LLVMValueRef { ): LLVMValueRef {
@@ -497,16 +498,15 @@ private fun ObjCExportCodeGenerator.generateObjCImp(
} }
} }
val targetIr = context.ir.get(target)
val llvmTarget = if (!isVirtual) { val llvmTarget = if (!isVirtual) {
codegen.llvmFunction(targetIr) codegen.llvmFunction(target)
} else { } else {
lookupVirtualImpl(args.first(), targetIr) lookupVirtualImpl(args.first(), target)
} }
val targetResult = callFromBridge(llvmTarget, args, Lifetime.ARGUMENT) val targetResult = callFromBridge(llvmTarget, args, Lifetime.ARGUMENT)
if (target is ConstructorDescriptor) { if (target is IrConstructor) {
ret(param(0)) ret(param(0))
} else when (returnType) { } else when (returnType) {
VoidBridge -> ret(null) VoidBridge -> ret(null)
@@ -652,14 +652,14 @@ private fun ObjCExportCodeGenerator.createMethodVirtualAdapter(
val selector = namer.getSelector(baseMethod) val selector = namer.getSelector(baseMethod)
val methodBridge = mapper.bridgeMethod(baseMethod) val methodBridge = mapper.bridgeMethod(baseMethod)
val objCToKotlin = constPointer(generateObjCImp(baseMethod, methodBridge, isVirtual = true)) val objCToKotlin = constPointer(generateObjCImp(context.ir.get(baseMethod), methodBridge, isVirtual = true))
return ObjCToKotlinMethodAdapter(selector, getEncoding(methodBridge), objCToKotlin) return ObjCToKotlinMethodAdapter(selector, getEncoding(methodBridge), objCToKotlin)
} }
private fun ObjCExportCodeGenerator.createMethodAdapter( private fun ObjCExportCodeGenerator.createMethodAdapter(
implementation: FunctionDescriptor?, implementation: FunctionDescriptor?,
baseMethod: FunctionDescriptor baseMethod: FunctionDescriptor
) = createMethodAdapter(DirectAdapterRequest(implementation, baseMethod)) ) = createMethodAdapter(DirectAdapterRequest(implementation?.let { context.ir.get(it) }, baseMethod))
private fun ObjCExportCodeGenerator.createMethodAdapter( private fun ObjCExportCodeGenerator.createMethodAdapter(
request: DirectAdapterRequest request: DirectAdapterRequest
@@ -856,7 +856,7 @@ private fun ObjCExportCodeGenerator.createTypeAdapter(
) )
} }
internal data class DirectAdapterRequest(val implementation: FunctionDescriptor?, val base: FunctionDescriptor) internal data class DirectAdapterRequest(val implementation: IrFunction?, val base: FunctionDescriptor)
private fun ObjCExportCodeGenerator.createDirectAdapters( private fun ObjCExportCodeGenerator.createDirectAdapters(
method: FunctionDescriptor method: FunctionDescriptor
@@ -871,7 +871,7 @@ private fun ObjCExportCodeGenerator.createDirectAdapters(
context.ir.get(base) as IrSimpleFunction context.ir.get(base) as IrSimpleFunction
).getImplementation(context) ).getImplementation(context)
} }
DirectAdapterRequest(implementation?.descriptor, base) DirectAdapterRequest(implementation, base)
} }
val superClassMethod = method.overriddenDescriptors val superClassMethod = method.overriddenDescriptors