From 9350369fab096703f06b22cd256265b061cc4ed9 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Fri, 10 Aug 2012 14:38:21 +0400 Subject: [PATCH] Fixed codegen for single-branch if #KT-2597 Fixed #KT-2598 Fixed --- .../jet/codegen/ExpressionCodegen.java | 20 +++++++++++++++---- .../org/jetbrains/jet/codegen/StackValue.java | 4 ++++ .../testData/codegen/regressions/kt2597.kt | 10 ++++++++++ .../testData/codegen/regressions/kt2598.kt | 9 +++++++++ .../jet/codegen/ControlStructuresTest.java | 10 ++++++++++ 5 files changed, 49 insertions(+), 4 deletions(-) create mode 100644 compiler/testData/codegen/regressions/kt2597.kt create mode 100644 compiler/testData/codegen/regressions/kt2598.kt diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index 4e822fca3aa..55a746a5a64 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -687,14 +687,26 @@ public class ExpressionCodegen extends JetVisitor { } private StackValue generateSingleBranchIf(StackValue condition, JetExpression expression, boolean inverse) { + Type expressionType = expressionType(expression); + Type targetType = expressionType; + if (!expressionType.equals(TUPLE0_TYPE)) { + targetType = TYPE_OBJECT; + } + + Label elseLabel = new Label(); + condition.condJump(elseLabel, inverse, v); + + gen(expression, expressionType); + StackValue.coerce(expressionType, targetType, v); + Label end = new Label(); + v.goTo(end); - condition.condJump(end, inverse, v); - - gen(expression, Type.VOID_TYPE); + v.mark(elseLabel); + StackValue.putTuple0Instance(v); v.mark(end); - return StackValue.none(); + return StackValue.onStack(targetType); } @Override diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/StackValue.java b/compiler/backend/src/org/jetbrains/jet/codegen/StackValue.java index 4dd772af0c2..88937bf29af 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/StackValue.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/StackValue.java @@ -242,6 +242,10 @@ public abstract class StackValue { else v.iconst(0); } + else if (toType.equals(JetTypeMapper.TUPLE0_TYPE) && !fromType.equals(JetTypeMapper.TUPLE0_TYPE)) { + pop(fromType, v); + putTuple0Instance(v); + } else if (toType.getSort() == Type.OBJECT && fromType.equals(JetTypeMapper.TYPE_OBJECT) || toType.getSort() == Type.ARRAY) { v.checkcast(toType); } diff --git a/compiler/testData/codegen/regressions/kt2597.kt b/compiler/testData/codegen/regressions/kt2597.kt new file mode 100644 index 00000000000..af5af144a86 --- /dev/null +++ b/compiler/testData/codegen/regressions/kt2597.kt @@ -0,0 +1,10 @@ +fun box(): String { + var i = 0 + { + if (1 == 1) { + i++ + } else { + } + }() + return "OK" +} diff --git a/compiler/testData/codegen/regressions/kt2598.kt b/compiler/testData/codegen/regressions/kt2598.kt new file mode 100644 index 00000000000..133f6f42cae --- /dev/null +++ b/compiler/testData/codegen/regressions/kt2598.kt @@ -0,0 +1,9 @@ +fun foo(condition: Boolean): String { + val u = if (condition) { + "OK" + } else { + } + return u.toString() +} + +fun box() = foo(true) diff --git a/compiler/tests/org/jetbrains/jet/codegen/ControlStructuresTest.java b/compiler/tests/org/jetbrains/jet/codegen/ControlStructuresTest.java index 51f30277962..7ee7ec91040 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/ControlStructuresTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/ControlStructuresTest.java @@ -391,4 +391,14 @@ public class ControlStructuresTest extends CodegenTestCase { createEnvironmentWithMockJdkAndIdeaAnnotations(ConfigurationKind.JDK_ONLY); blackBoxFile("controlStructures/tryCatchFinallyChain.kt"); } + + public void testKt2597() { + createEnvironmentWithMockJdkAndIdeaAnnotations(ConfigurationKind.JDK_ONLY); + blackBoxFile("regressions/kt2597.kt"); + } + + public void testKt2598() { + createEnvironmentWithMockJdkAndIdeaAnnotations(ConfigurationKind.JDK_ONLY); + blackBoxFile("regressions/kt2598.kt"); + } }