JVM_IR: invoke method descriptor for default lambdas
This commit is contained in:
@@ -100,6 +100,11 @@ class PsiDefaultLambda(
|
|||||||
override fun mapAsmSignature(sourceCompiler: SourceCompilerForInline): Method {
|
override fun mapAsmSignature(sourceCompiler: SourceCompilerForInline): Method {
|
||||||
return sourceCompiler.state.typeMapper.mapSignatureSkipGeneric(invokeMethodDescriptor).asmMethod
|
return sourceCompiler.state.typeMapper.mapSignatureSkipGeneric(invokeMethodDescriptor).asmMethod
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun findInvokeMethodDescriptor(): FunctionDescriptor =
|
||||||
|
parameterDescriptor.type.memberScope
|
||||||
|
.getContributedFunctions(OperatorNameConventions.INVOKE, NoLookupLocation.FROM_BACKEND)
|
||||||
|
.single()
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract class DefaultLambda(
|
abstract class DefaultLambda(
|
||||||
@@ -150,14 +155,10 @@ abstract class DefaultLambda(
|
|||||||
}
|
}
|
||||||
}, ClassReader.SKIP_CODE or ClassReader.SKIP_FRAMES or ClassReader.SKIP_DEBUG)
|
}, ClassReader.SKIP_CODE or ClassReader.SKIP_FRAMES or ClassReader.SKIP_DEBUG)
|
||||||
|
|
||||||
invokeMethodDescriptor =
|
invokeMethodDescriptor = findInvokeMethodDescriptor().let {
|
||||||
parameterDescriptor.type.memberScope
|
//property reference generates erased 'get' method
|
||||||
.getContributedFunctions(OperatorNameConventions.INVOKE, NoLookupLocation.FROM_BACKEND)
|
if (isPropertyReference) it.original else it
|
||||||
.single()
|
}
|
||||||
.let {
|
|
||||||
//property reference generates erased 'get' method
|
|
||||||
if (isPropertyReference) it.original else it
|
|
||||||
}
|
|
||||||
|
|
||||||
val descriptor = Type.getMethodDescriptor(Type.VOID_TYPE, *capturedArgs)
|
val descriptor = Type.getMethodDescriptor(Type.VOID_TYPE, *capturedArgs)
|
||||||
val constructor = getMethodNode(
|
val constructor = getMethodNode(
|
||||||
@@ -206,6 +207,8 @@ abstract class DefaultLambda(
|
|||||||
|
|
||||||
protected abstract fun mapAsmSignature(sourceCompiler: SourceCompilerForInline): Method
|
protected abstract fun mapAsmSignature(sourceCompiler: SourceCompilerForInline): Method
|
||||||
|
|
||||||
|
protected abstract fun findInvokeMethodDescriptor(): FunctionDescriptor
|
||||||
|
|
||||||
private companion object {
|
private companion object {
|
||||||
val PROPERTY_REFERENCE_SUPER_CLASSES =
|
val PROPERTY_REFERENCE_SUPER_CLASSES =
|
||||||
listOf(
|
listOf(
|
||||||
|
|||||||
+8
-7
@@ -14,18 +14,14 @@ import org.jetbrains.kotlin.codegen.inline.*
|
|||||||
import org.jetbrains.kotlin.codegen.state.GenerationState
|
import org.jetbrains.kotlin.codegen.state.GenerationState
|
||||||
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor
|
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
|
import org.jetbrains.kotlin.ir.declarations.*
|
||||||
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.descriptors.WrappedSimpleFunctionDescriptor
|
import org.jetbrains.kotlin.ir.descriptors.WrappedSimpleFunctionDescriptor
|
||||||
import org.jetbrains.kotlin.ir.expressions.*
|
import org.jetbrains.kotlin.ir.expressions.*
|
||||||
import org.jetbrains.kotlin.ir.types.IrType
|
import org.jetbrains.kotlin.ir.types.*
|
||||||
import org.jetbrains.kotlin.ir.types.classOrNull
|
|
||||||
import org.jetbrains.kotlin.ir.types.toKotlinType
|
|
||||||
import org.jetbrains.kotlin.ir.util.*
|
import org.jetbrains.kotlin.ir.util.*
|
||||||
import org.jetbrains.kotlin.resolve.jvm.AsmTypes
|
import org.jetbrains.kotlin.resolve.jvm.AsmTypes
|
||||||
import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature
|
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.Type
|
||||||
import org.jetbrains.org.objectweb.asm.commons.Method
|
import org.jetbrains.org.objectweb.asm.commons.Method
|
||||||
import org.jetbrains.org.objectweb.asm.tree.MethodNode
|
import org.jetbrains.org.objectweb.asm.tree.MethodNode
|
||||||
@@ -268,6 +264,11 @@ class IrDefaultLambda(
|
|||||||
irValueParameter.type.classOrNull!!.owner.declarations.filterIsInstance<IrFunction>().single { it.name.asString() == "invoke" }
|
irValueParameter.type.classOrNull!!.owner.declarations.filterIsInstance<IrFunction>().single { it.name.asString() == "invoke" }
|
||||||
return (sourceCompiler as IrSourceCompilerForInline).codegen.context.methodSignatureMapper.mapSignatureSkipGeneric(invoke).asmMethod
|
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) =
|
fun isInlineIrExpression(argumentExpression: IrExpression) =
|
||||||
|
|||||||
Reference in New Issue
Block a user