From 0f65ba484360659341420054457e8e6e07836e8f Mon Sep 17 00:00:00 2001 From: Alexander Kuznetsov Date: Wed, 29 Nov 2023 23:28:44 +0000 Subject: [PATCH] [evaluator] consider arguments of super-calls Code generation for the intrinsic `jvmDebuggerInvokeSpecialIntrinsic` includes dispatch receiver, but ignores arguments passed to a super-call. This change passes arguments in the IR representation in an array, and during the codegen the array is unpacked and the bytecode is generated for the elements, right before generating the actual `INVOKESPECIAL`. #KT-63848 fixed Merge-request: KT-MR-13270 Merged-by: Alexander Kuznetsov --- .../intrinsics/JvmDebuggerInvokeSpecial.kt | 19 +++++++++++++++++++ .../backend/jvm/lower/ReflectiveAccess.kt | 11 +++++++++++ .../kotlin/backend/jvm/JvmSymbols.kt | 1 + 3 files changed, 31 insertions(+) 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..