Fixed out-of-order for-loop body instruction in Python CFG

This commit is contained in:
Andrey Vlasovskikh
2012-05-17 17:57:44 +04:00
parent 110daa825e
commit 12d21d8ecf
7 changed files with 15 additions and 11 deletions
@@ -361,20 +361,24 @@ public class PyControlFlowBuilder extends PyRecursiveElementVisitor {
}
final PyStatementList list = forPart.getStatementList();
if (list != null) {
final Instruction bodyInstruction = myBuilder.startNode(list);
final Instruction body;
final PyExpression target = forPart.getTarget();
if (target != null) {
body = myBuilder.startNode(target);
target.accept(this);
}
else {
body = myBuilder.startNode(list);
}
list.accept(this);
if (myBuilder.prevInstruction != null) {
myBuilder.addEdge(myBuilder.prevInstruction, bodyInstruction); //loop
myBuilder.addEdge(myBuilder.prevInstruction, body); //loop
myBuilder.addPendingEdge(list, myBuilder.prevInstruction); // exit
}
myBuilder.processPending(new ControlFlowBuilder.PendingProcessor() {
public void process(final PsiElement pendingScope, final Instruction instruction) {
if (pendingScope != null && PsiTreeUtil.isAncestor(list, pendingScope, false)) {
myBuilder.addEdge(instruction, bodyInstruction); //loop
myBuilder.addEdge(instruction, body); //loop
myBuilder.addPendingEdge(list, instruction); // exit
}
else {
@@ -1,7 +1,7 @@
0(1) element: null
1(2) element: PyForStatement
2(3,7) READ ACCESS: range
3(4) element: PyStatementList
3(4) element: PyTargetExpression: i
4(5) WRITE ACCESS: i
5(6) element: PyPrintStatement
6(3,7) READ ACCESS: i
@@ -1,7 +1,7 @@
0(1) element: null
1(2) element: PyForStatement
2(3,10) READ ACCESS: lines
3(4) element: PyStatementList
3(4) element: PyTargetExpression: line
4(5) WRITE ACCESS: line
5(6) element: PyIfStatement
6(7,3,10) READ ACCESS: line
@@ -1,7 +1,7 @@
0(1) element: null
1(2) element: PyForStatement
2(3,15) READ ACCESS: self
3(4) element: PyStatementList
3(4) element: PyTupleExpression
4(5) WRITE ACCESS: start
5(6) WRITE ACCESS: end
6(7) WRITE ACCESS: name
@@ -3,16 +3,16 @@
2(3) WRITE ACCESS: tests
3(4) element: PyForStatement
4(5,17) READ ACCESS: tests
5(6) element: PyStatementList
5(6) element: PyTargetExpression: t
6(7) WRITE ACCESS: t
7(8) element: PyTryExceptStatement
8(9,14) element: PyTryPart
9(10,14,5,17) element: PyForStatement
10(11) element: PyStatementList
10(11,14) element: PyTargetExpression: t
11(12,14) WRITE ACCESS: t
12(13,14) element: PyPrintStatement
13(10,14,5,17) READ ACCESS: t
14(15) element: PyExceptPart
15(16) READ ACCESS: Exception
16(3) element: PyContinueStatement
17() element: null
17() element: null
@@ -3,7 +3,7 @@
2(3,8) element: PyTryPart
3(4,8) element: PyForStatement
4(5,8,11) READ ACCESS: bar
5(6) element: PyStatementList
5(6,8) element: PyTargetExpression: i
6(7,8) WRITE ACCESS: i
7(8,11) element: PyBreakStatement
8(9) element: PyExceptPart
@@ -6,7 +6,7 @@
5(6,55) element: PyAssignmentStatement
6(7,55) WRITE ACCESS: b
7(8,53,55) element: PyForStatement
8(9) element: PyStatementList
8(9,55) element: PyTargetExpression: x
9(10,55) WRITE ACCESS: x
10(11,55) element: PyTryExceptStatement
11(12,45) element: PyTryPart