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.isLongArray() -> Primitive(LongArray(size) { i -> (this[i] as Number).toLong() }, type)
type.isFloatArray() -> Primitive(FloatArray(size) { i -> (this[i] as Number).toFloat() }, 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.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) 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.*
import org.jetbrains.kotlin.ir.interpreter.state.reflection.KFunctionState import org.jetbrains.kotlin.ir.interpreter.state.reflection.KFunctionState
import org.jetbrains.kotlin.ir.interpreter.state.reflection.KTypeState import org.jetbrains.kotlin.ir.interpreter.state.reflection.KTypeState
import org.jetbrains.kotlin.ir.types.IrSimpleType import org.jetbrains.kotlin.ir.types.*
import org.jetbrains.kotlin.ir.types.classOrNull
import org.jetbrains.kotlin.ir.types.impl.buildSimpleType import org.jetbrains.kotlin.ir.types.impl.buildSimpleType
import org.jetbrains.kotlin.ir.types.impl.makeTypeProjection 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.fqNameWhenAvailable
import org.jetbrains.kotlin.ir.util.resolveFakeOverride import org.jetbrains.kotlin.ir.util.resolveFakeOverride
import org.jetbrains.kotlin.types.Variance import org.jetbrains.kotlin.types.Variance
@@ -241,7 +238,13 @@ internal object ArrayConstructor : IntrinsicBase() {
override fun evaluate(irFunction: IrFunction, environment: IrInterpreterEnvironment) { override fun evaluate(irFunction: IrFunction, environment: IrInterpreterEnvironment) {
val sizeDescriptor = irFunction.valueParameters[0].symbol val sizeDescriptor = irFunction.valueParameters[0].symbol
val size = environment.callStack.getState(sizeDescriptor).asInt() 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) { if (irFunction.valueParameters.size == 2) {
for (i in size - 1 downTo 0) { for (i in size - 1 downTo 0) {
Binary file not shown.