Skip to content

Commit afaaea8

Browse files
committed
support basic generators
1 parent 592ed8a commit afaaea8

File tree

3 files changed

+23
-1
lines changed

3 files changed

+23
-1
lines changed

javascript/ql/src/javascript.qll

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import semmle.javascript.Extend
2727
import semmle.javascript.Externs
2828
import semmle.javascript.Files
2929
import semmle.javascript.Functions
30+
import semmle.javascript.Generators
3031
import semmle.javascript.GlobalAccessPaths
3132
import semmle.javascript.HTML
3233
import semmle.javascript.HtmlSanitizers
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import javascript
2+
private import semmle.javascript.dataflow.internal.PreCallGraphStep
3+
4+
/**
5+
* Classes and predicates for modelling data-flow for generator functions.
6+
*/
7+
private module GeneratorDataFlow {
8+
private import DataFlow::PseudoProperties
9+
10+
private class ArrayIteration extends PreCallGraphStep {
11+
override predicate storeStep(DataFlow::Node pred, DataFlow::SourceNode succ, string prop) {
12+
exists(DataFlow::FunctionNode f | f.getFunction().isGenerator() |
13+
prop = iteratorElement() and
14+
exists(YieldExpr yield | yield.getContainer() = f.getFunction() |
15+
pred.asExpr() = yield.getOperand()
16+
) and
17+
succ = f.getReturnNode()
18+
)
19+
}
20+
}
21+
}

javascript/ql/test/library-tests/Generators/generators.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
yield source;
77
}
88
for (const x of gen1()) {
9-
sink(x); // NOT OK - but not found yet [INCONSISTENCY]
9+
sink(x); // NOT OK
1010
}
1111

1212
function *gen2() {

0 commit comments

Comments
 (0)