Python: Handle comprehensions with multiple fors

This commit is contained in:
Rasmus Lerchedahl Petersen
2020-08-25 15:21:08 +02:00
parent 1cdb6be531
commit ecf3928ed1
4 changed files with 270 additions and 186 deletions

View File

@@ -437,16 +437,13 @@ predicate comprehensionReadStep(CfgNode nodeFrom, Content c, EssaNode nodeTo) {
// c denotes element of list or set
exists(Comp comp |
// outermost for
exists(For f |
f = getCompFor(comp) and
nodeFrom.getNode().getNode() = getCompIter(comp) and
nodeTo.getVar().getDefinition().(AssignmentDefinition).getDefiningNode().getNode() =
f.getTarget()
)
nodeFrom.getNode().getNode() = comp.getIterable() and
nodeTo.getVar().getDefinition().(AssignmentDefinition).getDefiningNode().getNode() =
comp.getIterationVariable(0).getAStore()
or
// an inner for
exists(int n |
nodeFrom.getNode().getNode() = comp.getNthInnerLoop(n + 1).getIter() and
exists(int n | n > 0 |
nodeFrom.getNode().getNode() = comp.getNthInnerLoop(n).getIter() and
nodeTo.getVar().getDefinition().(AssignmentDefinition).getDefiningNode().getNode() =
comp.getNthInnerLoop(n).getTarget()
)