[IR] Move property needsInlining into InlineFunctionResolver
#KT-64807 Fixed
This commit is contained in:
@@ -215,7 +215,6 @@ private val functionInliningPhase = makeIrModulePhase(
|
|||||||
it.innerClassesSupport,
|
it.innerClassesSupport,
|
||||||
alwaysCreateTemporaryVariablesForArguments = true,
|
alwaysCreateTemporaryVariablesForArguments = true,
|
||||||
inlineArgumentsWithOriginalOffset = true,
|
inlineArgumentsWithOriginalOffset = true,
|
||||||
allowExternalInlining = true
|
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
name = "FunctionInliningPhase",
|
name = "FunctionInliningPhase",
|
||||||
|
|||||||
+2
@@ -32,6 +32,8 @@ internal class JsInlineFunctionResolver(context: JsIrBackendContext) : InlineFun
|
|||||||
private val enumEntriesIntrinsic = context.intrinsics.enumEntriesIntrinsic
|
private val enumEntriesIntrinsic = context.intrinsics.enumEntriesIntrinsic
|
||||||
private val inlineFunctionsBeforeInlining = context.mapping.inlineFunctionsBeforeInlining
|
private val inlineFunctionsBeforeInlining = context.mapping.inlineFunctionsBeforeInlining
|
||||||
|
|
||||||
|
override val allowExternalInlining: Boolean = true
|
||||||
|
|
||||||
override fun shouldExcludeFunctionFromInlining(symbol: IrFunctionSymbol): Boolean {
|
override fun shouldExcludeFunctionFromInlining(symbol: IrFunctionSymbol): Boolean {
|
||||||
// TODO: After the expect fun enumEntriesIntrinsic become non-inline function, the code will be removed
|
// TODO: After the expect fun enumEntriesIntrinsic become non-inline function, the code will be removed
|
||||||
return symbol == enumEntriesIntrinsic || super.shouldExcludeFunctionFromInlining(symbol)
|
return symbol == enumEntriesIntrinsic || super.shouldExcludeFunctionFromInlining(symbol)
|
||||||
|
|||||||
@@ -39,6 +39,11 @@ import org.jetbrains.kotlin.name.Name
|
|||||||
import org.jetbrains.kotlin.util.OperatorNameConventions
|
import org.jetbrains.kotlin.util.OperatorNameConventions
|
||||||
|
|
||||||
abstract class InlineFunctionResolver {
|
abstract class InlineFunctionResolver {
|
||||||
|
open val allowExternalInlining: Boolean
|
||||||
|
get() = false
|
||||||
|
|
||||||
|
private val IrFunction.needsInlining get() = this.isInline && (allowExternalInlining || !this.isExternal)
|
||||||
|
|
||||||
open fun getFunctionDeclaration(symbol: IrFunctionSymbol): IrFunction? {
|
open fun getFunctionDeclaration(symbol: IrFunctionSymbol): IrFunction? {
|
||||||
if (shouldExcludeFunctionFromInlining(symbol)) return null
|
if (shouldExcludeFunctionFromInlining(symbol)) return null
|
||||||
|
|
||||||
@@ -47,7 +52,7 @@ abstract class InlineFunctionResolver {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected open fun shouldExcludeFunctionFromInlining(symbol: IrFunctionSymbol): Boolean {
|
protected open fun shouldExcludeFunctionFromInlining(symbol: IrFunctionSymbol): Boolean {
|
||||||
return Symbols.isLateinitIsInitializedPropertyGetter(symbol) || Symbols.isTypeOfIntrinsic(symbol)
|
return !symbol.owner.needsInlining || Symbols.isLateinitIsInitializedPropertyGetter(symbol) || Symbols.isTypeOfIntrinsic(symbol)
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
@@ -85,7 +90,6 @@ class FunctionInlining(
|
|||||||
private val alwaysCreateTemporaryVariablesForArguments: Boolean = false,
|
private val alwaysCreateTemporaryVariablesForArguments: Boolean = false,
|
||||||
private val regenerateInlinedAnonymousObjects: Boolean = false,
|
private val regenerateInlinedAnonymousObjects: Boolean = false,
|
||||||
private val inlineArgumentsWithOriginalOffset: Boolean = false,
|
private val inlineArgumentsWithOriginalOffset: Boolean = false,
|
||||||
private val allowExternalInlining: Boolean = false,
|
|
||||||
) : IrElementTransformerVoidWithContext(), BodyLoweringPass {
|
) : IrElementTransformerVoidWithContext(), BodyLoweringPass {
|
||||||
private var containerScope: ScopeWithIr? = null
|
private var containerScope: ScopeWithIr? = null
|
||||||
|
|
||||||
@@ -102,15 +106,13 @@ class FunctionInlining(
|
|||||||
|
|
||||||
override fun visitFunctionAccess(expression: IrFunctionAccessExpression): IrExpression {
|
override fun visitFunctionAccess(expression: IrFunctionAccessExpression): IrExpression {
|
||||||
expression.transformChildrenVoid(this)
|
expression.transformChildrenVoid(this)
|
||||||
val callee = when (expression) {
|
val calleeSymbol = when (expression) {
|
||||||
is IrCall -> expression.symbol.owner
|
is IrCall -> expression.symbol
|
||||||
is IrConstructorCall -> expression.symbol.owner
|
is IrConstructorCall -> expression.symbol
|
||||||
else -> return expression
|
else -> return expression
|
||||||
}
|
}
|
||||||
if (!callee.needsInlining)
|
|
||||||
return expression
|
|
||||||
|
|
||||||
val actualCallee = inlineFunctionResolver.getFunctionDeclaration(callee.symbol)
|
val actualCallee = inlineFunctionResolver.getFunctionDeclaration(calleeSymbol)
|
||||||
if (actualCallee?.body == null) {
|
if (actualCallee?.body == null) {
|
||||||
return expression
|
return expression
|
||||||
}
|
}
|
||||||
@@ -145,8 +147,6 @@ class FunctionInlining(
|
|||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
private val IrFunction.needsInlining get() = this.isInline && (allowExternalInlining || !this.isExternal)
|
|
||||||
|
|
||||||
private inner class Inliner(
|
private inner class Inliner(
|
||||||
val callSite: IrFunctionAccessExpression,
|
val callSite: IrFunctionAccessExpression,
|
||||||
val callee: IrFunction,
|
val callee: IrFunction,
|
||||||
@@ -385,9 +385,7 @@ class FunctionInlining(
|
|||||||
val inlinedFunction = inlinedFunctionSymbol.owner
|
val inlinedFunction = inlinedFunctionSymbol.owner
|
||||||
return inlineFunctionReference(
|
return inlineFunctionReference(
|
||||||
irCall, irFunctionReference,
|
irCall, irFunctionReference,
|
||||||
if (inlinedFunction.needsInlining)
|
inlineFunctionResolver.getFunctionDeclaration(inlinedFunction.symbol) ?: inlinedFunction
|
||||||
inlineFunctionResolver.getFunctionDeclaration(inlinedFunction.symbol) ?: inlinedFunction
|
|
||||||
else inlinedFunction
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -493,7 +491,7 @@ class FunctionInlining(
|
|||||||
putTypeArgument(index, irFunctionReference.getTypeArgument(index))
|
putTypeArgument(index, irFunctionReference.getTypeArgument(index))
|
||||||
}
|
}
|
||||||
|
|
||||||
return if (inlinedFunction.needsInlining && inlinedFunction.body != null) {
|
return if (inlineFunctionResolver.getFunctionDeclaration(inlinedFunction.symbol)?.body != null) {
|
||||||
inlineFunction(immediateCall, inlinedFunction, irFunctionReference, performRecursiveInline = true)
|
inlineFunction(immediateCall, inlinedFunction, irFunctionReference, performRecursiveInline = true)
|
||||||
} else {
|
} else {
|
||||||
val transformedExpression = super.visitExpression(immediateCall).transform(this@FunctionInlining, null)
|
val transformedExpression = super.visitExpression(immediateCall).transform(this@FunctionInlining, null)
|
||||||
|
|||||||
Reference in New Issue
Block a user