From b175f4631501ca3f994e42d51072cb24f3eadf00 Mon Sep 17 00:00:00 2001 From: Ivan Kylchik Date: Wed, 10 Jun 2020 21:55:05 +0300 Subject: [PATCH] Implement interpretation of Char and Long classes from js stdlib --- .../backend/common/interpreter/IrInterpreter.kt | 15 ++++++++++++++- .../backend/common/interpreter/stack/State.kt | 2 +- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/interpreter/IrInterpreter.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/interpreter/IrInterpreter.kt index 2cdde04aa88..198209a9ff9 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/interpreter/IrInterpreter.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/interpreter/IrInterpreter.kt @@ -458,7 +458,20 @@ class IrInterpreter(irModule: IrModuleFragment) { val owner = constructorCall.symbol.owner val parent = owner.parent as IrClass if (parent.hasAnnotation(evaluateIntrinsicAnnotation)) { - return Wrapper.getConstructorMethod(owner).invokeMethod(owner, newFrame).apply { data.pushReturnValue(newFrame) } + return when (constructorCall.symbol.owner.parentAsClass.getEvaluateIntrinsicValue()) { + "kotlin.Long" -> { + val low = (valueParameters[0].state as Primitive<*>).value as Int + val high = (valueParameters[1].state as Primitive<*>).value as Int + data.pushReturnValue((high.toLong().shl(32) + low).toState(irBuiltIns.longType)) + Code.NEXT + } + "kotlin.Char" -> { + val value = (valueParameters.single().state as Primitive<*>).value as Int + data.pushReturnValue(value.toChar().toState(irBuiltIns.longType)) + Code.NEXT + } + else -> Wrapper.getConstructorMethod(owner).invokeMethod(owner, newFrame).apply { data.pushReturnValue(newFrame) } + } } if (parent.defaultType.isArray() || parent.defaultType.isPrimitiveArray()) { diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/interpreter/stack/State.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/interpreter/stack/State.kt index 73adf2cc2d5..a5ca28e9e39 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/interpreter/stack/State.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/interpreter/stack/State.kt @@ -228,9 +228,9 @@ class Wrapper(val value: Any, override val irClass: IrClass) : Complex(irClass, val fqName = this.getFqName() val owner = this.classOrNull?.owner return when { - owner.hasAnnotation(evaluateIntrinsicAnnotation) -> Class.forName(owner!!.getEvaluateIntrinsicValue()) this.isPrimitiveType() -> getPrimitiveClass(fqName!!, asObject) this.isArray() -> if (asObject) Array::class.javaObjectType else Array::class.java + owner.hasAnnotation(evaluateIntrinsicAnnotation) -> Class.forName(owner!!.getEvaluateIntrinsicValue()) //TODO primitive array this.isTypeParameter() -> Any::class.java else -> JavaToKotlinClassMap.mapKotlinToJava(FqNameUnsafe(fqName!!))?.let { Class.forName(it.asSingleFqName().toString()) }