JVM: inline createInlineMethodNode into InlineCodegenForDefaultBody

Most of it is unused, since there we know the target function will also
need to be compiled from source.
This commit is contained in:
pyos
2021-05-26 11:38:33 +02:00
committed by max-kammerer
parent 4c7eb815fc
commit 7bcd738bb1
6 changed files with 19 additions and 35 deletions
@@ -2969,7 +2969,7 @@ public class ExpressionCodegen extends KtVisitor<StackValue, StackValue> impleme
} }
Type methodOwner = typeMapper.mapImplementationOwner(functionDescriptor); Type methodOwner = typeMapper.mapImplementationOwner(functionDescriptor);
if (isDefaultCompilation) { if (isDefaultCompilation) {
return new InlineCodegenForDefaultBody(functionDescriptor, this, state, methodOwner, signature, sourceCompiler); return new InlineCodegenForDefaultBody(functionDescriptor, this, state, signature, sourceCompiler);
} }
else { else {
return new PsiInlineCodegen(this, state, functionDescriptor, methodOwner, signature, typeParameterMappings, sourceCompiler, return new PsiInlineCodegen(this, state, functionDescriptor, methodOwner, signature, typeParameterMappings, sourceCompiler,
@@ -59,11 +59,7 @@ abstract class InlineCodegen<out T : BaseExpressionCodegen>(
private val initialFrameSize = codegen.frameMap.currentSize private val initialFrameSize = codegen.frameMap.currentSize
protected val invocationParamBuilder = ParametersBuilder.newBuilder() protected val invocationParamBuilder = ParametersBuilder.newBuilder()
protected val expressionMap = linkedMapOf<Int, FunctionalArgument>() protected val expressionMap = linkedMapOf<Int, FunctionalArgument>()
private val sourceMapper = sourceCompiler.lazySourceMapper
protected val maskValues = ArrayList<Int>() protected val maskValues = ArrayList<Int>()
protected var maskStartIndex = -1 protected var maskStartIndex = -1
protected var methodHandleInDefaultMethodIndex = -1 protected var methodHandleInDefaultMethodIndex = -1
@@ -209,6 +205,7 @@ abstract class InlineCodegen<out T : BaseExpressionCodegen>(
sourceCompiler, sourceCompiler.inlineCallSiteInfo, reifiedTypeInliner, typeParameterMappings sourceCompiler, sourceCompiler.inlineCallSiteInfo, reifiedTypeInliner, typeParameterMappings
) )
val sourceMapper = sourceCompiler.sourceMapper
val sourceInfo = sourceMapper.sourceInfo!! val sourceInfo = sourceMapper.sourceInfo!!
val callSite = SourcePosition(codegen.lastLineNumber, sourceInfo.sourceFileName!!, sourceInfo.pathOrCleanFQN) val callSite = SourcePosition(codegen.lastLineNumber, sourceInfo.sourceFileName!!, sourceInfo.pathOrCleanFQN)
val inliner = MethodInliner( val inliner = MethodInliner(
@@ -431,8 +428,7 @@ abstract class InlineCodegen<out T : BaseExpressionCodegen>(
) )
} }
private fun createInlineMethodNode(
internal fun createInlineMethodNode(
callDefault: Boolean, callDefault: Boolean,
typeArguments: List<TypeParameterMarker>?, typeArguments: List<TypeParameterMarker>?,
typeSystem: TypeSystemCommonBackendContext typeSystem: TypeSystemCommonBackendContext
@@ -15,15 +15,13 @@ import org.jetbrains.kotlin.resolve.inline.InlineUtil
import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature
import org.jetbrains.org.objectweb.asm.Label import org.jetbrains.org.objectweb.asm.Label
import org.jetbrains.org.objectweb.asm.Type import org.jetbrains.org.objectweb.asm.Type
import org.jetbrains.org.objectweb.asm.tree.MethodNode
class InlineCodegenForDefaultBody( class InlineCodegenForDefaultBody(
private val function: FunctionDescriptor, private val function: FunctionDescriptor,
codegen: ExpressionCodegen, codegen: ExpressionCodegen,
val state: GenerationState, val state: GenerationState,
private val methodOwner: Type,
private val jvmSignature: JvmMethodSignature, private val jvmSignature: JvmMethodSignature,
private val sourceCompilerForInline: SourceCompilerForInline private val sourceCompilerForInline: PsiSourceCompilerForInline
) : CallGenerator { ) : CallGenerator {
private val sourceMapper: SourceMapper = codegen.parentCodegen.orCreateSourceMapper private val sourceMapper: SourceMapper = codegen.parentCodegen.orCreateSourceMapper
@@ -39,32 +37,22 @@ class InlineCodegenForDefaultBody(
} }
override fun genCallInner(callableMethod: Callable, resolvedCall: ResolvedCall<*>?, callDefault: Boolean, codegen: ExpressionCodegen) { override fun genCallInner(callableMethod: Callable, resolvedCall: ResolvedCall<*>?, callDefault: Boolean, codegen: ExpressionCodegen) {
val nodeAndSmap = PsiInlineCodegen( assert(!callDefault) { "inlining default stub into another default stub" }
codegen, state, function, methodOwner, jvmSignature, TypeParameterMappings(), sourceCompilerForInline val (node, smap) = sourceCompilerForInline.compileInlineFunction(jvmSignature, callDefault, jvmSignature.asmMethod)
).createInlineMethodNode( val childSourceMapper = SourceMapCopier(sourceMapper, smap)
callDefault, null, codegen.typeSystem
)
val childSourceMapper = SourceMapCopier(sourceMapper, nodeAndSmap.classSMAP)
val node = nodeAndSmap.node
val transformedMethod = MethodNode(
node.access,
node.name,
node.desc,
node.signature,
node.exceptions.toTypedArray()
)
val argsSize = val argsSize =
(Type.getArgumentsAndReturnSizes(jvmSignature.asmMethod.descriptor) ushr 2) - if (callableMethod.isStaticCall()) 1 else 0 (Type.getArgumentsAndReturnSizes(jvmSignature.asmMethod.descriptor) ushr 2) - if (callableMethod.isStaticCall()) 1 else 0
node.accept(object : InlineAdapter(transformedMethod, 0, childSourceMapper) { // `$default` is only for Kotlin use so it has no `$$forInline` version - this *is* what the inliner will use.
override fun visitLocalVariable(name: String, desc: String, signature: String?, start: Label, end: Label, index: Int) { node.preprocessSuspendMarkers(forInline = true, keepFakeContinuation = false)
val startLabel = if (index < argsSize) methodStartLabel else start node.accept(object : MethodBodyVisitor(codegen.visitor) {
super.visitLocalVariable(name, desc, signature, startLabel, end, index) // The LVT was not generated at all, so move the start of parameters to the start of the method.
} override fun visitLocalVariable(name: String, desc: String, signature: String?, start: Label, end: Label, index: Int) =
}) super.visitLocalVariable(name, desc, signature, if (index < argsSize) methodStartLabel else start, end, index)
transformedMethod.accept(MethodBodyVisitor(codegen.visitor)) override fun visitLineNumber(line: Int, start: Label) =
super.visitLineNumber(childSourceMapper.mapLineNumber(line), start)
})
} }
override fun genValueAndPut( override fun genValueAndPut(
@@ -82,7 +82,7 @@ class PsiSourceCompilerForInline(
) )
} }
override val lazySourceMapper override val sourceMapper
get() = codegen.parentCodegen.orCreateSourceMapper get() = codegen.parentCodegen.orCreateSourceMapper
override fun generateLambdaBody(lambdaInfo: ExpressionLambda, reifiedTypeParameters: ReifiedTypeParametersUsages): SMAPAndMethodNode { override fun generateLambdaBody(lambdaInfo: ExpressionLambda, reifiedTypeParameters: ReifiedTypeParametersUsages): SMAPAndMethodNode {
@@ -33,7 +33,7 @@ interface SourceCompilerForInline {
val inlineCallSiteInfo: InlineCallSiteInfo val inlineCallSiteInfo: InlineCallSiteInfo
val lazySourceMapper: SourceMapper val sourceMapper: SourceMapper
fun generateLambdaBody(lambdaInfo: ExpressionLambda, reifiedTypeParameters: ReifiedTypeParametersUsages): SMAPAndMethodNode fun generateLambdaBody(lambdaInfo: ExpressionLambda, reifiedTypeParameters: ReifiedTypeParametersUsages): SMAPAndMethodNode
@@ -91,7 +91,7 @@ class IrSourceCompilerForInline(
) )
} }
override val lazySourceMapper: SourceMapper override val sourceMapper: SourceMapper
get() = codegen.smap get() = codegen.smap
override fun generateLambdaBody(lambdaInfo: ExpressionLambda, reifiedTypeParameters: ReifiedTypeParametersUsages): SMAPAndMethodNode { override fun generateLambdaBody(lambdaInfo: ExpressionLambda, reifiedTypeParameters: ReifiedTypeParametersUsages): SMAPAndMethodNode {