From dfb17a5f0e4cd973e5760a5de80b5dc44f759d68 Mon Sep 17 00:00:00 2001 From: svtk Date: Tue, 8 Nov 2011 16:25:04 +0400 Subject: [PATCH] KT-58 Allow finally around definite returns --- .../jet/lang/cfg/JetControlFlowBuilder.java | 1 + .../cfg/JetControlFlowBuilderAdapter.java | 6 + .../jet/lang/cfg/JetControlFlowProcessor.java | 46 +- .../JetControlFlowInstructionsGenerator.java | 7 + .../NondeterministicJumpInstruction.java | 2 +- .../jet/lang/cfg/pseudocode/Pseudocode.java | 72 ++- compiler/testData/cfg/Finally.instructions | 573 ++++++++++++------ compiler/testData/cfg/Finally.jet | 58 ++ .../full/regression/kt58.jet | 91 +++ .../jetbrains/jet/cfg/JetControlFlowTest.java | 26 +- 10 files changed, 654 insertions(+), 228 deletions(-) create mode 100644 compiler/testData/checkerWithErrorTypes/full/regression/kt58.jet diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilder.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilder.java index 72360b8b838..7425493651c 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilder.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilder.java @@ -18,6 +18,7 @@ public interface JetControlFlowBuilder { Label createUnboundLabel(); void bindLabel(@NotNull Label label); + void allowDead(); // Jumps void jump(@NotNull Label label); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilderAdapter.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilderAdapter.java index af961793212..df5470480f4 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilderAdapter.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilderAdapter.java @@ -37,6 +37,12 @@ public class JetControlFlowBuilderAdapter implements JetControlFlowBuilder { builder.bindLabel(label); } + @Override + public void allowDead() { + assert builder != null; + builder.allowDead(); + } + @Override public void jump(@NotNull Label label) { assert builder != null; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java index b65c0db05c5..bc30b50af1e 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java @@ -5,18 +5,19 @@ import com.intellij.psi.PsiElement; import com.intellij.psi.tree.IElementType; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.jet.lang.descriptors.CallableDescriptor; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingContextUtils; import org.jetbrains.jet.lang.resolve.BindingTrace; -import org.jetbrains.jet.lang.resolve.calls.ResolvedCall; import org.jetbrains.jet.lang.types.JetStandardClasses; import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.expressions.OperatorConventions; import org.jetbrains.jet.lexer.JetTokens; -import java.util.*; +import java.util.Collections; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; import static org.jetbrains.jet.lang.diagnostics.Errors.*; @@ -356,18 +357,35 @@ public class JetControlFlowProcessor { }); } - Label onException = builder.createUnboundLabel(); - builder.nondeterministicJump(onException); + List catchClauses = expression.getCatchClauses(); + final boolean hasCatches = !catchClauses.isEmpty(); + Label onException = null; + if (hasCatches) { + onException = builder.createUnboundLabel(); + builder.nondeterministicJump(onException); + } value(expression.getTryBlock(), inCondition); - List catchClauses = expression.getCatchClauses(); - if (!catchClauses.isEmpty()) { + if (hasCatches) { + builder.allowDead(); Label afterCatches = builder.createUnboundLabel(); builder.jump(afterCatches); builder.bindLabel(onException); - for (Iterator iterator = catchClauses.iterator(); iterator.hasNext(); ) { - JetCatchClause catchClause = iterator.next(); + LinkedList