Add quick fix for foreign Kotlin bridges when producing framework
Should fix #1420
This commit is contained in:
committed by
SvyatoslavScherbina
parent
cb4e5399d4
commit
e9f0db8e70
+9
-9
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user