From 45035d3e111e5411b7b3944528d6dd60eca35662 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Fri, 7 Dec 2018 13:06:11 +0300 Subject: [PATCH] KT-28405 Fix toString for inline classes with underlying arrays --- .../FunctionsFromAnyGeneratorImpl.java | 14 ++++++----- .../codegen/box/inlineClasses/kt28405.kt | 23 +++++++++++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 5 ++++ .../LightAnalysisModeTestGenerated.java | 5 ++++ .../ir/IrBlackBoxCodegenTestGenerated.java | 5 ++++ .../IrJsCodegenBoxTestGenerated.java | 5 ++++ .../semantics/JsCodegenBoxTestGenerated.java | 5 ++++ 7 files changed, 56 insertions(+), 6 deletions(-) create mode 100644 compiler/testData/codegen/box/inlineClasses/kt28405.kt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionsFromAnyGeneratorImpl.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionsFromAnyGeneratorImpl.java index 9481a991202..b09fe5c0058 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionsFromAnyGeneratorImpl.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionsFromAnyGeneratorImpl.java @@ -20,6 +20,7 @@ import org.jetbrains.kotlin.lexer.KtTokens; import org.jetbrains.kotlin.psi.KtClassOrObject; import org.jetbrains.kotlin.resolve.BindingContext; import org.jetbrains.kotlin.resolve.InlineClassesUtilsKt; +import org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilsKt; import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin; import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOriginKt; import org.jetbrains.kotlin.types.KotlinType; @@ -107,21 +108,22 @@ public class FunctionsFromAnyGeneratorImpl extends FunctionsFromAnyGenerator { JvmKotlinType type = genOrLoadOnStack(iv, context, propertyDescriptor, 0); Type asmType = type.getType(); + KotlinType kotlinType = type.getKotlinType(); if (asmType.getSort() == Type.ARRAY) { Type elementType = correctElementType(asmType); if (elementType.getSort() == Type.OBJECT || elementType.getSort() == Type.ARRAY) { iv.invokestatic("java/util/Arrays", "toString", "([Ljava/lang/Object;)Ljava/lang/String;", false); asmType = JAVA_STRING_TYPE; + kotlinType = DescriptorUtilsKt.getBuiltIns(function).getStringType(); } - else { - if (elementType.getSort() != Type.CHAR) { - iv.invokestatic("java/util/Arrays", "toString", "(" + asmType.getDescriptor() + ")Ljava/lang/String;", false); - asmType = JAVA_STRING_TYPE; - } + else if (elementType.getSort() != Type.CHAR) { + iv.invokestatic("java/util/Arrays", "toString", "(" + asmType.getDescriptor() + ")Ljava/lang/String;", false); + asmType = JAVA_STRING_TYPE; + kotlinType = DescriptorUtilsKt.getBuiltIns(function).getStringType(); } } - genInvokeAppendMethod(iv, asmType, type.getKotlinType(), typeMapper); + genInvokeAppendMethod(iv, asmType, kotlinType, typeMapper); } iv.aconst(")"); diff --git a/compiler/testData/codegen/box/inlineClasses/kt28405.kt b/compiler/testData/codegen/box/inlineClasses/kt28405.kt new file mode 100644 index 00000000000..25c39c66e7a --- /dev/null +++ b/compiler/testData/codegen/box/inlineClasses/kt28405.kt @@ -0,0 +1,23 @@ +// !LANGUAGE: +InlineClasses +// WITH_RUNTIME +// IGNORE_BACKEND: JVM_IR, JS_IR + +import kotlin.test.* + +inline class TestUIntArrayW(val x: UIntArray) + +inline class InlineCharArray(val x: CharArray) { + override fun toString(): String = x.contentToString() +} + +inline class TestInlineCharArrayW(val x: InlineCharArray) + +fun box(): String { + val t1 = TestUIntArrayW(UIntArray(1)).toString() + if (!t1.startsWith("TestUIntArrayW")) throw AssertionError(t1) + + val t2 = TestInlineCharArrayW(InlineCharArray(charArrayOf('a'))).toString() + if (!t2.startsWith("TestInlineCharArrayW")) throw AssertionError(t2) + + return "OK" +} diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 18babfc22d2..e7b2e6539dc 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -12120,6 +12120,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/inlineClasses/kt27706.kt"); } + @TestMetadata("kt28405.kt") + public void testKt28405() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/kt28405.kt"); + } + @TestMetadata("mapInlineClassesWithSuppressWildcardsMode.kt") public void testMapInlineClassesWithSuppressWildcardsMode() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/mapInlineClassesWithSuppressWildcardsMode.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index ddf3e245513..40da6125c6a 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -12120,6 +12120,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/inlineClasses/kt27706.kt"); } + @TestMetadata("kt28405.kt") + public void testKt28405() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/kt28405.kt"); + } + @TestMetadata("mapInlineClassesWithSuppressWildcardsMode.kt") public void testMapInlineClassesWithSuppressWildcardsMode() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/mapInlineClassesWithSuppressWildcardsMode.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index 55171650e29..546f2d5ecca 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -12125,6 +12125,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/inlineClasses/kt27706.kt"); } + @TestMetadata("kt28405.kt") + public void testKt28405() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/kt28405.kt"); + } + @TestMetadata("mapInlineClassesWithSuppressWildcardsMode.kt") public void testMapInlineClassesWithSuppressWildcardsMode() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/mapInlineClassesWithSuppressWildcardsMode.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrJsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrJsCodegenBoxTestGenerated.java index 6766b349a4f..75991d5ee5a 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrJsCodegenBoxTestGenerated.java @@ -10490,6 +10490,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/inlineClasses/kt27706.kt"); } + @TestMetadata("kt28405.kt") + public void testKt28405() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/kt28405.kt"); + } + @TestMetadata("noAssertionsOnInlineClassBasedOnNullableType.kt") public void testNoAssertionsOnInlineClassBasedOnNullableType() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/noAssertionsOnInlineClassBasedOnNullableType.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index 5391e50ecf5..13138a3bb73 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -11545,6 +11545,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/inlineClasses/kt27706.kt"); } + @TestMetadata("kt28405.kt") + public void testKt28405() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/kt28405.kt"); + } + @TestMetadata("noAssertionsOnInlineClassBasedOnNullableType.kt") public void testNoAssertionsOnInlineClassBasedOnNullableType() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/noAssertionsOnInlineClassBasedOnNullableType.kt");