From 05daa216574451aa4e3bac7be14c2ada66ab2ad9 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Thu, 30 Aug 2018 12:38:31 +0300 Subject: [PATCH] Fix inline class secondary constructor call generation Don't generate NEW+DUP for inline class constructor calls. --- .../kotlin/codegen/ExpressionCodegen.java | 10 +++--- ...sideInlineClassWithPrimitiveCarrierType.kt | 32 +++++++++++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 5 +++ .../LightAnalysisModeTestGenerated.java | 5 +++ .../ir/IrBlackBoxCodegenTestGenerated.java | 5 +++ .../IrJsCodegenBoxTestGenerated.java | 5 +++ .../semantics/JsCodegenBoxTestGenerated.java | 5 +++ 7 files changed, 63 insertions(+), 4 deletions(-) create mode 100644 compiler/testData/codegen/box/inlineClasses/secondaryConstructorsInsideInlineClassWithPrimitiveCarrierType.kt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java index 8c7364a96c9..f7b4e07a0b5 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java @@ -4251,13 +4251,15 @@ public class ExpressionCodegen extends KtVisitor impleme @NotNull public StackValue generateConstructorCall(@NotNull ResolvedCall resolvedCall, @NotNull Type objectType) { return StackValue.functionCall(objectType, null, v -> { - v.anew(objectType); - v.dup(); - ClassConstructorDescriptor constructor = getConstructorDescriptor(resolvedCall); - ReceiverParameterDescriptor dispatchReceiver = constructor.getDispatchReceiverParameter(); ClassDescriptor containingDeclaration = constructor.getContainingDeclaration(); + + if (!containingDeclaration.isInline()) { + v.anew(objectType); + v.dup(); + } + if (dispatchReceiver != null) { KotlinType kotlinType = dispatchReceiver.getType(); Type receiverType = typeMapper.mapType(kotlinType); diff --git a/compiler/testData/codegen/box/inlineClasses/secondaryConstructorsInsideInlineClassWithPrimitiveCarrierType.kt b/compiler/testData/codegen/box/inlineClasses/secondaryConstructorsInsideInlineClassWithPrimitiveCarrierType.kt new file mode 100644 index 00000000000..dc63dd1dc03 --- /dev/null +++ b/compiler/testData/codegen/box/inlineClasses/secondaryConstructorsInsideInlineClassWithPrimitiveCarrierType.kt @@ -0,0 +1,32 @@ +// !LANGUAGE: +InlineClasses +// IGNORE_BACKEND: JVM_IR + +var global = "wrong" + +inline class Foo(val x: Int) { + constructor(y: String) : this(y.length) + + constructor(z: Long) : this(z.toInt() + 1) + + constructor(other: Char) : this(other.toInt().toString()) { + global = "OK" + } + + constructor(a: Int, b: Int) : this(a + b) +} + +fun box(): String { + var f = Foo("42") + if (f.x != 2) return "Fail 1: ${f.x}" + + f = Foo(43L) + if (f.x != 44) return "Fail 2: ${f.x}" + + f = Foo('a') + if (f.x != 2) return "Fail 3: ${f.x}" + + f = Foo(1, 2) + if (f.x != 3) return "Fail 4: ${f.x}" + + return global +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index fe70e56df28..6d5a955ebff 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -11766,6 +11766,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/inlineClasses/secondaryConstructorsInsideInlineClass.kt"); } + @TestMetadata("secondaryConstructorsInsideInlineClassWithPrimitiveCarrierType.kt") + public void testSecondaryConstructorsInsideInlineClassWithPrimitiveCarrierType() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/secondaryConstructorsInsideInlineClassWithPrimitiveCarrierType.kt"); + } + @TestMetadata("toStringCallingPrivateFun.kt") public void testToStringCallingPrivateFun() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/toStringCallingPrivateFun.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 411cc0f8919..fd896775fb5 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -11766,6 +11766,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/inlineClasses/secondaryConstructorsInsideInlineClass.kt"); } + @TestMetadata("secondaryConstructorsInsideInlineClassWithPrimitiveCarrierType.kt") + public void testSecondaryConstructorsInsideInlineClassWithPrimitiveCarrierType() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/secondaryConstructorsInsideInlineClassWithPrimitiveCarrierType.kt"); + } + @TestMetadata("toStringCallingPrivateFun.kt") public void testToStringCallingPrivateFun() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/toStringCallingPrivateFun.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index d00b24da70e..33c701e6a4e 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -11766,6 +11766,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/inlineClasses/secondaryConstructorsInsideInlineClass.kt"); } + @TestMetadata("secondaryConstructorsInsideInlineClassWithPrimitiveCarrierType.kt") + public void testSecondaryConstructorsInsideInlineClassWithPrimitiveCarrierType() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/secondaryConstructorsInsideInlineClassWithPrimitiveCarrierType.kt"); + } + @TestMetadata("toStringCallingPrivateFun.kt") public void testToStringCallingPrivateFun() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/toStringCallingPrivateFun.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 19ae636a890..b6a1b390f6c 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 @@ -10301,6 +10301,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/inlineClasses/secondaryConstructorsInsideInlineClass.kt"); } + @TestMetadata("secondaryConstructorsInsideInlineClassWithPrimitiveCarrierType.kt") + public void testSecondaryConstructorsInsideInlineClassWithPrimitiveCarrierType() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/secondaryConstructorsInsideInlineClassWithPrimitiveCarrierType.kt"); + } + @TestMetadata("toStringCallingPrivateFun.kt") public void testToStringCallingPrivateFun() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/toStringCallingPrivateFun.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 96db6c3fafc..8864711fde5 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 @@ -11366,6 +11366,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/inlineClasses/secondaryConstructorsInsideInlineClass.kt"); } + @TestMetadata("secondaryConstructorsInsideInlineClassWithPrimitiveCarrierType.kt") + public void testSecondaryConstructorsInsideInlineClassWithPrimitiveCarrierType() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/secondaryConstructorsInsideInlineClassWithPrimitiveCarrierType.kt"); + } + @TestMetadata("toStringCallingPrivateFun.kt") public void testToStringCallingPrivateFun() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/toStringCallingPrivateFun.kt");