CF for try's

This commit is contained in:
Andrey Breslav
2011-03-31 21:06:48 +04:00
parent 5888ac5a60
commit 7baa89e441
5 changed files with 63 additions and 4 deletions
@@ -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<JetCatchClause> 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);
@@ -34,4 +34,8 @@ public class InstructionVisitor {
public void visitInstruction(Instruction instruction) {
}
public void visitNondeterministicJump(NondeterministicJumpInstruction instruction) {
visitJump(instruction);
}
}
@@ -154,7 +154,7 @@ public class JetControlFlowInstructionsGenerator implements JetControlFlowBuilde
@Override
public void nondeterministicJump(Label label) {
throw new UnsupportedOperationException(); // TODO
add(new NondeterministicJumpInstruction(label));
}
@Override
@@ -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() + ")";
}
}
@@ -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);