From 69fe7e66a5024f435df014ee2cff885799c67f72 Mon Sep 17 00:00:00 2001 From: Ivan Kylchik Date: Tue, 10 Aug 2021 14:29:24 +0300 Subject: [PATCH] Introduce some helpful type aliases in interpreter --- .../org/jetbrains/kotlin/ir/interpreter/IrInterpreter.kt | 5 +++-- .../org/jetbrains/kotlin/ir/interpreter/stack/Variable.kt | 6 +++++- .../org/jetbrains/kotlin/ir/interpreter/state/Common.kt | 8 ++++---- .../org/jetbrains/kotlin/ir/interpreter/state/Complex.kt | 4 ++-- .../kotlin/ir/interpreter/state/ExceptionState.kt | 8 +++++--- .../jetbrains/kotlin/ir/interpreter/state/Primitive.kt | 3 ++- .../org/jetbrains/kotlin/ir/interpreter/state/State.kt | 3 ++- .../org/jetbrains/kotlin/ir/interpreter/state/Wrapper.kt | 6 ++++-- .../ir/interpreter/state/reflection/KFunctionState.kt | 8 +++++--- .../ir/interpreter/state/reflection/ReflectionState.kt | 3 ++- 10 files changed, 34 insertions(+), 20 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 8798659a45c..08b1a043d91 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 @@ -15,6 +15,7 @@ import org.jetbrains.kotlin.ir.interpreter.exceptions.* import org.jetbrains.kotlin.ir.interpreter.proxy.CommonProxy.Companion.asProxy 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.symbols.IrTypeParameterSymbol @@ -600,8 +601,8 @@ class IrInterpreter(internal val environment: IrInterpreterEnvironment, internal val function = KFunctionState( reference, environment, - dispatchReceiver?.let { irFunction.getDispatchReceiver()!! to it }, - extensionReceiver?.let { irFunction.getExtensionReceiver()!! to it } + dispatchReceiver?.let { Field(irFunction.getDispatchReceiver()!!, it) }, + extensionReceiver?.let { Field(irFunction.getExtensionReceiver()!!, it) } ) if (irFunction.isLocal) callStack.storeUpValues(function) callStack.pushState(function) diff --git a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/stack/Variable.kt b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/stack/Variable.kt index e0cb2774d4c..81dfcc447b1 100644 --- a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/stack/Variable.kt +++ b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/stack/Variable.kt @@ -6,5 +6,9 @@ package org.jetbrains.kotlin.ir.interpreter.stack import org.jetbrains.kotlin.ir.interpreter.state.State +import org.jetbrains.kotlin.ir.symbols.IrSymbol -internal data class Variable(var state: State?) \ No newline at end of file +internal data class Variable(var state: State?) + +internal typealias Fields = MutableMap +internal typealias Field = Pair \ No newline at end of file diff --git a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/Common.kt b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/Common.kt index 62f491c562d..9dafb97ca1c 100644 --- a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/Common.kt +++ b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/Common.kt @@ -12,6 +12,8 @@ import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction import org.jetbrains.kotlin.ir.expressions.IrCall import org.jetbrains.kotlin.ir.interpreter.createCall import org.jetbrains.kotlin.ir.interpreter.fqName +import org.jetbrains.kotlin.ir.interpreter.stack.Field +import org.jetbrains.kotlin.ir.interpreter.stack.Fields import org.jetbrains.kotlin.ir.interpreter.stack.Variable import org.jetbrains.kotlin.ir.symbols.IrSymbol import org.jetbrains.kotlin.ir.types.isNullableAny @@ -19,12 +21,10 @@ import org.jetbrains.kotlin.ir.util.nameForIrSerialization import org.jetbrains.kotlin.ir.util.resolveFakeOverride import org.jetbrains.kotlin.name.Name -internal class Common private constructor( - override val irClass: IrClass, override val fields: MutableMap -) : Complex, StateWithClosure { +internal class Common private constructor(override val irClass: IrClass, override val fields: Fields) : Complex, StateWithClosure { override val upValues: MutableMap = mutableMapOf() override var superWrapperClass: Wrapper? = null - override var outerClass: Pair? = null + override var outerClass: Field? = null constructor(irClass: IrClass) : this(irClass, mutableMapOf()) diff --git a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/Complex.kt b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/Complex.kt index f66061a3cd9..c2965ebd30c 100644 --- a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/Complex.kt +++ b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/Complex.kt @@ -12,14 +12,14 @@ import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction import org.jetbrains.kotlin.ir.expressions.IrCall import org.jetbrains.kotlin.ir.interpreter.fqName import org.jetbrains.kotlin.ir.interpreter.stack.CallStack -import org.jetbrains.kotlin.ir.symbols.IrSymbol +import org.jetbrains.kotlin.ir.interpreter.stack.Field import org.jetbrains.kotlin.ir.symbols.IrValueSymbol import org.jetbrains.kotlin.ir.util.overrides import org.jetbrains.kotlin.ir.util.resolveFakeOverride internal interface Complex : State { var superWrapperClass: Wrapper? - var outerClass: Pair? + var outerClass: Field? fun irClassFqName() = irClass.fqName diff --git a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/ExceptionState.kt b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/ExceptionState.kt index a105bfd6d66..eafbf39b59c 100644 --- a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/ExceptionState.kt +++ b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/ExceptionState.kt @@ -7,17 +7,19 @@ package org.jetbrains.kotlin.ir.interpreter.state import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.interpreter.getOriginalPropertyByName +import org.jetbrains.kotlin.ir.interpreter.stack.Field +import org.jetbrains.kotlin.ir.interpreter.stack.Fields import org.jetbrains.kotlin.ir.interpreter.stack.Variable import org.jetbrains.kotlin.ir.symbols.IrSymbol import org.jetbrains.kotlin.ir.util.isSubclassOf import kotlin.math.min internal class ExceptionState private constructor( - override val irClass: IrClass, override val fields: MutableMap, stackTrace: List + override val irClass: IrClass, override val fields: Fields, stackTrace: List ) : Complex, StateWithClosure, Throwable() { override val upValues: MutableMap = mutableMapOf() override var superWrapperClass: Wrapper? = null - override var outerClass: Pair? = null + override var outerClass: Field? = null override val message: String? get() = getField(messageProperty.symbol)?.asStringOrNull() @@ -100,7 +102,7 @@ internal class ExceptionState private constructor( override fun toString(): String = message?.let { "$exceptionFqName: $it" } ?: exceptionFqName companion object { - private fun evaluateFields(exception: Throwable, irClass: IrClass, stackTrace: List): MutableMap { + private fun evaluateFields(exception: Throwable, irClass: IrClass, stackTrace: List): Fields { val messageProperty = irClass.getOriginalPropertyByName("message") val causeProperty = irClass.getOriginalPropertyByName("cause") diff --git a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/Primitive.kt b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/Primitive.kt index 7265ae406b9..443aeeaa426 100644 --- a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/Primitive.kt +++ b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/Primitive.kt @@ -9,13 +9,14 @@ import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.declarations.IrFunction import org.jetbrains.kotlin.ir.expressions.IrCall import org.jetbrains.kotlin.ir.interpreter.getLastOverridden +import org.jetbrains.kotlin.ir.interpreter.stack.Fields import org.jetbrains.kotlin.ir.symbols.IrSymbol import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.classOrNull import org.jetbrains.kotlin.ir.util.defaultType internal class Primitive(val value: T, val type: IrType) : State { - override val fields: MutableMap = mutableMapOf() + override val fields: Fields = mutableMapOf() override val irClass: IrClass = type.classOrNull!!.owner override fun getField(symbol: IrSymbol): State? = null diff --git a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/State.kt b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/State.kt index 87a9d59c6d6..fd6dc84c073 100644 --- a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/State.kt +++ b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/State.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.ir.interpreter.IrInterpreterEnvironment import org.jetbrains.kotlin.ir.interpreter.exceptions.handleUserException import org.jetbrains.kotlin.ir.interpreter.isFunction import org.jetbrains.kotlin.ir.interpreter.isKFunction +import org.jetbrains.kotlin.ir.interpreter.stack.Fields import org.jetbrains.kotlin.ir.interpreter.state.reflection.KFunctionState import org.jetbrains.kotlin.ir.interpreter.state.reflection.ReflectionState import org.jetbrains.kotlin.ir.symbols.IrSymbol @@ -21,7 +22,7 @@ import org.jetbrains.kotlin.ir.util.parentAsClass import org.jetbrains.kotlin.util.OperatorNameConventions internal interface State { - val fields: MutableMap + val fields: Fields val irClass: IrClass fun getField(symbol: IrSymbol): State? { diff --git a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/Wrapper.kt b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/Wrapper.kt index 1bfe1629007..15f65c5bcae 100644 --- a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/Wrapper.kt +++ b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/Wrapper.kt @@ -10,6 +10,8 @@ import org.jetbrains.kotlin.builtins.functions.BuiltInFunctionArity import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.IrCall import org.jetbrains.kotlin.ir.interpreter.* +import org.jetbrains.kotlin.ir.interpreter.stack.Field +import org.jetbrains.kotlin.ir.interpreter.stack.Fields import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol import org.jetbrains.kotlin.ir.symbols.IrSymbol import org.jetbrains.kotlin.ir.types.* @@ -23,10 +25,10 @@ import kotlin.collections.HashMap import kotlin.collections.LinkedHashMap internal class Wrapper(val value: Any, override val irClass: IrClass, environment: IrInterpreterEnvironment) : Complex { - override val fields: MutableMap = mutableMapOf() + override val fields: Fields = mutableMapOf() override var superWrapperClass: Wrapper? = null - override var outerClass: Pair? = null + override var outerClass: Field? = null private val receiverClass = irClass.defaultType.getClass(true) diff --git a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/reflection/KFunctionState.kt b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/reflection/KFunctionState.kt index 7c21460cdab..7d9fde21047 100644 --- a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/reflection/KFunctionState.kt +++ b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/reflection/KFunctionState.kt @@ -14,6 +14,8 @@ import org.jetbrains.kotlin.ir.interpreter.* import org.jetbrains.kotlin.ir.interpreter.proxy.reflection.KParameterProxy import org.jetbrains.kotlin.ir.interpreter.proxy.reflection.KTypeParameterProxy import org.jetbrains.kotlin.ir.interpreter.proxy.reflection.KTypeProxy +import org.jetbrains.kotlin.ir.interpreter.stack.Field +import org.jetbrains.kotlin.ir.interpreter.stack.Fields import org.jetbrains.kotlin.ir.interpreter.stack.Variable import org.jetbrains.kotlin.ir.interpreter.state.State import org.jetbrains.kotlin.ir.interpreter.state.StateWithClosure @@ -35,7 +37,7 @@ internal class KFunctionState( val irFunction: IrFunction, override val irClass: IrClass, environment: IrInterpreterEnvironment, - override val fields: MutableMap = mutableMapOf() + override val fields: Fields = mutableMapOf() ) : ReflectionState(), StateWithClosure { override val upValues: MutableMap = mutableMapOf() @@ -125,8 +127,8 @@ internal class KFunctionState( constructor( functionReference: IrFunctionReference, environment: IrInterpreterEnvironment, - dispatchReceiver: Pair?, - extensionReceiver: Pair? + dispatchReceiver: Field?, + extensionReceiver: Field? ) : this( functionReference.symbol.owner, functionReference.type.classOrNull!!.owner, diff --git a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/reflection/ReflectionState.kt b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/reflection/ReflectionState.kt index 79efd5703a4..b3117cf53d2 100644 --- a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/reflection/ReflectionState.kt +++ b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/reflection/ReflectionState.kt @@ -9,6 +9,7 @@ import org.jetbrains.kotlin.ir.declarations.IrConstructor import org.jetbrains.kotlin.ir.declarations.IrFunction import org.jetbrains.kotlin.ir.declarations.IrProperty import org.jetbrains.kotlin.ir.expressions.IrCall +import org.jetbrains.kotlin.ir.interpreter.stack.Fields import org.jetbrains.kotlin.ir.interpreter.state.State import org.jetbrains.kotlin.ir.symbols.IrSymbol import org.jetbrains.kotlin.ir.types.IrType @@ -18,7 +19,7 @@ import org.jetbrains.kotlin.ir.util.render import kotlin.math.min internal abstract class ReflectionState : State { - override val fields: MutableMap = mutableMapOf() + override val fields: Fields = mutableMapOf() override fun getIrFunctionByIrCall(expression: IrCall): IrFunction? = null