From d795ce35821c3b8a1e90a733acf7b9e5fc2860ce Mon Sep 17 00:00:00 2001 From: Ivan Kylchik Date: Tue, 18 Jul 2023 12:06:09 +0200 Subject: [PATCH] [IR] Simplify logic of `interpretCall` Drop excess call of `callStack.loadState(it)` when store state for extension receiver. When we interpret lambda with extension receiver, this receiver will be actually represented as a value parameter, and it required some additional processing. Apparently, after all interpreter's refactorings, this does not matter anymore and excess call can be dropped. --- .../org/jetbrains/kotlin/ir/interpreter/IrInterpreter.kt | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/IrInterpreter.kt b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/IrInterpreter.kt index baaecafcb6f..8ff658747ad 100644 --- a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/IrInterpreter.kt +++ b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/IrInterpreter.kt @@ -17,7 +17,10 @@ import org.jetbrains.kotlin.ir.interpreter.proxy.Proxy import org.jetbrains.kotlin.ir.interpreter.stack.CallStack import org.jetbrains.kotlin.ir.interpreter.stack.Field import org.jetbrains.kotlin.ir.interpreter.state.* -import org.jetbrains.kotlin.ir.interpreter.state.reflection.* +import org.jetbrains.kotlin.ir.interpreter.state.reflection.KClassState +import org.jetbrains.kotlin.ir.interpreter.state.reflection.KFunctionState +import org.jetbrains.kotlin.ir.interpreter.state.reflection.KPropertyState +import org.jetbrains.kotlin.ir.interpreter.state.reflection.KTypeState import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol import org.jetbrains.kotlin.ir.types.* import org.jetbrains.kotlin.ir.util.* @@ -171,8 +174,8 @@ class IrInterpreter(internal val environment: IrInterpreterEnvironment, internal if (irFunction.isLocal) callStack.copyUpValuesFromPreviousFrame() // 5. store arguments in memory (remap args on actual names) - irFunction.getDispatchReceiver()?.let { callStack.storeState(it, dispatchReceiver!!) } - irFunction.getExtensionReceiver()?.let { callStack.storeState(it, extensionReceiver ?: callStack.loadState(it)) } + irFunction.getDispatchReceiver()?.let { callStack.storeState(it, dispatchReceiver) } + irFunction.getExtensionReceiver()?.let { callStack.storeState(it, extensionReceiver) } irFunction.valueParameters.forEachIndexed { i, param -> callStack.storeState(param.symbol, valueArguments[i]) } // `call.type` is used in check cast and emptyArray callStack.storeState(irFunction.symbol, KTypeState(call.type, environment.kTypeClass.owner))