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.descriptors.*
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.name.FqName
import org.jetbrains.kotlin.resolve.descriptorUtil.getSuperClassOrAny
@@ -459,7 +460,7 @@ private fun ObjCExportCodeGenerator.emitSpecialClassesConvertions() {
}
private fun ObjCExportCodeGenerator.generateObjCImp(
target: FunctionDescriptor?,
target: IrFunction?,
methodBridge: MethodBridge,
isVirtual: Boolean = false
): LLVMValueRef {
@@ -497,16 +498,15 @@ private fun ObjCExportCodeGenerator.generateObjCImp(
}
}
val targetIr = context.ir.get(target)
val llvmTarget = if (!isVirtual) {
codegen.llvmFunction(targetIr)
codegen.llvmFunction(target)
} else {
lookupVirtualImpl(args.first(), targetIr)
lookupVirtualImpl(args.first(), target)
}
val targetResult = callFromBridge(llvmTarget, args, Lifetime.ARGUMENT)
if (target is ConstructorDescriptor) {
if (target is IrConstructor) {
ret(param(0))
} else when (returnType) {
VoidBridge -> ret(null)
@@ -652,14 +652,14 @@ private fun ObjCExportCodeGenerator.createMethodVirtualAdapter(
val selector = namer.getSelector(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)
}
private fun ObjCExportCodeGenerator.createMethodAdapter(
implementation: FunctionDescriptor?,
baseMethod: FunctionDescriptor
) = createMethodAdapter(DirectAdapterRequest(implementation, baseMethod))
) = createMethodAdapter(DirectAdapterRequest(implementation?.let { context.ir.get(it) }, baseMethod))
private fun ObjCExportCodeGenerator.createMethodAdapter(
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(
method: FunctionDescriptor
@@ -871,7 +871,7 @@ private fun ObjCExportCodeGenerator.createDirectAdapters(
context.ir.get(base) as IrSimpleFunction
).getImplementation(context)
}
DirectAdapterRequest(implementation?.descriptor, base)
DirectAdapterRequest(implementation, base)
}
val superClassMethod = method.overriddenDescriptors