From 511ba94611a3ac3ede02d9e2265398f4ec994a65 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Thu, 14 Apr 2011 20:14:56 +0400 Subject: [PATCH] Fix for returning new --- .../jet/lang/cfg/JetControlFlowBuilder.java | 14 ++++++++------ .../jet/lang/cfg/JetControlFlowBuilderAdapter.java | 6 ++++++ .../jet/lang/cfg/JetControlFlowProcessor.java | 10 ++++++++++ .../jet/lang/cfg/pseudocode/InstructionImpl.java | 1 + .../JetControlFlowInstructionsGenerator.java | 7 ++++++- .../jet/lang/cfg/pseudocode/Pseudocode.java | 1 + 6 files changed, 32 insertions(+), 7 deletions(-) diff --git a/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilder.java b/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilder.java index 8f5867c01bb..ec47c88c071 100644 --- a/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilder.java +++ b/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilder.java @@ -4,6 +4,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.psi.JetElement; import org.jetbrains.jet.lang.psi.JetExpression; +import org.jetbrains.jet.lang.psi.JetThrowExpression; /** * @author abreslav @@ -17,28 +18,29 @@ public interface JetControlFlowBuilder { Label createUnboundLabel(); void bindLabel(@NotNull Label label); + // Jumps void jump(@NotNull Label label); void jumpOnFalse(@NotNull Label label); - void jumpOnTrue(@NotNull Label label); - void nondeterministicJump(Label label); // Maybe, jump to label + void jumpToError(@NotNull JetThrowExpression expression); + // Entry/exit points Label getEntryPoint(@NotNull JetElement labelElement); - Label getExitPoint(@NotNull JetElement labelElement); + // Loops Label enterLoop(@NotNull JetExpression expression, Label loopExitPoint); void exitLoop(@NotNull JetExpression expression); - @Nullable JetElement getCurrentLoop(); + // Finally void enterTryFinally(@NotNull GenerationTrigger trigger); - void exitTryFinally(); + // Subroutines void enterSubroutine(@NotNull JetElement subroutine, boolean isFunctionLiteral); @@ -46,8 +48,8 @@ public interface JetControlFlowBuilder { @Nullable JetElement getCurrentSubroutine(); - void returnValue(@NotNull JetExpression returnExpression, @NotNull JetElement subroutine); + void returnNoValue(@NotNull JetElement returnExpression, @NotNull JetElement subroutine); void writeNode(@NotNull JetElement assignment, @NotNull JetElement lValue); diff --git a/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilderAdapter.java b/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilderAdapter.java index c0ff7133c8d..769bf232908 100644 --- a/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilderAdapter.java +++ b/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilderAdapter.java @@ -4,6 +4,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.psi.JetElement; import org.jetbrains.jet.lang.psi.JetExpression; +import org.jetbrains.jet.lang.psi.JetThrowExpression; /** * @author abreslav @@ -56,6 +57,11 @@ public class JetControlFlowBuilderAdapter implements JetControlFlowBuilder { builder.nondeterministicJump(label); } + @Override + public void jumpToError(@NotNull JetThrowExpression expression) { + builder.jumpToError(expression); + } + @Override public Label getEntryPoint(@NotNull JetElement labelElement) { return builder.getEntryPoint(labelElement); diff --git a/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java b/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java index 031baed2986..36b02ed0a68 100644 --- a/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java +++ b/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java @@ -505,6 +505,7 @@ public class JetControlFlowProcessor { // TODO : Instantiated class is loaded // TODO : type arguments? visitCall(expression); + builder.readNode(expression); } @Override @@ -540,6 +541,15 @@ public class JetControlFlowProcessor { // TODO : Support Type Arguments. Class object may be initialized at this point"); } + @Override + public void visitThrowExpression(JetThrowExpression expression) { + JetExpression thrownExpression = expression.getThrownExpression(); + if (thrownExpression != null) { + value(thrownExpression, false, false); + } + builder.jumpToError(expression); + } + @Override public void visitJetElement(JetElement elem) { builder.unsupported(elem); diff --git a/idea/src/org/jetbrains/jet/lang/cfg/pseudocode/InstructionImpl.java b/idea/src/org/jetbrains/jet/lang/cfg/pseudocode/InstructionImpl.java index b9c322f0f4c..bcdbd850dcf 100644 --- a/idea/src/org/jetbrains/jet/lang/cfg/pseudocode/InstructionImpl.java +++ b/idea/src/org/jetbrains/jet/lang/cfg/pseudocode/InstructionImpl.java @@ -24,6 +24,7 @@ public abstract class InstructionImpl implements Instruction { @Override public void setOwner(@NotNull Pseudocode owner) { + assert this.owner == null || this.owner == owner; this.owner = owner; } diff --git a/idea/src/org/jetbrains/jet/lang/cfg/pseudocode/JetControlFlowInstructionsGenerator.java b/idea/src/org/jetbrains/jet/lang/cfg/pseudocode/JetControlFlowInstructionsGenerator.java index 0441a7e4aa6..ad740c1e790 100644 --- a/idea/src/org/jetbrains/jet/lang/cfg/pseudocode/JetControlFlowInstructionsGenerator.java +++ b/idea/src/org/jetbrains/jet/lang/cfg/pseudocode/JetControlFlowInstructionsGenerator.java @@ -8,6 +8,7 @@ import org.jetbrains.jet.lang.cfg.Label; import org.jetbrains.jet.lang.psi.JetElement; import org.jetbrains.jet.lang.psi.JetExpression; import org.jetbrains.jet.lang.psi.JetFunctionLiteralExpression; +import org.jetbrains.jet.lang.psi.JetThrowExpression; import java.util.*; @@ -85,7 +86,6 @@ public class JetControlFlowInstructionsGenerator extends JetControlFlowBuilderAd private void add(@NotNull Instruction instruction) { pseudocode.addInstruction(instruction); - instruction.setOwner(pseudocode); if (instruction instanceof JetElementInstruction) { JetElementInstruction elementInstruction = (JetElementInstruction) instruction; trace.recordRepresentativeInstruction(elementInstruction.getElement(), instruction); @@ -239,6 +239,11 @@ public class JetControlFlowInstructionsGenerator extends JetControlFlowBuilderAd add(new NondeterministicJumpInstruction(label)); } + @Override + public void jumpToError(@NotNull JetThrowExpression expression) { +// add(new UnconditionalJumpInstruction(error)); + } + @Override public void enterTryFinally(@NotNull GenerationTrigger generationTrigger) { allBlocks.push(new TryFinallyBlockInfo(generationTrigger)); diff --git a/idea/src/org/jetbrains/jet/lang/cfg/pseudocode/Pseudocode.java b/idea/src/org/jetbrains/jet/lang/cfg/pseudocode/Pseudocode.java index 26514ff8eb2..ae19f0c54ca 100644 --- a/idea/src/org/jetbrains/jet/lang/cfg/pseudocode/Pseudocode.java +++ b/idea/src/org/jetbrains/jet/lang/cfg/pseudocode/Pseudocode.java @@ -76,6 +76,7 @@ public class Pseudocode { public void addInstruction(Instruction instruction) { instructions.add(instruction); + instruction.setOwner(this); if (instruction instanceof SubroutineExitInstruction) { SubroutineExitInstruction exitInstruction = (SubroutineExitInstruction) instruction; assert this.exitInstruction == null;