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))
|
frameMap.enter(parameter, typeMapper.mapType(parameter))
|
||||||
}
|
}
|
||||||
|
|
||||||
var mask = 0
|
val args = DefaultCallArgs(functionDescriptor.valueParameters.size)
|
||||||
val masks = arrayListOf<Int>()
|
|
||||||
for (parameterDescriptor in functionDescriptor.valueParameters) {
|
for (parameterDescriptor in functionDescriptor.valueParameters) {
|
||||||
val paramKotlinType = parameterDescriptor.type
|
val paramKotlinType = parameterDescriptor.type
|
||||||
val paramType = typeMapper.mapType(paramKotlinType)
|
val paramType = typeMapper.mapType(paramKotlinType)
|
||||||
@@ -215,18 +214,12 @@ class DefaultParameterValueSubstitutor(val state: GenerationState) {
|
|||||||
StackValue.local(index, paramType, paramKotlinType).put(paramType, paramKotlinType, v)
|
StackValue.local(index, paramType, paramKotlinType).put(paramType, paramKotlinType, v)
|
||||||
} else {
|
} else {
|
||||||
AsmUtil.pushDefaultValueOnStack(paramType, v)
|
AsmUtil.pushDefaultValueOnStack(paramType, v)
|
||||||
val i = parameterDescriptor.index
|
args.mark(parameterDescriptor.index)
|
||||||
if (i != 0 && i % Integer.SIZE == 0) {
|
|
||||||
masks.add(mask)
|
|
||||||
mask = 0
|
|
||||||
}
|
|
||||||
mask = mask or (1 shl (i % Integer.SIZE))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
masks.add(mask)
|
|
||||||
|
|
||||||
for (m in masks) {
|
for (mask in args.toInts()) {
|
||||||
v.iconst(m)
|
v.iconst(mask)
|
||||||
}
|
}
|
||||||
|
|
||||||
// for default constructors: just marks default constructor (see DEFAULT_CONSTRUCTOR_MARKER)
|
// 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");
|
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")
|
@TestMetadata("multipleDefaultParameters.kt")
|
||||||
public void testMultipleDefaultParameters() throws Exception {
|
public void testMultipleDefaultParameters() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/jvmOverloads/multipleDefaultParameters.kt");
|
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");
|
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")
|
@TestMetadata("multipleDefaultParameters.kt")
|
||||||
public void testMultipleDefaultParameters() throws Exception {
|
public void testMultipleDefaultParameters() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/jvmOverloads/multipleDefaultParameters.kt");
|
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");
|
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")
|
@TestMetadata("multipleDefaultParameters.kt")
|
||||||
public void testMultipleDefaultParameters() throws Exception {
|
public void testMultipleDefaultParameters() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/jvmOverloads/multipleDefaultParameters.kt");
|
runTest("compiler/testData/codegen/box/jvmOverloads/multipleDefaultParameters.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user