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 28c0f8bd045..7c39dec5b90 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 @@ -152,7 +152,7 @@ class IrInterpreter(irModule: IrModuleFragment) { private suspend fun MethodHandle?.invokeMethod(irFunction: IrFunction, data: Frame): ExecutionResult { this ?: return handleIntrinsicMethods(irFunction, data) - val result = this.invokeWithArguments(irFunction.getArgsForMethodInvocation(data)) + val result = this.invokeWithArguments(irFunction.getArgsForMethodInvocation(data.getAll())) data.pushReturnValue(result.toState(result.getType(irFunction.returnType))) return Next @@ -165,7 +165,7 @@ class IrInterpreter(irModule: IrModuleFragment) { data.pushReturnValue(result.toState(result.getType(irFunction.returnType))) } "arrayOf" -> { - val result = irFunction.getArgsForMethodInvocation(data).toTypedArray() + val result = irFunction.getArgsForMethodInvocation(data.getAll()).toTypedArray() data.pushReturnValue(result.toState(result.getType(irFunction.returnType))) } "arrayOfNulls" -> { diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/interpreter/Utils.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/interpreter/Utils.kt index d337816aa8d..94afb7ec9fd 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/interpreter/Utils.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/interpreter/Utils.kt @@ -6,7 +6,7 @@ package org.jetbrains.kotlin.backend.common.interpreter import org.jetbrains.kotlin.backend.common.interpreter.builtins.evaluateIntrinsicAnnotation -import org.jetbrains.kotlin.backend.common.interpreter.stack.* +import org.jetbrains.kotlin.backend.common.interpreter.stack.Variable import org.jetbrains.kotlin.backend.common.interpreter.state.* import org.jetbrains.kotlin.builtins.UnsignedTypes import org.jetbrains.kotlin.descriptors.* @@ -178,8 +178,8 @@ fun IrType.getFqName(): String? { return this.classOrNull?.owner?.fqNameForIrSerialization?.asString() } -fun IrFunction.getArgsForMethodInvocation(data: Frame): List { - val argsValues = data.getAll().map { +fun IrFunction.getArgsForMethodInvocation(args: List): List { + val argsValues = args.map { when (val state = it.state) { is ExceptionState -> state.getThisAsCauseForException() is Wrapper -> state.value @@ -191,9 +191,8 @@ fun IrFunction.getArgsForMethodInvocation(data: Frame): List { // TODO if vararg isn't last parameter // must convert vararg array into separated elements for correct invoke if (this.valueParameters.lastOrNull()?.varargElementType != null) { + val varargValue = argsValues.last() argsValues.removeAt(argsValues.size - 1) - val varargState = data.getVariableState(this.valueParameters.last().descriptor) - val varargValue = (varargState as? Wrapper)?.value ?: (varargState as Primitive<*>).value argsValues.addAll(varargValue as Array) }