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)
|
arg60: Long = 0L, arg61: Long = 0L, arg62: Long = 0L, arg63: Long = 0L, x: A = A(0)
|
||||||
) = "OK"
|
) = "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 {
|
fun box(): String {
|
||||||
assertEquals("OK", ::test1.callBy(mapOf()))
|
assertEquals("OK", ::test1.callBy(mapOf()))
|
||||||
assertEquals("OK", ::test32.callBy(mapOf()))
|
assertEquals("OK", ::test32.callBy(mapOf()))
|
||||||
@@ -66,5 +120,11 @@ fun box(): String {
|
|||||||
assertEquals("OK", ::test64.callBy(mapOf()))
|
assertEquals("OK", ::test64.callBy(mapOf()))
|
||||||
assertEquals("OK", ::test65.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"
|
return "OK"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -252,19 +252,18 @@ internal abstract class KDeclarationContainerImpl : ClassBasedDeclarationContain
|
|||||||
})
|
})
|
||||||
|
|
||||||
private fun addParametersAndMasks(result: MutableList<Class<*>>, valueParameters: List<Class<*>>, isConstructor: Boolean) {
|
private fun addParametersAndMasks(result: MutableList<Class<*>>, valueParameters: List<Class<*>>, isConstructor: Boolean) {
|
||||||
result.addAll(valueParameters)
|
// Constructors that include parameters of inline class types contain an extra trailing DEFAULT_CONSTRUCTOR_MARKER parameter,
|
||||||
repeat((valueParameters.size + Integer.SIZE - 1) / Integer.SIZE) {
|
// 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)
|
result.add(Integer.TYPE)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isConstructor) {
|
result.add(if (isConstructor) DEFAULT_CONSTRUCTOR_MARKER else Any::class.java)
|
||||||
// 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)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private class FunctionJvmDescriptor(val parameters: List<Class<*>>, val returnType: Class<*>?)
|
private class FunctionJvmDescriptor(val parameters: List<Class<*>>, val returnType: Class<*>?)
|
||||||
|
|||||||
Reference in New Issue
Block a user