Fix codegen for JvmOverloads with more than 32 parameters
Use DefaultCallArgs to handle mask list construction correctly #KT-31070 Fixed
This commit is contained in:
+4
-11
@@ -205,8 +205,7 @@ class DefaultParameterValueSubstitutor(val state: GenerationState) {
|
||||
frameMap.enter(parameter, typeMapper.mapType(parameter))
|
||||
}
|
||||
|
||||
var mask = 0
|
||||
val masks = arrayListOf<Int>()
|
||||
val args = DefaultCallArgs(functionDescriptor.valueParameters.size)
|
||||
for (parameterDescriptor in functionDescriptor.valueParameters) {
|
||||
val paramKotlinType = parameterDescriptor.type
|
||||
val paramType = typeMapper.mapType(paramKotlinType)
|
||||
@@ -215,18 +214,12 @@ class DefaultParameterValueSubstitutor(val state: GenerationState) {
|
||||
StackValue.local(index, paramType, paramKotlinType).put(paramType, paramKotlinType, v)
|
||||
} else {
|
||||
AsmUtil.pushDefaultValueOnStack(paramType, v)
|
||||
val i = parameterDescriptor.index
|
||||
if (i != 0 && i % Integer.SIZE == 0) {
|
||||
masks.add(mask)
|
||||
mask = 0
|
||||
}
|
||||
mask = mask or (1 shl (i % Integer.SIZE))
|
||||
args.mark(parameterDescriptor.index)
|
||||
}
|
||||
}
|
||||
masks.add(mask)
|
||||
|
||||
for (m in masks) {
|
||||
v.iconst(m)
|
||||
for (mask in args.toInts()) {
|
||||
v.iconst(mask)
|
||||
}
|
||||
|
||||
// for default constructors: just marks default constructor (see DEFAULT_CONSTRUCTOR_MARKER)
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
// TARGET_BACKEND: JVM
|
||||
// WITH_RUNTIME
|
||||
// FILE: JavaCall.java
|
||||
|
||||
public class JavaCall {
|
||||
public static void test() {
|
||||
new Example();
|
||||
new Example("1");
|
||||
}
|
||||
}
|
||||
|
||||
// FILE: Example.kt
|
||||
|
||||
data class Example @JvmOverloads constructor(
|
||||
var one: String = "",
|
||||
var two: String = "",
|
||||
var three: String = "",
|
||||
var four: String = "",
|
||||
var five: String = "",
|
||||
var six: String = "",
|
||||
var seven: String = "",
|
||||
var eight: String = "",
|
||||
var nine: String = "",
|
||||
var ten: String = "",
|
||||
var eleven: String = "",
|
||||
var twelve: String = "",
|
||||
var thirteen: String = "",
|
||||
var fourteen: String = "",
|
||||
var fifteen: String = "",
|
||||
var sixteen: String = "",
|
||||
var seventeen: String = "",
|
||||
var eighteen: String = "",
|
||||
var nineteen: String = "",
|
||||
var twenty: String = "",
|
||||
var twentyOne: String = "",
|
||||
var twentyTwo: String = "",
|
||||
var twentyThree: String = "",
|
||||
var twentyFour: String = "",
|
||||
var twentyFive: String = "",
|
||||
var twentySix: String = "",
|
||||
var twentySeven: String = "",
|
||||
var twentyEight: String = "",
|
||||
var twentyNine: String = "",
|
||||
var thirty: String = "",
|
||||
var thirtyOne: String = "",
|
||||
var thirtyTwo: String = "",
|
||||
var thirtyThree: String = "",
|
||||
var thirtyFour: String = ""
|
||||
)
|
||||
|
||||
fun box(): String {
|
||||
Example()
|
||||
JavaCall.test()
|
||||
return "OK"
|
||||
}
|
||||
+5
@@ -14879,6 +14879,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
||||
runTest("compiler/testData/codegen/box/jvmOverloads/innerClass.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("manyParameters.kt")
|
||||
public void testManyParameters() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/jvmOverloads/manyParameters.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("multipleDefaultParameters.kt")
|
||||
public void testMultipleDefaultParameters() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/jvmOverloads/multipleDefaultParameters.kt");
|
||||
|
||||
+5
@@ -14879,6 +14879,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
|
||||
runTest("compiler/testData/codegen/box/jvmOverloads/innerClass.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("manyParameters.kt")
|
||||
public void testManyParameters() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/jvmOverloads/manyParameters.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("multipleDefaultParameters.kt")
|
||||
public void testMultipleDefaultParameters() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/jvmOverloads/multipleDefaultParameters.kt");
|
||||
|
||||
+5
@@ -13769,6 +13769,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
||||
runTest("compiler/testData/codegen/box/jvmOverloads/innerClass.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("manyParameters.kt")
|
||||
public void testManyParameters() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/jvmOverloads/manyParameters.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("multipleDefaultParameters.kt")
|
||||
public void testMultipleDefaultParameters() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/jvmOverloads/multipleDefaultParameters.kt");
|
||||
|
||||
Reference in New Issue
Block a user