From 7baa89e441d8708a17bc143ef235983efe303bab Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Thu, 31 Mar 2011 21:06:48 +0400 Subject: [PATCH] CF for try's --- .../jet/lang/cfg/JetControlFlowProcessor.java | 8 +++-- .../cfg/pseudocode/InstructionVisitor.java | 4 +++ .../JetControlFlowInstructionsGenerator.java | 2 +- .../NondeterministicJumpInstruction.java | 33 +++++++++++++++++++ .../jet/lang/cfg/pseudocode/Pseudocode.java | 20 ++++++++++- 5 files changed, 63 insertions(+), 4 deletions(-) create mode 100644 idea/src/org/jetbrains/jet/lang/cfg/pseudocode/NondeterministicJumpInstruction.java diff --git a/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java b/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java index 377e7486a98..c7c6800fa1e 100644 --- a/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java +++ b/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java @@ -6,6 +6,7 @@ import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lexer.JetTokens; import java.util.Collections; +import java.util.Iterator; import java.util.List; /** @@ -140,9 +141,12 @@ public class JetControlFlowProcessor { builder.jump(afterCatches); builder.bindLabel(catchBlock); - for (JetCatchClause catchClause : catchClauses) { + for (Iterator iterator = catchClauses.iterator(); iterator.hasNext(); ) { + JetCatchClause catchClause = iterator.next(); value(catchClause.getCatchBody(), true); - builder.nondeterministicJump(afterCatches); + if (iterator.hasNext()) { + builder.nondeterministicJump(afterCatches); + } } builder.bindLabel(afterCatches); diff --git a/idea/src/org/jetbrains/jet/lang/cfg/pseudocode/InstructionVisitor.java b/idea/src/org/jetbrains/jet/lang/cfg/pseudocode/InstructionVisitor.java index aea46e64420..aa780306eea 100644 --- a/idea/src/org/jetbrains/jet/lang/cfg/pseudocode/InstructionVisitor.java +++ b/idea/src/org/jetbrains/jet/lang/cfg/pseudocode/InstructionVisitor.java @@ -34,4 +34,8 @@ public class InstructionVisitor { public void visitInstruction(Instruction instruction) { } + + public void visitNondeterministicJump(NondeterministicJumpInstruction instruction) { + visitJump(instruction); + } } 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 8226786b084..90a05542e3a 100644 --- a/idea/src/org/jetbrains/jet/lang/cfg/pseudocode/JetControlFlowInstructionsGenerator.java +++ b/idea/src/org/jetbrains/jet/lang/cfg/pseudocode/JetControlFlowInstructionsGenerator.java @@ -154,7 +154,7 @@ public class JetControlFlowInstructionsGenerator implements JetControlFlowBuilde @Override public void nondeterministicJump(Label label) { - throw new UnsupportedOperationException(); // TODO + add(new NondeterministicJumpInstruction(label)); } @Override diff --git a/idea/src/org/jetbrains/jet/lang/cfg/pseudocode/NondeterministicJumpInstruction.java b/idea/src/org/jetbrains/jet/lang/cfg/pseudocode/NondeterministicJumpInstruction.java new file mode 100644 index 00000000000..f9a10afe6d4 --- /dev/null +++ b/idea/src/org/jetbrains/jet/lang/cfg/pseudocode/NondeterministicJumpInstruction.java @@ -0,0 +1,33 @@ +package org.jetbrains.jet.lang.cfg.pseudocode; + +import org.jetbrains.jet.lang.cfg.Label; + +/** +* @author abreslav +*/ +public class NondeterministicJumpInstruction extends AbstractJumpInstruction { + + private Instruction next; + + public NondeterministicJumpInstruction(Label targetLabel) { + super(targetLabel); + } + + @Override + public void accept(InstructionVisitor visitor) { + visitor.visitNondeterministicJump(this); + } + + public Instruction getNext() { + return next; + } + + public void setNext(Instruction next) { + this.next = next; + } + + @Override + public String toString() { + return "jmp?(" + getTargetLabel().getName() + ")"; + } +} 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 fcc47875449..1e823439823 100644 --- a/idea/src/org/jetbrains/jet/lang/cfg/pseudocode/Pseudocode.java +++ b/idea/src/org/jetbrains/jet/lang/cfg/pseudocode/Pseudocode.java @@ -36,6 +36,12 @@ public class Pseudocode { instruction.setResolvedTarget(getJumpTarget(instruction.getTargetLabel())); } + @Override + public void visitNondeterministicJump(NondeterministicJumpInstruction instruction) { + instruction.setNext(getNextPosition(currentPosition)); + visitJump(instruction); + } + @Override public void visitConditionalJump(ConditionalJumpInstruction instruction) { Instruction nextInstruction = getNextPosition(currentPosition); @@ -120,7 +126,13 @@ public class Pseudocode { if (newline >= 0) { text = text.substring(0, newline); } - String shape = node instanceof ConditionalJumpInstruction ? "diamond" : "box"; + String shape = "box"; + if (node instanceof ConditionalJumpInstruction) { + shape = "diamond"; + } + else if (node instanceof NondeterministicJumpInstruction) { + shape = "Mdiamond"; + } out.println(name + "[label=\"" + text + "\", shape=" + shape + "];"); } @@ -136,6 +148,12 @@ public class Pseudocode { writeEdge(out, nodeToName.get(instruction), nodeToName.get(instruction.getResolvedTarget()), null); } + @Override + public void visitNondeterministicJump(NondeterministicJumpInstruction instruction) { + visitJump(instruction); + writeEdge(out, nodeToName.get(instruction), nodeToName.get(instruction.getNext()), null); + } + @Override public void visitReturnValue(ReturnValueInstruction instruction) { super.visitReturnValue(instruction);