Introduce some helpful type aliases in interpreter

This commit is contained in:
Ivan Kylchik
2021-08-10 14:29:24 +03:00
committed by TeamCityServer
parent 1808f14677
commit 69fe7e66a5
10 changed files with 34 additions and 20 deletions
@@ -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.CommonProxy.Companion.asProxy
import org.jetbrains.kotlin.ir.interpreter.proxy.Proxy import org.jetbrains.kotlin.ir.interpreter.proxy.Proxy
import org.jetbrains.kotlin.ir.interpreter.stack.CallStack 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.*
import org.jetbrains.kotlin.ir.interpreter.state.reflection.* import org.jetbrains.kotlin.ir.interpreter.state.reflection.*
import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol
@@ -600,8 +601,8 @@ class IrInterpreter(internal val environment: IrInterpreterEnvironment, internal
val function = KFunctionState( val function = KFunctionState(
reference, reference,
environment, environment,
dispatchReceiver?.let { irFunction.getDispatchReceiver()!! to it }, dispatchReceiver?.let { Field(irFunction.getDispatchReceiver()!!, it) },
extensionReceiver?.let { irFunction.getExtensionReceiver()!! to it } extensionReceiver?.let { Field(irFunction.getExtensionReceiver()!!, it) }
) )
if (irFunction.isLocal) callStack.storeUpValues(function) if (irFunction.isLocal) callStack.storeUpValues(function)
callStack.pushState(function) callStack.pushState(function)
@@ -6,5 +6,9 @@
package org.jetbrains.kotlin.ir.interpreter.stack package org.jetbrains.kotlin.ir.interpreter.stack
import org.jetbrains.kotlin.ir.interpreter.state.State import org.jetbrains.kotlin.ir.interpreter.state.State
import org.jetbrains.kotlin.ir.symbols.IrSymbol
internal data class Variable(var state: State?) internal data class Variable(var state: State?)
internal typealias Fields = MutableMap<IrSymbol, State>
internal typealias Field = Pair<IrSymbol, State>
@@ -12,6 +12,8 @@ import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
import org.jetbrains.kotlin.ir.expressions.IrCall import org.jetbrains.kotlin.ir.expressions.IrCall
import org.jetbrains.kotlin.ir.interpreter.createCall import org.jetbrains.kotlin.ir.interpreter.createCall
import org.jetbrains.kotlin.ir.interpreter.fqName 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.interpreter.stack.Variable
import org.jetbrains.kotlin.ir.symbols.IrSymbol import org.jetbrains.kotlin.ir.symbols.IrSymbol
import org.jetbrains.kotlin.ir.types.isNullableAny 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.ir.util.resolveFakeOverride
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
internal class Common private constructor( internal class Common private constructor(override val irClass: IrClass, override val fields: Fields) : Complex, StateWithClosure {
override val irClass: IrClass, override val fields: MutableMap<IrSymbol, State>
) : Complex, StateWithClosure {
override val upValues: MutableMap<IrSymbol, Variable> = mutableMapOf() override val upValues: MutableMap<IrSymbol, Variable> = mutableMapOf()
override var superWrapperClass: Wrapper? = null override var superWrapperClass: Wrapper? = null
override var outerClass: Pair<IrSymbol, State>? = null override var outerClass: Field? = null
constructor(irClass: IrClass) : this(irClass, mutableMapOf()) constructor(irClass: IrClass) : this(irClass, mutableMapOf())
@@ -12,14 +12,14 @@ import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
import org.jetbrains.kotlin.ir.expressions.IrCall import org.jetbrains.kotlin.ir.expressions.IrCall
import org.jetbrains.kotlin.ir.interpreter.fqName import org.jetbrains.kotlin.ir.interpreter.fqName
import org.jetbrains.kotlin.ir.interpreter.stack.CallStack 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.symbols.IrValueSymbol
import org.jetbrains.kotlin.ir.util.overrides import org.jetbrains.kotlin.ir.util.overrides
import org.jetbrains.kotlin.ir.util.resolveFakeOverride import org.jetbrains.kotlin.ir.util.resolveFakeOverride
internal interface Complex : State { internal interface Complex : State {
var superWrapperClass: Wrapper? var superWrapperClass: Wrapper?
var outerClass: Pair<IrSymbol, State>? var outerClass: Field?
fun irClassFqName() = irClass.fqName fun irClassFqName() = irClass.fqName
@@ -7,17 +7,19 @@ package org.jetbrains.kotlin.ir.interpreter.state
import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.declarations.IrClass
import org.jetbrains.kotlin.ir.interpreter.getOriginalPropertyByName 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.interpreter.stack.Variable
import org.jetbrains.kotlin.ir.symbols.IrSymbol import org.jetbrains.kotlin.ir.symbols.IrSymbol
import org.jetbrains.kotlin.ir.util.isSubclassOf import org.jetbrains.kotlin.ir.util.isSubclassOf
import kotlin.math.min import kotlin.math.min
internal class ExceptionState private constructor( internal class ExceptionState private constructor(
override val irClass: IrClass, override val fields: MutableMap<IrSymbol, State>, stackTrace: List<String> override val irClass: IrClass, override val fields: Fields, stackTrace: List<String>
) : Complex, StateWithClosure, Throwable() { ) : Complex, StateWithClosure, Throwable() {
override val upValues: MutableMap<IrSymbol, Variable> = mutableMapOf() override val upValues: MutableMap<IrSymbol, Variable> = mutableMapOf()
override var superWrapperClass: Wrapper? = null override var superWrapperClass: Wrapper? = null
override var outerClass: Pair<IrSymbol, State>? = null override var outerClass: Field? = null
override val message: String? override val message: String?
get() = getField(messageProperty.symbol)?.asStringOrNull() get() = getField(messageProperty.symbol)?.asStringOrNull()
@@ -100,7 +102,7 @@ internal class ExceptionState private constructor(
override fun toString(): String = message?.let { "$exceptionFqName: $it" } ?: exceptionFqName override fun toString(): String = message?.let { "$exceptionFqName: $it" } ?: exceptionFqName
companion object { companion object {
private fun evaluateFields(exception: Throwable, irClass: IrClass, stackTrace: List<String>): MutableMap<IrSymbol, State> { private fun evaluateFields(exception: Throwable, irClass: IrClass, stackTrace: List<String>): Fields {
val messageProperty = irClass.getOriginalPropertyByName("message") val messageProperty = irClass.getOriginalPropertyByName("message")
val causeProperty = irClass.getOriginalPropertyByName("cause") val causeProperty = irClass.getOriginalPropertyByName("cause")
@@ -9,13 +9,14 @@ import org.jetbrains.kotlin.ir.declarations.IrClass
import org.jetbrains.kotlin.ir.declarations.IrFunction import org.jetbrains.kotlin.ir.declarations.IrFunction
import org.jetbrains.kotlin.ir.expressions.IrCall import org.jetbrains.kotlin.ir.expressions.IrCall
import org.jetbrains.kotlin.ir.interpreter.getLastOverridden 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.symbols.IrSymbol
import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.types.classOrNull import org.jetbrains.kotlin.ir.types.classOrNull
import org.jetbrains.kotlin.ir.util.defaultType import org.jetbrains.kotlin.ir.util.defaultType
internal class Primitive<T>(val value: T, val type: IrType) : State { internal class Primitive<T>(val value: T, val type: IrType) : State {
override val fields: MutableMap<IrSymbol, State> = mutableMapOf() override val fields: Fields = mutableMapOf()
override val irClass: IrClass = type.classOrNull!!.owner override val irClass: IrClass = type.classOrNull!!.owner
override fun getField(symbol: IrSymbol): State? = null override fun getField(symbol: IrSymbol): State? = null
@@ -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.exceptions.handleUserException
import org.jetbrains.kotlin.ir.interpreter.isFunction import org.jetbrains.kotlin.ir.interpreter.isFunction
import org.jetbrains.kotlin.ir.interpreter.isKFunction 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.KFunctionState
import org.jetbrains.kotlin.ir.interpreter.state.reflection.ReflectionState import org.jetbrains.kotlin.ir.interpreter.state.reflection.ReflectionState
import org.jetbrains.kotlin.ir.symbols.IrSymbol import org.jetbrains.kotlin.ir.symbols.IrSymbol
@@ -21,7 +22,7 @@ import org.jetbrains.kotlin.ir.util.parentAsClass
import org.jetbrains.kotlin.util.OperatorNameConventions import org.jetbrains.kotlin.util.OperatorNameConventions
internal interface State { internal interface State {
val fields: MutableMap<IrSymbol, State> val fields: Fields
val irClass: IrClass val irClass: IrClass
fun getField(symbol: IrSymbol): State? { fun getField(symbol: IrSymbol): State? {
@@ -10,6 +10,8 @@ import org.jetbrains.kotlin.builtins.functions.BuiltInFunctionArity
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.IrCall import org.jetbrains.kotlin.ir.expressions.IrCall
import org.jetbrains.kotlin.ir.interpreter.* 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.IrFunctionSymbol
import org.jetbrains.kotlin.ir.symbols.IrSymbol import org.jetbrains.kotlin.ir.symbols.IrSymbol
import org.jetbrains.kotlin.ir.types.* import org.jetbrains.kotlin.ir.types.*
@@ -23,10 +25,10 @@ import kotlin.collections.HashMap
import kotlin.collections.LinkedHashMap import kotlin.collections.LinkedHashMap
internal class Wrapper(val value: Any, override val irClass: IrClass, environment: IrInterpreterEnvironment) : Complex { internal class Wrapper(val value: Any, override val irClass: IrClass, environment: IrInterpreterEnvironment) : Complex {
override val fields: MutableMap<IrSymbol, State> = mutableMapOf() override val fields: Fields = mutableMapOf()
override var superWrapperClass: Wrapper? = null override var superWrapperClass: Wrapper? = null
override var outerClass: Pair<IrSymbol, State>? = null override var outerClass: Field? = null
private val receiverClass = irClass.defaultType.getClass(true) private val receiverClass = irClass.defaultType.getClass(true)
@@ -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.KParameterProxy
import org.jetbrains.kotlin.ir.interpreter.proxy.reflection.KTypeParameterProxy import org.jetbrains.kotlin.ir.interpreter.proxy.reflection.KTypeParameterProxy
import org.jetbrains.kotlin.ir.interpreter.proxy.reflection.KTypeProxy 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.stack.Variable
import org.jetbrains.kotlin.ir.interpreter.state.State import org.jetbrains.kotlin.ir.interpreter.state.State
import org.jetbrains.kotlin.ir.interpreter.state.StateWithClosure import org.jetbrains.kotlin.ir.interpreter.state.StateWithClosure
@@ -35,7 +37,7 @@ internal class KFunctionState(
val irFunction: IrFunction, val irFunction: IrFunction,
override val irClass: IrClass, override val irClass: IrClass,
environment: IrInterpreterEnvironment, environment: IrInterpreterEnvironment,
override val fields: MutableMap<IrSymbol, State> = mutableMapOf() override val fields: Fields = mutableMapOf()
) : ReflectionState(), StateWithClosure { ) : ReflectionState(), StateWithClosure {
override val upValues: MutableMap<IrSymbol, Variable> = mutableMapOf() override val upValues: MutableMap<IrSymbol, Variable> = mutableMapOf()
@@ -125,8 +127,8 @@ internal class KFunctionState(
constructor( constructor(
functionReference: IrFunctionReference, functionReference: IrFunctionReference,
environment: IrInterpreterEnvironment, environment: IrInterpreterEnvironment,
dispatchReceiver: Pair<IrSymbol, State>?, dispatchReceiver: Field?,
extensionReceiver: Pair<IrSymbol, State>? extensionReceiver: Field?
) : this( ) : this(
functionReference.symbol.owner, functionReference.symbol.owner,
functionReference.type.classOrNull!!.owner, functionReference.type.classOrNull!!.owner,
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.ir.declarations.IrConstructor
import org.jetbrains.kotlin.ir.declarations.IrFunction import org.jetbrains.kotlin.ir.declarations.IrFunction
import org.jetbrains.kotlin.ir.declarations.IrProperty import org.jetbrains.kotlin.ir.declarations.IrProperty
import org.jetbrains.kotlin.ir.expressions.IrCall 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.interpreter.state.State
import org.jetbrains.kotlin.ir.symbols.IrSymbol import org.jetbrains.kotlin.ir.symbols.IrSymbol
import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.IrType
@@ -18,7 +19,7 @@ import org.jetbrains.kotlin.ir.util.render
import kotlin.math.min import kotlin.math.min
internal abstract class ReflectionState : State { internal abstract class ReflectionState : State {
override val fields: MutableMap<IrSymbol, State> = mutableMapOf() override val fields: Fields = mutableMapOf()
override fun getIrFunctionByIrCall(expression: IrCall): IrFunction? = null override fun getIrFunctionByIrCall(expression: IrCall): IrFunction? = null