From b039f2e5748f282e6d5da4ea743794c7c772433a Mon Sep 17 00:00:00 2001 From: wrongwrong Date: Tue, 14 Feb 2023 16:13:31 +0900 Subject: [PATCH] Fix ArrayStoreException from InlineClassAwareCaller.call #KT-56650 Fixed --- ...LightTreeBlackBoxCodegenTestGenerated.java | 6 ++++++ .../FirPsiBlackBoxCodegenTestGenerated.java | 6 ++++++ ...mpleConstructorWithInlineClassParameter.kt | 15 +++++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 6 ++++++ .../IrBlackBoxCodegenTestGenerated.java | 6 ++++++ .../LightAnalysisModeTestGenerated.java | 5 +++++ .../internal/calls/InlineClassAwareCaller.kt | 21 ++++++++++++------- 7 files changed, 57 insertions(+), 8 deletions(-) create mode 100644 compiler/testData/codegen/box/reflection/call/inlineClasses/simpleConstructorWithInlineClassParameter.kt diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java index 82a36e9b239..12254913d94 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java @@ -43019,6 +43019,12 @@ public class FirLightTreeBlackBoxCodegenTestGenerated extends AbstractFirLightTr runTest("compiler/testData/codegen/box/reflection/call/inlineClasses/primaryValOfInlineClass.kt"); } + @Test + @TestMetadata("simpleConstructorWithInlineClassParameter.kt") + public void testSimpleConstructorWithInlineClassParameter() throws Exception { + runTest("compiler/testData/codegen/box/reflection/call/inlineClasses/simpleConstructorWithInlineClassParameter.kt"); + } + @Nested @TestMetadata("compiler/testData/codegen/box/reflection/call/inlineClasses/nonNullObject") @TestDataPath("$PROJECT_ROOT") diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java index 5fb97c0b8a7..11750accbaf 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java @@ -43019,6 +43019,12 @@ public class FirPsiBlackBoxCodegenTestGenerated extends AbstractFirPsiBlackBoxCo runTest("compiler/testData/codegen/box/reflection/call/inlineClasses/primaryValOfInlineClass.kt"); } + @Test + @TestMetadata("simpleConstructorWithInlineClassParameter.kt") + public void testSimpleConstructorWithInlineClassParameter() throws Exception { + runTest("compiler/testData/codegen/box/reflection/call/inlineClasses/simpleConstructorWithInlineClassParameter.kt"); + } + @Nested @TestMetadata("compiler/testData/codegen/box/reflection/call/inlineClasses/nonNullObject") @TestDataPath("$PROJECT_ROOT") diff --git a/compiler/testData/codegen/box/reflection/call/inlineClasses/simpleConstructorWithInlineClassParameter.kt b/compiler/testData/codegen/box/reflection/call/inlineClasses/simpleConstructorWithInlineClassParameter.kt new file mode 100644 index 00000000000..9c1f6bb7afd --- /dev/null +++ b/compiler/testData/codegen/box/reflection/call/inlineClasses/simpleConstructorWithInlineClassParameter.kt @@ -0,0 +1,15 @@ +// TARGET_BACKEND: JVM + +// WITH_REFLECT + +@JvmInline +value class Value(val value: String) + +class A(val result: Value) + +fun box(): String { + val args: Array = arrayOf(Value("OK")) + + val a = (::A).call(*args) + return a.result.value +} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java index 6ee6bd45875..5d6d4e012b0 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java @@ -40901,6 +40901,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/reflection/call/inlineClasses/primaryValOfInlineClass.kt"); } + @Test + @TestMetadata("simpleConstructorWithInlineClassParameter.kt") + public void testSimpleConstructorWithInlineClassParameter() throws Exception { + runTest("compiler/testData/codegen/box/reflection/call/inlineClasses/simpleConstructorWithInlineClassParameter.kt"); + } + @Nested @TestMetadata("compiler/testData/codegen/box/reflection/call/inlineClasses/nonNullObject") @TestDataPath("$PROJECT_ROOT") diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java index 64527147348..366d0b6e351 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java @@ -43019,6 +43019,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/reflection/call/inlineClasses/primaryValOfInlineClass.kt"); } + @Test + @TestMetadata("simpleConstructorWithInlineClassParameter.kt") + public void testSimpleConstructorWithInlineClassParameter() throws Exception { + runTest("compiler/testData/codegen/box/reflection/call/inlineClasses/simpleConstructorWithInlineClassParameter.kt"); + } + @Nested @TestMetadata("compiler/testData/codegen/box/reflection/call/inlineClasses/nonNullObject") @TestDataPath("$PROJECT_ROOT") diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 3724f4edf31..80219aa4aa7 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -32674,6 +32674,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/reflection/call/inlineClasses/primaryValOfInlineClass.kt"); } + @TestMetadata("simpleConstructorWithInlineClassParameter.kt") + public void testSimpleConstructorWithInlineClassParameter() throws Exception { + runTest("compiler/testData/codegen/box/reflection/call/inlineClasses/simpleConstructorWithInlineClassParameter.kt"); + } + @TestMetadata("compiler/testData/codegen/box/reflection/call/inlineClasses/nonNullObject") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/calls/InlineClassAwareCaller.kt b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/calls/InlineClassAwareCaller.kt index 56d1c2c6edd..dd3540a7d8f 100644 --- a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/calls/InlineClassAwareCaller.kt +++ b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/calls/InlineClassAwareCaller.kt @@ -125,16 +125,21 @@ internal class InlineClassAwareCaller( val (range, unbox, box) = data @Suppress("UNCHECKED_CAST") - val unboxed = args.copyOf() as Array - for (index in range) { - val method = unbox[index] + val unboxed = Array(args.size) { index -> val arg = args[index] - // Note that arg may be null in case we're calling a $default method and it's an optional parameter of an inline class type - unboxed[index] = if (method != null) { - if (arg != null) { - method.invoke(arg) + + if (index in range) { + // Note that arg may be null in case we're calling a $default method and it's an optional parameter of an inline class type + val method = unbox[index] + + if (method != null) { + if (arg != null) { + method.invoke(arg) + } else { + defaultPrimitiveValue(method.returnType) + } } else { - defaultPrimitiveValue(method.returnType) + arg } } else { arg