From ae079d9bddf36112a3cb5494a33f04a72e62d2e1 Mon Sep 17 00:00:00 2001 From: Andrey Zinovyev Date: Mon, 24 May 2021 15:14:52 +0300 Subject: [PATCH] [FIR] Move unsigned types constructor evaluation from intrinsics --- .../kotlin/ir/interpreter/IrInterpreter.kt | 7 ++++-- .../intrinsics/IntrinsicEvaluator.kt | 1 - .../intrinsics/IntrinsicImplementations.kt | 23 ------------------- .../kotlin/ir/interpreter/state/State.kt | 1 - 4 files changed, 5 insertions(+), 27 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 6211cfe302f..c0ce1bda716 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 @@ -379,8 +379,11 @@ class IrInterpreter(private val irBuiltIns: IrBuiltIns, private val bodyMap: Map .apply { stack.peekReturnValue().addTypeArguments(typeArguments) } } - if (irClass.defaultType.isUnsignedType()) { - return stack.newFrame(initPool = valueArguments) { handleIntrinsicMethods(owner) } + if (irClass.defaultType.isUnsignedType() && valueArguments.size == 1 && owner.valueParameters.size == 1) { + val result = Common(irClass) + result.fields.add(valueArguments.single()) + stack.pushReturnValue(result) + return Next } val state = Common(irClass).apply { this.addTypeArguments(typeArguments) } diff --git a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/intrinsics/IntrinsicEvaluator.kt b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/intrinsics/IntrinsicEvaluator.kt index edbb569f496..7254b8c718e 100644 --- a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/intrinsics/IntrinsicEvaluator.kt +++ b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/intrinsics/IntrinsicEvaluator.kt @@ -23,7 +23,6 @@ internal class IntrinsicEvaluator { EnumHashCode.equalTo(irFunction) -> EnumHashCode.evaluate(irFunction, stack, interpret) JsPrimitives.equalTo(irFunction) -> JsPrimitives.evaluate(irFunction, stack, interpret) ArrayConstructor.equalTo(irFunction) -> ArrayConstructor.evaluate(irFunction, stack, interpret) - UnsignedConstructor.equalTo(irFunction) -> UnsignedConstructor.evaluate(irFunction, stack, interpret) else -> throw InterpreterMethodNotFoundException("Method ${irFunction.name} hasn't implemented") } } diff --git a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/intrinsics/IntrinsicImplementations.kt b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/intrinsics/IntrinsicImplementations.kt index d3258f42709..ff37fac91da 100644 --- a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/intrinsics/IntrinsicImplementations.kt +++ b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/intrinsics/IntrinsicImplementations.kt @@ -5,20 +5,15 @@ package org.jetbrains.kotlin.ir.interpreter.intrinsics -import org.jetbrains.kotlin.builtins.UnsignedType import org.jetbrains.kotlin.ir.interpreter.* import org.jetbrains.kotlin.ir.interpreter.stack.Stack import org.jetbrains.kotlin.ir.interpreter.stack.Variable import org.jetbrains.kotlin.ir.interpreter.state.* import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.declarations.IrClass -import org.jetbrains.kotlin.ir.declarations.IrConstructor import org.jetbrains.kotlin.ir.declarations.IrEnumEntry import org.jetbrains.kotlin.ir.declarations.IrFunction -import org.jetbrains.kotlin.ir.expressions.IrConstructorCall import org.jetbrains.kotlin.ir.types.classOrNull -import org.jetbrains.kotlin.ir.types.getUnsignedType -import org.jetbrains.kotlin.ir.types.isUnsignedType import org.jetbrains.kotlin.ir.util.* internal sealed class IntrinsicBase { @@ -194,22 +189,4 @@ internal object ArrayConstructor : IntrinsicBase() { stack.pushReturnValue(arrayValue.toPrimitiveStateArray(irFunction.parentAsClass.defaultType)) return Next } -} - -internal object UnsignedConstructor : IntrinsicBase() { - override fun equalTo(irFunction: IrFunction): Boolean { - val constructorCall = irFunction as? IrConstructor ?: return false - val irClass = constructorCall.parent as IrClass - return irClass.defaultType.isUnsignedType() && irFunction.valueParameters.size == 1 - } - - override fun evaluate(irFunction: IrFunction, stack: Stack, interpret: IrElement.() -> ExecutionResult): ExecutionResult { - val parameter = irFunction.valueParameters.single() - val argument = stack.getVariable(parameter.symbol).state.asNumber() - val irClass = irFunction.parent as IrClass - val result = Common(irClass) - result.fields.add(Variable(parameter.symbol, argument.toState(parameter.type))) - stack.pushReturnValue(result) - return Next - } } \ No newline at end of file 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 6d3d62045c0..4b4cc3ec2d2 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 @@ -38,7 +38,6 @@ internal interface State { internal fun State.isNull() = this is Primitive<*> && this.value == null -internal fun State.asNumber() = (this as Primitive<*>).value as Number internal fun State.asInt() = (this as Primitive<*>).value as Int internal fun State.asBoolean() = (this as Primitive<*>).value as Boolean internal fun State.asString() = (this as Primitive<*>).value.toString()