diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/CodegenStatementVisitor.java b/compiler/backend/src/org/jetbrains/jet/codegen/CodegenStatementVisitor.java index e559f87fb04..7f402caa317 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/CodegenStatementVisitor.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/CodegenStatementVisitor.java @@ -45,4 +45,9 @@ public class CodegenStatementVisitor extends JetVisitor public StackValue visitWhenExpression(@NotNull JetWhenExpression expression, StackValue data) { return codegen.generateWhenExpression(expression, true); } + + @Override + public StackValue visitBlockExpression(@NotNull JetBlockExpression expression, StackValue data) { + return codegen.generateBlock(expression, true); + } } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index 842d6bbaaf4..609e89eed09 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -443,7 +443,7 @@ public class ExpressionCodegen extends JetVisitor implem statements.addAll(doWhileStatements); statements.add(condition); - conditionValue = generateBlock(statements, true, continueLabel); + conditionValue = generateBlock(statements, false, continueLabel); } else { if (body != null) { @@ -1277,10 +1277,7 @@ public class ExpressionCodegen extends JetVisitor implem @Override public StackValue visitBlockExpression(@NotNull JetBlockExpression expression, StackValue receiver) { - List statements = expression.getStatements(); - JetType unitType = KotlinBuiltIns.getInstance().getUnitType(); - boolean lastStatementIsExpression = !unitType.equals(bindingContext.get(EXPRESSION_TYPE, expression)); - return generateBlock(statements, lastStatementIsExpression); + return generateBlock(expression, false); } @Override @@ -1413,11 +1410,11 @@ public class ExpressionCodegen extends JetVisitor implem } } - private StackValue generateBlock(List statements, boolean lastStatementIsExpression) { - return generateBlock(statements, lastStatementIsExpression, null); + /* package */ StackValue generateBlock(@NotNull JetBlockExpression expression, boolean isStatement) { + return generateBlock(expression.getStatements(), isStatement, null); } - private StackValue generateBlock(List statements, boolean lastStatementIsExpression, Label labelBeforeLastExpression) { + private StackValue generateBlock(List statements, boolean isStatement, Label labelBeforeLastExpression) { Label blockEnd = new Label(); List> leaveTasks = Lists.newArrayList(); @@ -1449,7 +1446,7 @@ public class ExpressionCodegen extends JetVisitor implem generateLocalFunctionDeclaration((JetNamedFunction) statement, leaveTasks); } - boolean isExpression = !iterator.hasNext() && lastStatementIsExpression; + boolean isExpression = !iterator.hasNext() && !isStatement; if (isExpression && labelBeforeLastExpression != null) { v.mark(labelBeforeLastExpression); }