From aab95f93f24681f04e12daefe7b09469b6c5f0a4 Mon Sep 17 00:00:00 2001 From: Georgy Bronnikov Date: Tue, 30 Jun 2020 17:09:31 +0300 Subject: [PATCH] JVM_IR: invoke method descriptor for default lambdas --- .../kotlin/codegen/inline/LambdaInfo.kt | 19 +++++++++++-------- .../backend/jvm/codegen/IrInlineCodegen.kt | 15 ++++++++------- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/LambdaInfo.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/LambdaInfo.kt index 8a12877e512..0b6d032af2a 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/LambdaInfo.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/LambdaInfo.kt @@ -100,6 +100,11 @@ class PsiDefaultLambda( override fun mapAsmSignature(sourceCompiler: SourceCompilerForInline): Method { return sourceCompiler.state.typeMapper.mapSignatureSkipGeneric(invokeMethodDescriptor).asmMethod } + + override fun findInvokeMethodDescriptor(): FunctionDescriptor = + parameterDescriptor.type.memberScope + .getContributedFunctions(OperatorNameConventions.INVOKE, NoLookupLocation.FROM_BACKEND) + .single() } abstract class DefaultLambda( @@ -150,14 +155,10 @@ abstract class DefaultLambda( } }, ClassReader.SKIP_CODE or ClassReader.SKIP_FRAMES or ClassReader.SKIP_DEBUG) - invokeMethodDescriptor = - parameterDescriptor.type.memberScope - .getContributedFunctions(OperatorNameConventions.INVOKE, NoLookupLocation.FROM_BACKEND) - .single() - .let { - //property reference generates erased 'get' method - if (isPropertyReference) it.original else it - } + invokeMethodDescriptor = findInvokeMethodDescriptor().let { + //property reference generates erased 'get' method + if (isPropertyReference) it.original else it + } val descriptor = Type.getMethodDescriptor(Type.VOID_TYPE, *capturedArgs) val constructor = getMethodNode( @@ -206,6 +207,8 @@ abstract class DefaultLambda( protected abstract fun mapAsmSignature(sourceCompiler: SourceCompilerForInline): Method + protected abstract fun findInvokeMethodDescriptor(): FunctionDescriptor + private companion object { val PROPERTY_REFERENCE_SUPER_CLASSES = listOf( diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrInlineCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrInlineCodegen.kt index e3970f76d28..d42f0b47d92 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrInlineCodegen.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrInlineCodegen.kt @@ -14,18 +14,14 @@ import org.jetbrains.kotlin.codegen.inline.* import org.jetbrains.kotlin.codegen.state.GenerationState import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor -import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin -import org.jetbrains.kotlin.ir.declarations.IrFunction -import org.jetbrains.kotlin.ir.declarations.IrValueParameter -import org.jetbrains.kotlin.ir.declarations.IrVariable +import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.descriptors.WrappedSimpleFunctionDescriptor import org.jetbrains.kotlin.ir.expressions.* -import org.jetbrains.kotlin.ir.types.IrType -import org.jetbrains.kotlin.ir.types.classOrNull -import org.jetbrains.kotlin.ir.types.toKotlinType +import org.jetbrains.kotlin.ir.types.* import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.resolve.jvm.AsmTypes import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature +import org.jetbrains.kotlin.util.OperatorNameConventions import org.jetbrains.org.objectweb.asm.Type import org.jetbrains.org.objectweb.asm.commons.Method import org.jetbrains.org.objectweb.asm.tree.MethodNode @@ -268,6 +264,11 @@ class IrDefaultLambda( irValueParameter.type.classOrNull!!.owner.declarations.filterIsInstance().single { it.name.asString() == "invoke" } return (sourceCompiler as IrSourceCompilerForInline).codegen.context.methodSignatureMapper.mapSignatureSkipGeneric(invoke).asmMethod } + + override fun findInvokeMethodDescriptor(): FunctionDescriptor = + (irValueParameter.type.classifierOrFail.owner as IrClass).functions.single { + it.name == OperatorNameConventions.INVOKE + }.descriptor } fun isInlineIrExpression(argumentExpression: IrExpression) =