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.
This commit is contained in:
Ivan Kylchik
2021-05-24 16:46:42 +03:00
committed by TeamCityServer
parent 25989b36c5
commit 5596e1e1e1
3 changed files with 9 additions and 6 deletions
@@ -162,7 +162,7 @@ internal fun List<Any?>.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<Array<*>>(this.toTypedArray(), type)
}
}
@@ -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<Any?>(size) { if (irFunction.returnType.isCharArray()) 0.toChar() else 0 }
val arrayValue = MutableList<Any?>(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) {
Binary file not shown.