Reflection: exclude DEFAULT_CONSTRUCTOR_MARKER when calculating mask size
#KT-65156 Fixed
This commit is contained in:
+60
@@ -59,6 +59,60 @@ fun test65(
|
||||
arg60: Long = 0L, arg61: Long = 0L, arg62: Long = 0L, arg63: Long = 0L, x: A = A(0)
|
||||
) = "OK"
|
||||
|
||||
data class TestCtor1(val x: A = A(0))
|
||||
|
||||
data class TestCtor32(
|
||||
val arg00: Long = 0L, val arg01: Long = 0L, val arg02: Long = 0L, val arg03: Long = 0L, val arg04: Long = 0L,
|
||||
val arg05: Long = 0L, val arg06: Long = 0L, val arg07: Long = 0L, val arg08: Long = 0L, val arg09: Long = 0L,
|
||||
val arg10: Long = 0L, val arg11: Long = 0L, val arg12: Long = 0L, val arg13: Long = 0L, val arg14: Long = 0L,
|
||||
val arg15: Long = 0L, val arg16: Long = 0L, val arg17: Long = 0L, val arg18: Long = 0L, val arg19: Long = 0L,
|
||||
val arg20: Long = 0L, val arg21: Long = 0L, val arg22: Long = 0L, val arg23: Long = 0L, val arg24: Long = 0L,
|
||||
val arg25: Long = 0L, val arg26: Long = 0L, val arg27: Long = 0L, val arg28: Long = 0L, val arg29: Long = 0L,
|
||||
val arg30: Long = 0L, val x: A = A(0)
|
||||
)
|
||||
|
||||
data class TestCtor33(
|
||||
val arg00: Long = 0L, val arg01: Long = 0L, val arg02: Long = 0L, val arg03: Long = 0L, val arg04: Long = 0L,
|
||||
val arg05: Long = 0L, val arg06: Long = 0L, val arg07: Long = 0L, val arg08: Long = 0L, val arg09: Long = 0L,
|
||||
val arg10: Long = 0L, val arg11: Long = 0L, val arg12: Long = 0L, val arg13: Long = 0L, val arg14: Long = 0L,
|
||||
val arg15: Long = 0L, val arg16: Long = 0L, val arg17: Long = 0L, val arg18: Long = 0L, val arg19: Long = 0L,
|
||||
val arg20: Long = 0L, val arg21: Long = 0L, val arg22: Long = 0L, val arg23: Long = 0L, val arg24: Long = 0L,
|
||||
val arg25: Long = 0L, val arg26: Long = 0L, val arg27: Long = 0L, val arg28: Long = 0L, val arg29: Long = 0L,
|
||||
val arg30: Long = 0L, val arg31: Long = 0L, val x: A = A(0)
|
||||
)
|
||||
|
||||
data class TestCtor64(
|
||||
val arg00: Long = 0L, val arg01: Long = 0L, val arg02: Long = 0L, val arg03: Long = 0L, val arg04: Long = 0L,
|
||||
val arg05: Long = 0L, val arg06: Long = 0L, val arg07: Long = 0L, val arg08: Long = 0L, val arg09: Long = 0L,
|
||||
val arg10: Long = 0L, val arg11: Long = 0L, val arg12: Long = 0L, val arg13: Long = 0L, val arg14: Long = 0L,
|
||||
val arg15: Long = 0L, val arg16: Long = 0L, val arg17: Long = 0L, val arg18: Long = 0L, val arg19: Long = 0L,
|
||||
val arg20: Long = 0L, val arg21: Long = 0L, val arg22: Long = 0L, val arg23: Long = 0L, val arg24: Long = 0L,
|
||||
val arg25: Long = 0L, val arg26: Long = 0L, val arg27: Long = 0L, val arg28: Long = 0L, val arg29: Long = 0L,
|
||||
val arg30: Long = 0L, val arg31: Long = 0L, val arg32: Long = 0L, val arg33: Long = 0L, val arg34: Long = 0L,
|
||||
val arg35: Long = 0L, val arg36: Long = 0L, val arg37: Long = 0L, val arg38: Long = 0L, val arg39: Long = 0L,
|
||||
val arg40: Long = 0L, val arg41: Long = 0L, val arg42: Long = 0L, val arg43: Long = 0L, val arg44: Long = 0L,
|
||||
val arg45: Long = 0L, val arg46: Long = 0L, val arg47: Long = 0L, val arg48: Long = 0L, val arg49: Long = 0L,
|
||||
val arg50: Long = 0L, val arg51: Long = 0L, val arg52: Long = 0L, val arg53: Long = 0L, val arg54: Long = 0L,
|
||||
val arg55: Long = 0L, val arg56: Long = 0L, val arg57: Long = 0L, val arg58: Long = 0L, val arg59: Long = 0L,
|
||||
val arg60: Long = 0L, val arg61: Long = 0L, val arg62: Long = 0L, val x: A = A(0)
|
||||
)
|
||||
|
||||
data class TestCtor65(
|
||||
val arg00: Long = 0L, val arg01: Long = 0L, val arg02: Long = 0L, val arg03: Long = 0L, val arg04: Long = 0L,
|
||||
val arg05: Long = 0L, val arg06: Long = 0L, val arg07: Long = 0L, val arg08: Long = 0L, val arg09: Long = 0L,
|
||||
val arg10: Long = 0L, val arg11: Long = 0L, val arg12: Long = 0L, val arg13: Long = 0L, val arg14: Long = 0L,
|
||||
val arg15: Long = 0L, val arg16: Long = 0L, val arg17: Long = 0L, val arg18: Long = 0L, val arg19: Long = 0L,
|
||||
val arg20: Long = 0L, val arg21: Long = 0L, val arg22: Long = 0L, val arg23: Long = 0L, val arg24: Long = 0L,
|
||||
val arg25: Long = 0L, val arg26: Long = 0L, val arg27: Long = 0L, val arg28: Long = 0L, val arg29: Long = 0L,
|
||||
val arg30: Long = 0L, val arg31: Long = 0L, val arg32: Long = 0L, val arg33: Long = 0L, val arg34: Long = 0L,
|
||||
val arg35: Long = 0L, val arg36: Long = 0L, val arg37: Long = 0L, val arg38: Long = 0L, val arg39: Long = 0L,
|
||||
val arg40: Long = 0L, val arg41: Long = 0L, val arg42: Long = 0L, val arg43: Long = 0L, val arg44: Long = 0L,
|
||||
val arg45: Long = 0L, val arg46: Long = 0L, val arg47: Long = 0L, val arg48: Long = 0L, val arg49: Long = 0L,
|
||||
val arg50: Long = 0L, val arg51: Long = 0L, val arg52: Long = 0L, val arg53: Long = 0L, val arg54: Long = 0L,
|
||||
val arg55: Long = 0L, val arg56: Long = 0L, val arg57: Long = 0L, val arg58: Long = 0L, val arg59: Long = 0L,
|
||||
val arg60: Long = 0L, val arg61: Long = 0L, val arg62: Long = 0L, val arg63: Long = 0L, val x: A = A(0)
|
||||
)
|
||||
|
||||
fun box(): String {
|
||||
assertEquals("OK", ::test1.callBy(mapOf()))
|
||||
assertEquals("OK", ::test32.callBy(mapOf()))
|
||||
@@ -66,5 +120,11 @@ fun box(): String {
|
||||
assertEquals("OK", ::test64.callBy(mapOf()))
|
||||
assertEquals("OK", ::test65.callBy(mapOf()))
|
||||
|
||||
assertEquals(TestCtor1(), ::TestCtor1.callBy(mapOf()))
|
||||
assertEquals(TestCtor32(), ::TestCtor32.callBy(mapOf()))
|
||||
assertEquals(TestCtor33(), ::TestCtor33.callBy(mapOf()))
|
||||
assertEquals(TestCtor64(), ::TestCtor64.callBy(mapOf()))
|
||||
assertEquals(TestCtor65(), ::TestCtor65.callBy(mapOf()))
|
||||
|
||||
return "OK"
|
||||
}
|
||||
|
||||
@@ -252,19 +252,18 @@ internal abstract class KDeclarationContainerImpl : ClassBasedDeclarationContain
|
||||
})
|
||||
|
||||
private fun addParametersAndMasks(result: MutableList<Class<*>>, valueParameters: List<Class<*>>, isConstructor: Boolean) {
|
||||
result.addAll(valueParameters)
|
||||
repeat((valueParameters.size + Integer.SIZE - 1) / Integer.SIZE) {
|
||||
// Constructors that include parameters of inline class types contain an extra trailing DEFAULT_CONSTRUCTOR_MARKER parameter,
|
||||
// which should be excluded when calculating mask size.
|
||||
val withoutMarker =
|
||||
if (valueParameters.lastOrNull() == DEFAULT_CONSTRUCTOR_MARKER) valueParameters.subList(0, valueParameters.size - 1)
|
||||
else valueParameters
|
||||
|
||||
result.addAll(withoutMarker)
|
||||
repeat((withoutMarker.size + Integer.SIZE - 1) / Integer.SIZE) {
|
||||
result.add(Integer.TYPE)
|
||||
}
|
||||
|
||||
if (isConstructor) {
|
||||
// Constructors that include the value class as an argument will include DEFAULT_CONSTRUCTOR_MARKER as an argument,
|
||||
// regardless of whether there is a default argument.
|
||||
// On the other hand, when searching for the default constructor,
|
||||
// DEFAULT_CONSTRUCTOR_MARKER needs to be present only at the end, so it is removed here.
|
||||
result.remove(DEFAULT_CONSTRUCTOR_MARKER)
|
||||
result.add(DEFAULT_CONSTRUCTOR_MARKER)
|
||||
} else result.add(Any::class.java)
|
||||
result.add(if (isConstructor) DEFAULT_CONSTRUCTOR_MARKER else Any::class.java)
|
||||
}
|
||||
|
||||
private class FunctionJvmDescriptor(val parameters: List<Class<*>>, val returnType: Class<*>?)
|
||||
|
||||
Reference in New Issue
Block a user