[WASM] Fix weird use of copyValueArgumentsFrom
diff --git a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/lower/ComplexExternalDeclarationsToTopLevelFunctionsLowering.kt b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/lower/ComplexExternalDeclarationsToTopLevelFunctionsLowering.kt
index 331b458..7eef76f 100644
--- a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/lower/ComplexExternalDeclarationsToTopLevelFunctionsLowering.kt
+++ b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/lower/ComplexExternalDeclarationsToTopLevelFunctionsLowering.kt
@@ -544,30 +544,28 @@
val oldFun = call.symbol.owner.realOverrideTarget
val newFun: IrSimpleFunction = nestedExternalToNewTopLevelFunctions[oldFun] ?: return call
- val newCall = irCall(call, newFun, receiversAsArguments = true)
+ val newCall = IrCallImpl(call.startOffset, call.endOffset, newFun.returnType, newFun.symbol)
+
+ // Copy arguments or fill with default
+ for (parameter in oldFun.parameters) {
+ val arg = call.arguments[parameter.indexInParameters]
+ newCall.arguments[parameter.indexInParameters] = if (
+ arg == null &&
+ !parameter.isVararg // Handled with WasmVarargExpressionLowering
+ ) IrConstImpl.defaultValueForType(UNDEFINED_OFFSET, UNDEFINED_OFFSET, parameter.type)
+ else arg
+ }
// Add default arguments flags if needed
val numDefaultParameters = numDefaultParametersForExternalFunction(oldFun)
+ val firstOldDefaultArgumentIdx = oldFun.parameters.size - numDefaultParameters
val firstDefaultFlagArgumentIdx = newFun.parameters.size - numDefaultParameters
-
- val valueArguments = call.arguments
- .filterIndexed { index, _ -> call.symbol.owner.parameters[index].kind == IrParameterKind.Regular }
- val firstOldDefaultArgumentIdx = valueArguments.size - numDefaultParameters
-
- repeat(numDefaultParameters) {
- val value = if (call.valueArguments[firstOldDefaultArgumentIdx + it] == null) 1 else 0
- newCall.arguments[firstDefaultFlagArgumentIdx + it] =
+ for (i in 0..<numDefaultParameters) {
+ val value = if (call.arguments[i + firstOldDefaultArgumentIdx] == null) 1 else 0
+ newCall.arguments[firstDefaultFlagArgumentIdx + i] =
IrConstImpl.int(UNDEFINED_OFFSET, UNDEFINED_OFFSET, context.irBuiltIns.intType, value)
}
- // Add default argument values if needed
- for (i in 0 until newFun.parameters.size) {
- val parameter = newFun.parameters[i]
- if (parameter.isVararg) continue // Handled with WasmVarargExpressionLowering
- if (newCall.arguments[i] != null) continue
- newCall.arguments[i] = IrConstImpl.defaultValueForType(UNDEFINED_OFFSET, UNDEFINED_OFFSET, parameter.type)
- }
-
return newCall
}
}