From 5596e1e1e1a6f6fe5e060312aba84a6b30db780f Mon Sep 17 00:00:00 2001 From: Ivan Kylchik Date: Mon, 24 May 2021 16:46:42 +0300 Subject: [PATCH] Properly support char and boolean arrays in interpreter For now boolean array will expect proper Boolean instead of any value. This change just unify logic of working with primitive arrays. --- .../jetbrains/kotlin/ir/interpreter/Utils.kt | 2 +- .../intrinsics/IntrinsicImplementations.kt | 13 ++++++++----- .../collections/arrayConstructor.kt | Bin 861 -> 1449 bytes 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/Utils.kt b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/Utils.kt index 5b5f298eb9a..7b9d8e95c32 100644 --- a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/Utils.kt +++ b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/Utils.kt @@ -162,7 +162,7 @@ internal fun List.toPrimitiveStateArray(type: IrType): Primitive<*> { type.isLongArray() -> Primitive(LongArray(size) { i -> (this[i] as Number).toLong() }, type) type.isFloatArray() -> Primitive(FloatArray(size) { i -> (this[i] as Number).toFloat() }, type) type.isDoubleArray() -> Primitive(DoubleArray(size) { i -> (this[i] as Number).toDouble() }, type) - type.isBooleanArray() -> Primitive(BooleanArray(size) { i -> this[i].toString().toBoolean() }, type) + type.isBooleanArray() -> Primitive(BooleanArray(size) { i -> (this[i] as Boolean) }, type) else -> Primitive>(this.toTypedArray(), type) } } 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 dc52b62f055..45a369caa55 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 @@ -13,12 +13,9 @@ import org.jetbrains.kotlin.ir.interpreter.* import org.jetbrains.kotlin.ir.interpreter.state.* import org.jetbrains.kotlin.ir.interpreter.state.reflection.KFunctionState import org.jetbrains.kotlin.ir.interpreter.state.reflection.KTypeState -import org.jetbrains.kotlin.ir.types.IrSimpleType -import org.jetbrains.kotlin.ir.types.classOrNull +import org.jetbrains.kotlin.ir.types.* import org.jetbrains.kotlin.ir.types.impl.buildSimpleType import org.jetbrains.kotlin.ir.types.impl.makeTypeProjection -import org.jetbrains.kotlin.ir.types.isArray -import org.jetbrains.kotlin.ir.types.isCharArray import org.jetbrains.kotlin.ir.util.fqNameWhenAvailable import org.jetbrains.kotlin.ir.util.resolveFakeOverride import org.jetbrains.kotlin.types.Variance @@ -241,7 +238,13 @@ internal object ArrayConstructor : IntrinsicBase() { override fun evaluate(irFunction: IrFunction, environment: IrInterpreterEnvironment) { val sizeDescriptor = irFunction.valueParameters[0].symbol val size = environment.callStack.getState(sizeDescriptor).asInt() - val arrayValue = MutableList(size) { if (irFunction.returnType.isCharArray()) 0.toChar() else 0 } + val arrayValue = MutableList(size) { + when { + irFunction.returnType.isCharArray() -> 0.toChar() + irFunction.returnType.isBooleanArray() -> false + else -> 0 + } + } if (irFunction.valueParameters.size == 2) { for (i in size - 1 downTo 0) { diff --git a/compiler/testData/ir/interpreter/collections/arrayConstructor.kt b/compiler/testData/ir/interpreter/collections/arrayConstructor.kt index 2a59aae462f19a05e4440af2f2a2f8c19d6eb5dd..8ce941f8d7f53959ca3b0c27a62a7ac7b20d0d95 100644 GIT binary patch literal 1449 zcma)+U27^a5Qcm0uNap?*Oo5(B_4{kY+DZ$de@JeBDhDQhNel0v9{;1|NTs2&F-2M zbU~bn@0-lCGof$qLMnI_icub&b~-b`R|-B#29&Ep%JM6LOSt>~9p-5-8g|Fe#r;$9 zIKI7rX`W8IqZR#2hTV}zouaxei1GhTzn6I8mu8OC>}9n{+=G9Rr%?T9kvkTH=I&bu zs^EMC_+7mW%uyO;%$X=_48Lu3IEdQ8gCf!}+OAG5wSf;v)NecNphW$-hfD3{A+vv& zHl0WbbI`Eo zpY3d4buS_IL7Od0X^GwJg2QoHz02wdIkg-eNLK6;%3I