diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/IrDescriptorDeserializer.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/IrDescriptorDeserializer.kt index 6643b452282..eeea0ba31d7 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/IrDescriptorDeserializer.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/IrDescriptorDeserializer.kt @@ -18,11 +18,15 @@ package org.jetbrains.kotlin.backend.konan.serialization import org.jetbrains.kotlin.backend.konan.Context import org.jetbrains.kotlin.backend.konan.descriptors.contributedMethods +import org.jetbrains.kotlin.backend.konan.descriptors.isFunctionInvoke +import org.jetbrains.kotlin.backend.konan.KonanIrDeserializationException import org.jetbrains.kotlin.backend.konan.llvm.base64Decode +import org.jetbrains.kotlin.backend.konan.llvm.symbolName import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.ir.expressions.IrLoop import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.resolve.calls.tasks.* import org.jetbrains.kotlin.resolve.scopes.MemberScope import org.jetbrains.kotlin.serialization.KonanIr import org.jetbrains.kotlin.serialization.KonanIr.KotlinDescriptor @@ -355,10 +359,24 @@ internal class IrDescriptorDeserializer(val context: Context, DeserializedSimpleFunctionDescriptor { val originalIndex = descriptorProto.originalIndex - return functions.single() { + val match = functions.singleOrNull() { val proto = (it as DeserializedSimpleFunctionDescriptor).proto + println("${proto.getExtension(KonanLinkData.functionIndex)} =? ${originalIndex}") proto.getExtension(KonanLinkData.functionIndex) == originalIndex - } as DeserializedSimpleFunctionDescriptor + } as? DeserializedSimpleFunctionDescriptor + if (match != null) return match + + // Special case: for invoke we need to re-synthesize + // the invoke() descriptor. + val invoke = functions.singleOrNull { + (it as FunctionDescriptor).isFunctionInvoke ?: false + } + + if (invoke != null) + return createSynthesizedInvokes(listOf(invoke as FunctionDescriptor)).single() as DeserializedSimpleFunctionDescriptor + else { + error("Could not find matching descriptor") + } } fun selectConstructor(