diff --git a/compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/intrinsics/JvmDebuggerInvokeSpecial.kt b/compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/intrinsics/JvmDebuggerInvokeSpecial.kt index 4835698752e..f717e5d6873 100644 --- a/compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/intrinsics/JvmDebuggerInvokeSpecial.kt +++ b/compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/intrinsics/JvmDebuggerInvokeSpecial.kt @@ -8,6 +8,8 @@ package org.jetbrains.kotlin.backend.jvm.intrinsics import org.jetbrains.kotlin.backend.jvm.codegen.* import org.jetbrains.kotlin.backend.jvm.ir.getBooleanConstArgument import org.jetbrains.kotlin.backend.jvm.ir.getStringConstArgument +import org.jetbrains.kotlin.ir.expressions.IrBlock +import org.jetbrains.kotlin.ir.expressions.IrCall import org.jetbrains.kotlin.ir.expressions.IrFunctionAccessExpression import org.jetbrains.org.objectweb.asm.Type @@ -31,10 +33,27 @@ object JvmDebuggerInvokeSpecial : IntrinsicMethod() { val name = expression.getStringConstArgument(1) val descriptor = expression.getStringConstArgument(2) val isInterface = expression.getBooleanConstArgument(3) + val argsArray = expression.getValueArgument(4) as? IrBlock expression.dispatchReceiver!!.accept(codegen, data).materialize() + argsArray?.let { generateArgs(it, codegen, data) } codegen.mv.invokespecial(owner, name, descriptor, isInterface) return MaterialValue(codegen, Type.getReturnType(descriptor), expression.type) } + + // statements: + // val arr = arrayOfNulls(N) + // arr[0] = expr1 + // arr[1] = expr2 + // ... + // arr[N-1] = exprN + // arr + private fun generateArgs(array: IrBlock, codegen: ExpressionCodegen, data: BlockInfo) { + // ignore first and last statements + for (i in 1..