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:
Alexander Udalov
2019-07-03 12:10:31 +02:00
parent 40633768bc
commit f7fc5d2ffa
5 changed files with 74 additions and 11 deletions
@@ -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"
}
@@ -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");
@@ -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");
@@ -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");