JVM: remove functionDescriptor from InlineCodegen

This commit is contained in:
pyos
2021-05-27 17:34:41 +02:00
committed by max-kammerer
parent d89e2d9f08
commit b6e9f64e18
7 changed files with 52 additions and 83 deletions
@@ -41,9 +41,7 @@ class IrInlineCodegen(
sourceCompiler: SourceCompilerForInline,
reifiedTypeInliner: ReifiedTypeInliner<IrType>
) :
InlineCodegen<ExpressionCodegen>(
codegen, state, function.toIrBasedDescriptor(), signature, typeParameterMappings, sourceCompiler, reifiedTypeInliner
),
InlineCodegen<ExpressionCodegen>(codegen, state, signature, typeParameterMappings, sourceCompiler, reifiedTypeInliner),
IrInlineCallGenerator {
override fun generateAssertFieldIfNeeded(info: RootInliningContext) {
@@ -126,8 +124,7 @@ class IrInlineCodegen(
expression: IrFunctionAccessExpression,
isInsideIfCondition: Boolean,
) {
// Always look for default lambdas to allow custom default argument handling in compiler plugins.
performInline(inlineDefaultLambdas = true, registerLineNumberAfterwards = isInsideIfCondition)
performInline(isInsideIfCondition, function.isInlineOnly(), function.isSuspend)
}
override fun genCycleStub(text: String, codegen: ExpressionCodegen) {
@@ -135,7 +132,6 @@ class IrInlineCodegen(
}
override fun extractDefaultLambdas(node: MethodNode): List<DefaultLambda> {
if (maskStartIndex == -1) return listOf()
return expandMaskConditionsAndUpdateVariableNodes(
node, maskStartIndex, maskValues, methodHandleInDefaultMethodIndex,
extractDefaultLambdaOffsetAndDescriptor(jvmSignature, function),
@@ -27,6 +27,7 @@ import org.jetbrains.kotlin.ir.descriptors.toIrBasedDescriptor
import org.jetbrains.kotlin.ir.expressions.IrFunctionAccessExpression
import org.jetbrains.kotlin.ir.expressions.IrLoop
import org.jetbrains.kotlin.ir.util.isSuspend
import org.jetbrains.kotlin.ir.util.kotlinFqName
import org.jetbrains.kotlin.ir.util.module
import org.jetbrains.kotlin.ir.util.parentAsClass
import org.jetbrains.kotlin.psi.KtElement
@@ -108,6 +109,9 @@ class IrSourceCompilerForInline(
generateInlineIntrinsicForIr(state.languageVersionSettings, callee.toIrBasedDescriptor())?.let {
return it
}
if (jvmSignature.asmMethod.name != callee.name.asString()) {
trackLookup(callee.parentAsClass.kotlinFqName, jvmSignature.asmMethod.name) // ?
}
callee.parentClassId?.let {
return loadCompiledInlineFunction(it, jvmSignature.asmMethod, callee.isSuspend, callee.hasMangledReturnType, state)
}
@@ -179,7 +179,7 @@ private fun IrDeclarationWithVisibility.specialCaseVisibility(kind: OwnerKind?):
return Opcodes.ACC_PRIVATE
}
if (isInlineOnlyPrivateInBytecode() || isInlineOnlyPropertyAccessor()) {
if (isInlineOnlyPrivateInBytecode()) {
return Opcodes.ACC_PRIVATE
}
@@ -223,26 +223,18 @@ private tailrec fun isInlineOrContainedInInline(declaration: IrDeclaration?): Bo
/* Borrowed from inlineOnly.kt */
fun IrDeclarationWithVisibility.isInlineOnlyOrReifiable(): Boolean =
this is IrFunction && (isReifiable() || isInlineOnly())
fun IrDeclarationWithVisibility.isEffectivelyInlineOnly(): Boolean =
isInlineOnlyOrReifiable() || isInlineOnlyPrivateInBytecode() || isInlineOnlyPropertyAccessor()
this is IrFunction && (isReifiable() || isInlineOnly() || isPrivateInlineSuspend())
fun IrDeclarationWithVisibility.isInlineOnlyPrivateInBytecode(): Boolean =
(this is IrFunction && isInlineOnly()) || isPrivateInlineSuspend()
private fun IrDeclarationWithVisibility.isInlineOnlyPrivateInBytecode(): Boolean =
this is IrFunction && (isInlineOnly() || isPrivateInlineSuspend())
private fun IrDeclarationWithVisibility.isPrivateInlineSuspend(): Boolean =
this is IrFunction && isSuspend && isInline && visibility == DescriptorVisibilities.PRIVATE
private fun IrDeclarationWithVisibility.isInlineOnlyPropertyAccessor(): Boolean {
if (this !is IrSimpleFunction) return false
val propertySymbol = correspondingPropertySymbol ?: return false
return propertySymbol.owner.hasAnnotation(INLINE_ONLY_ANNOTATION_FQ_NAME)
}
private fun IrFunction.isPrivateInlineSuspend(): Boolean =
isSuspend && isInline && visibility == DescriptorVisibilities.PRIVATE
fun IrFunction.isInlineOnly() =
isInline && hasAnnotation(INLINE_ONLY_ANNOTATION_FQ_NAME)
(isInline && hasAnnotation(INLINE_ONLY_ANNOTATION_FQ_NAME)) ||
(this is IrSimpleFunction && correspondingPropertySymbol?.owner?.hasAnnotation(INLINE_ONLY_ANNOTATION_FQ_NAME) == true)
fun IrFunction.isReifiable() = typeParameters.any { it.isReified }