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.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)
@@ -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?)
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.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<IrSymbol, State>
) : Complex, StateWithClosure {
internal class Common private constructor(override val irClass: IrClass, override val fields: Fields) : Complex, StateWithClosure {
override val upValues: MutableMap<IrSymbol, Variable> = mutableMapOf()
override var superWrapperClass: Wrapper? = null
override var outerClass: Pair<IrSymbol, State>? = null
override var outerClass: Field? = null
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.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<IrSymbol, State>?
var outerClass: Field?
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.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<IrSymbol, State>, stackTrace: List<String>
override val irClass: IrClass, override val fields: Fields, stackTrace: List<String>
) : Complex, StateWithClosure, Throwable() {
override val upValues: MutableMap<IrSymbol, Variable> = mutableMapOf()
override var superWrapperClass: Wrapper? = null
override var outerClass: Pair<IrSymbol, State>? = 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<String>): MutableMap<IrSymbol, State> {
private fun evaluateFields(exception: Throwable, irClass: IrClass, stackTrace: List<String>): Fields {
val messageProperty = irClass.getOriginalPropertyByName("message")
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.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<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 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.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<IrSymbol, State>
val fields: Fields
val irClass: IrClass
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.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<IrSymbol, State> = mutableMapOf()
override val fields: Fields = mutableMapOf()
override var superWrapperClass: Wrapper? = null
override var outerClass: Pair<IrSymbol, State>? = null
override var outerClass: Field? = null
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.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<IrSymbol, State> = mutableMapOf()
override val fields: Fields = mutableMapOf()
) : ReflectionState(), StateWithClosure {
override val upValues: MutableMap<IrSymbol, Variable> = mutableMapOf()
@@ -125,8 +127,8 @@ internal class KFunctionState(
constructor(
functionReference: IrFunctionReference,
environment: IrInterpreterEnvironment,
dispatchReceiver: Pair<IrSymbol, State>?,
extensionReceiver: Pair<IrSymbol, State>?
dispatchReceiver: Field?,
extensionReceiver: Field?
) : this(
functionReference.symbol.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.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<IrSymbol, State> = mutableMapOf()
override val fields: Fields = mutableMapOf()
override fun getIrFunctionByIrCall(expression: IrCall): IrFunction? = null