mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
Fixed out-of-order for-loop body instruction in Python CFG
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user