From cc415f62b503e1e38800204f8314de8de3bb80fe Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Thu, 15 Apr 2021 13:08:39 +0300 Subject: [PATCH] JVM_IR KT-46092 fix array spread operator in Kotlin->Java call --- .../FirBlackBoxCodegenTestGenerated.java | 6 ++++++ .../kotlin/backend/jvm/JvmSymbols.kt | 19 +++++++---------- .../testData/codegen/box/vararg/kt46092.kt | 21 +++++++++++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 6 ++++++ .../IrBlackBoxCodegenTestGenerated.java | 6 ++++++ .../LightAnalysisModeTestGenerated.java | 5 +++++ 6 files changed, 52 insertions(+), 11 deletions(-) create mode 100644 compiler/testData/codegen/box/vararg/kt46092.kt diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java index f19a4e5d0d5..c17b29ecfef 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java @@ -41056,6 +41056,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/vararg/kt45187.kt"); } + @Test + @TestMetadata("kt46092.kt") + public void testKt46092() throws Exception { + runTest("compiler/testData/codegen/box/vararg/kt46092.kt"); + } + @Test @TestMetadata("kt581.kt") public void testKt581() throws Exception { diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmSymbols.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmSymbols.kt index fca7e32e40b..a411c92e9c4 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmSymbols.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmSymbols.kt @@ -745,13 +745,13 @@ class JvmSymbols( } } - private val arraysCopyOfFunctions = HashMap() + private val arraysCopyOfFunctions = HashMap() private fun IrClass.addArraysCopyOfFunction(arrayType: IrSimpleType) { addFunction("copyOf", arrayType, isStatic = true).apply { addValueParameter("original", arrayType) addValueParameter("newLength", irBuiltIns.intType) - arraysCopyOfFunctions[arrayType] = this + arraysCopyOfFunctions[arrayType.classifierOrFail] = this } } @@ -771,15 +771,12 @@ class JvmSymbols( } fun getArraysCopyOfFunction(arrayType: IrSimpleType): IrSimpleFunctionSymbol { - val copyOf = arraysCopyOfFunctions[arrayType] - return when { - copyOf != null -> - copyOf.symbol - arrayType.classifierOrFail == array -> - arraysCopyOfFunctions[arrayOfAnyNType]!!.symbol - else -> - throw AssertionError("Array type expected: ${arrayType.render()}") - } + val classifier = arrayType.classifier + val copyOf = arraysCopyOfFunctions[classifier] + if (copyOf != null) + return copyOf.symbol + else + throw AssertionError("Array type expected: ${arrayType.render()}") } private val javaLangInteger: IrClassSymbol = createClass(FqName("java.lang.Integer")) { klass -> diff --git a/compiler/testData/codegen/box/vararg/kt46092.kt b/compiler/testData/codegen/box/vararg/kt46092.kt new file mode 100644 index 00000000000..92c2284cf97 --- /dev/null +++ b/compiler/testData/codegen/box/vararg/kt46092.kt @@ -0,0 +1,21 @@ +// TARGET_BACKEND: JVM +// WITH_RUNTIME +// FILE: kt46092.kt + +class CharSequenceBackedByChars : CharArrayCharSequence { + constructor(chars: CharArray) : super(*chars) + + fun test(): String = string +} + +fun box() = CharSequenceBackedByChars(charArrayOf('O', 'K')).test() + +// FILE: CharArrayCharSequence.java + +public class CharArrayCharSequence { + protected final String string; + + public CharArrayCharSequence(char... chars) { + string = new String(chars); + } +} 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 747150cb382..ec0e4bfeca5 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 @@ -41032,6 +41032,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/vararg/kt45187.kt"); } + @Test + @TestMetadata("kt46092.kt") + public void testKt46092() throws Exception { + runTest("compiler/testData/codegen/box/vararg/kt46092.kt"); + } + @Test @TestMetadata("kt581.kt") public void testKt581() throws Exception { 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 9e6cb9f2afe..1d66285cf6e 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 @@ -41056,6 +41056,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/vararg/kt45187.kt"); } + @Test + @TestMetadata("kt46092.kt") + public void testKt46092() throws Exception { + runTest("compiler/testData/codegen/box/vararg/kt46092.kt"); + } + @Test @TestMetadata("kt581.kt") public void testKt581() throws Exception { diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index e5706dd5635..ce5acb0d68a 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -33008,6 +33008,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/vararg/kt45187.kt"); } + @TestMetadata("kt46092.kt") + public void testKt46092() throws Exception { + runTest("compiler/testData/codegen/box/vararg/kt46092.kt"); + } + @TestMetadata("kt581.kt") public void testKt581() throws Exception { runTest("compiler/testData/codegen/box/vararg/kt581.kt");