Implement interpretation for expect enum class
This commit is contained in:
+13
-1
@@ -38,7 +38,7 @@ class IrInterpreter(irModule: IrModuleFragment) {
|
|||||||
|
|
||||||
private val stackTrace = mutableListOf<String>()
|
private val stackTrace = mutableListOf<String>()
|
||||||
|
|
||||||
private val mapOfEnums = mutableMapOf<Pair<IrClass, String>, Common>()
|
private val mapOfEnums = mutableMapOf<Pair<IrClass, String>, Complex>()
|
||||||
|
|
||||||
private fun Any?.getType(defaultType: IrType): IrType {
|
private fun Any?.getType(defaultType: IrType): IrType {
|
||||||
return when (this) {
|
return when (this) {
|
||||||
@@ -624,6 +624,18 @@ class IrInterpreter(irModule: IrModuleFragment) {
|
|||||||
val enumEntry = expression.symbol.owner
|
val enumEntry = expression.symbol.owner
|
||||||
val enumSignature = Pair(enumEntry.parentAsClass, enumEntry.name.asString())
|
val enumSignature = Pair(enumEntry.parentAsClass, enumEntry.name.asString())
|
||||||
mapOfEnums[enumSignature]?.let { return Code.NEXT.apply { data.pushReturnValue(it) } }
|
mapOfEnums[enumSignature]?.let { return Code.NEXT.apply { data.pushReturnValue(it) } }
|
||||||
|
|
||||||
|
val enumClass = enumEntry.symbol.owner.parentAsClass
|
||||||
|
if (enumClass.hasAnnotation(evaluateIntrinsicAnnotation)) {
|
||||||
|
val valueOfFun = enumClass.declarations.single { it.nameForIrSerialization.asString() == "valueOf" } as IrFunction
|
||||||
|
val enumName = Variable(valueOfFun.valueParameters.first().descriptor, enumEntry.name.asString().toState(irBuiltIns.stringType))
|
||||||
|
val newFrame = InterpreterFrame(mutableListOf(enumName))
|
||||||
|
return Wrapper.getEnumEntry(enumClass)!!.invokeMethod(valueOfFun, newFrame).apply {
|
||||||
|
if (this == Code.NEXT) mapOfEnums[enumSignature] = newFrame.peekReturnValue() as Wrapper
|
||||||
|
data.pushReturnValue(newFrame)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return interpretEnumEntry(enumEntry, data).apply {
|
return interpretEnumEntry(enumEntry, data).apply {
|
||||||
if (this == Code.NEXT) mapOfEnums[enumSignature] = data.peekReturnValue() as Common
|
if (this == Code.NEXT) mapOfEnums[enumSignature] = data.peekReturnValue() as Common
|
||||||
}
|
}
|
||||||
|
|||||||
+9
-4
@@ -6,9 +6,7 @@
|
|||||||
package org.jetbrains.kotlin.backend.common.interpreter.stack
|
package org.jetbrains.kotlin.backend.common.interpreter.stack
|
||||||
|
|
||||||
import org.jetbrains.kotlin.backend.common.interpreter.*
|
import org.jetbrains.kotlin.backend.common.interpreter.*
|
||||||
import org.jetbrains.kotlin.backend.common.interpreter.builtins.CompileTimeFunction
|
|
||||||
import org.jetbrains.kotlin.backend.common.interpreter.builtins.evaluateIntrinsicAnnotation
|
import org.jetbrains.kotlin.backend.common.interpreter.builtins.evaluateIntrinsicAnnotation
|
||||||
import org.jetbrains.kotlin.backend.common.interpreter.builtins.unaryFunctions
|
|
||||||
import org.jetbrains.kotlin.builtins.jvm.JavaToKotlinClassMap
|
import org.jetbrains.kotlin.builtins.jvm.JavaToKotlinClassMap
|
||||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
||||||
@@ -17,8 +15,6 @@ 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.declarations.IrProperty
|
import org.jetbrains.kotlin.ir.declarations.IrProperty
|
||||||
import org.jetbrains.kotlin.ir.declarations.impl.IrFunctionImpl
|
import org.jetbrains.kotlin.ir.declarations.impl.IrFunctionImpl
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrGetValue
|
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
|
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
|
||||||
import org.jetbrains.kotlin.ir.types.*
|
import org.jetbrains.kotlin.ir.types.*
|
||||||
import org.jetbrains.kotlin.ir.util.*
|
import org.jetbrains.kotlin.ir.util.*
|
||||||
@@ -192,6 +188,15 @@ class Wrapper(val value: Any, override val irClass: IrClass) : Complex(irClass,
|
|||||||
return MethodHandles.lookup().findStatic(jvmClassName, irFunction.name.asString(), methodType)
|
return MethodHandles.lookup().findStatic(jvmClassName, irFunction.name.asString(), methodType)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun getEnumEntry(enumClass: IrClass): MethodHandle? {
|
||||||
|
val intrinsicName = enumClass.getEvaluateIntrinsicValue()
|
||||||
|
if (intrinsicName?.isEmpty() == true) return null
|
||||||
|
val enumClassName = Class.forName(intrinsicName!!)
|
||||||
|
|
||||||
|
val methodType = MethodType.methodType(enumClassName, String::class.java)
|
||||||
|
return MethodHandles.lookup().findStatic(enumClassName, "valueOf", methodType)
|
||||||
|
}
|
||||||
|
|
||||||
private fun IrFunction.getMethodType(): MethodType {
|
private fun IrFunction.getMethodType(): MethodType {
|
||||||
val argsClasses = this.valueParameters.map { it.type.getClass(this.isValueParameterPrimitiveAsObject(it.index)) }
|
val argsClasses = this.valueParameters.map { it.type.getClass(this.isValueParameterPrimitiveAsObject(it.index)) }
|
||||||
return if (this is IrFunctionImpl) {
|
return if (this is IrFunctionImpl) {
|
||||||
|
|||||||
Reference in New Issue
Block a user