[IR] Try to tun IrInterpreterKCallableNamePreprocessor only once
#KT-58923 Fixed
This commit is contained in:
+4
-1
@@ -19,6 +19,7 @@ import org.jetbrains.kotlin.ir.interpreter.IrInterpreterEnvironment
|
||||
import org.jetbrains.kotlin.ir.interpreter.checker.EvaluationMode
|
||||
import org.jetbrains.kotlin.ir.interpreter.transformer.preprocessForConstTransformer
|
||||
import org.jetbrains.kotlin.ir.interpreter.transformer.runConstOptimizations
|
||||
import org.jetbrains.kotlin.ir.interpreter.transformer.transformConst
|
||||
|
||||
class ConstEvaluationLowering(
|
||||
val context: CommonBackendContext,
|
||||
@@ -33,7 +34,9 @@ class ConstEvaluationLowering(
|
||||
private val mode = EvaluationMode.ONLY_INTRINSIC_CONST
|
||||
|
||||
override fun lower(irFile: IrFile) {
|
||||
irFile.runConstOptimizations(
|
||||
val useFir = context.configuration[CommonConfigurationKeys.USE_FIR] == true
|
||||
val preprocessedFile = if (useFir) irFile else irFile.preprocessForConstTransformer(interpreter, mode)
|
||||
preprocessedFile.runConstOptimizations(
|
||||
interpreter, mode, evaluatedConstTracker, inlineConstTracker, onWarning, onError, suppressErrors
|
||||
)
|
||||
}
|
||||
|
||||
+13
-1
@@ -5,6 +5,7 @@
|
||||
|
||||
package org.jetbrains.kotlin.ir.interpreter.preprocessor
|
||||
|
||||
import org.jetbrains.kotlin.builtins.StandardNames
|
||||
import org.jetbrains.kotlin.ir.IrBuiltIns
|
||||
import org.jetbrains.kotlin.ir.IrElement
|
||||
import org.jetbrains.kotlin.ir.declarations.IrClass
|
||||
@@ -16,6 +17,11 @@ import org.jetbrains.kotlin.ir.expressions.IrGetEnumValue
|
||||
import org.jetbrains.kotlin.ir.expressions.IrGetValue
|
||||
import org.jetbrains.kotlin.ir.expressions.impl.IrCompositeImpl
|
||||
import org.jetbrains.kotlin.ir.interpreter.property
|
||||
import org.jetbrains.kotlin.ir.types.IrSimpleType
|
||||
import org.jetbrains.kotlin.ir.types.classFqName
|
||||
import org.jetbrains.kotlin.ir.types.typeOrNull
|
||||
import org.jetbrains.kotlin.ir.types.typeWith
|
||||
import org.jetbrains.kotlin.ir.util.isKFunction
|
||||
import org.jetbrains.kotlin.ir.util.isSubclassOf
|
||||
import org.jetbrains.kotlin.name.SpecialNames
|
||||
|
||||
@@ -23,7 +29,6 @@ import org.jetbrains.kotlin.name.SpecialNames
|
||||
// This code will be optimized but not completely turned into "ab" result.
|
||||
class IrInterpreterKCallableNamePreprocessor : IrInterpreterPreprocessor {
|
||||
override fun visitCall(expression: IrCall, data: IrInterpreterPreprocessorData): IrElement {
|
||||
if (!data.mode.canEvaluateFunction(expression.symbol.owner)) return super.visitCall(expression, data)
|
||||
if (!expression.isKCallableNameCall(data.irBuiltIns)) return super.visitCall(expression, data)
|
||||
|
||||
val callableReference = expression.dispatchReceiver as? IrCallableReference<*> ?: return super.visitCall(expression, data)
|
||||
@@ -31,6 +36,13 @@ class IrInterpreterKCallableNamePreprocessor : IrInterpreterPreprocessor {
|
||||
// receiver is needed for bound callable reference
|
||||
val receiver = callableReference.dispatchReceiver ?: callableReference.extensionReceiver ?: return expression
|
||||
|
||||
val typeArguments = (callableReference.type as IrSimpleType).arguments.map { it.typeOrNull!! }
|
||||
if (callableReference.type.isKFunction()) {
|
||||
val kFunction = data.irBuiltIns.kFunctionN(typeArguments.size)
|
||||
val newType = kFunction.typeWith(receiver.type, *typeArguments.toTypedArray())
|
||||
callableReference.type = newType
|
||||
}
|
||||
|
||||
callableReference.dispatchReceiver = null
|
||||
callableReference.extensionReceiver = null
|
||||
if (receiver is IrGetValue && receiver.symbol.owner.name == SpecialNames.THIS) return expression
|
||||
|
||||
+2
-3
@@ -61,12 +61,11 @@ fun IrFile.runConstOptimizations(
|
||||
onError: (IrFile, IrElement, IrErrorExpression) -> Unit = { _, _, _ -> },
|
||||
suppressExceptions: Boolean = false,
|
||||
) {
|
||||
val preprocessedFile = this.preprocessForConstTransformer(interpreter, mode)
|
||||
val checker = IrInterpreterCommonChecker()
|
||||
val irConstExpressionTransformer = IrConstAllTransformer(
|
||||
interpreter, preprocessedFile, mode, checker, evaluatedConstTracker, inlineConstTracker, onWarning, onError, suppressExceptions
|
||||
interpreter, this, mode, checker, evaluatedConstTracker, inlineConstTracker, onWarning, onError, suppressExceptions
|
||||
)
|
||||
preprocessedFile.transform(irConstExpressionTransformer, null)
|
||||
this.transform(irConstExpressionTransformer, null)
|
||||
}
|
||||
|
||||
fun IrFile.preprocessForConstTransformer(
|
||||
|
||||
Reference in New Issue
Block a user