diff --git a/compiler/testData/codegen/box/reflection/callBy/inlineClassDefaultArguments.kt b/compiler/testData/codegen/box/reflection/callBy/inlineClassDefaultArguments.kt index 7e0dcc65e96..62f752cc676 100644 --- a/compiler/testData/codegen/box/reflection/callBy/inlineClassDefaultArguments.kt +++ b/compiler/testData/codegen/box/reflection/callBy/inlineClassDefaultArguments.kt @@ -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" } diff --git a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KDeclarationContainerImpl.kt b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KDeclarationContainerImpl.kt index 82d413ec8f4..4c08f9ce45d 100644 --- a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KDeclarationContainerImpl.kt +++ b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KDeclarationContainerImpl.kt @@ -252,19 +252,18 @@ internal abstract class KDeclarationContainerImpl : ClassBasedDeclarationContain }) private fun addParametersAndMasks(result: MutableList>, valueParameters: List>, 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>, val returnType: Class<*>?)