mirror of
https://github.com/github/codeql.git
synced 2025-12-28 14:46:33 +01:00
38 lines
1.2 KiB
Plaintext
38 lines
1.2 KiB
Plaintext
/**
|
|
* Provides classes and predicates for working with generator functions.
|
|
*/
|
|
|
|
import javascript
|
|
private import semmle.javascript.dataflow.internal.PreCallGraphStep
|
|
|
|
/**
|
|
* Classes and predicates for modeling data-flow for generator functions.
|
|
*/
|
|
private module GeneratorDataFlow {
|
|
private import DataFlow::PseudoProperties
|
|
|
|
private class ArrayIteration extends PreCallGraphStep {
|
|
override predicate storeStep(DataFlow::Node pred, DataFlow::SourceNode succ, string prop) {
|
|
exists(DataFlow::FunctionNode f | f.getFunction().isGenerator() |
|
|
prop = iteratorElement() and
|
|
exists(YieldExpr yield |
|
|
yield.getContainer() = f.getFunction() and not yield.isDelegating()
|
|
|
|
|
pred.asExpr() = yield.getOperand()
|
|
) and
|
|
succ = f.getReturnNode()
|
|
)
|
|
}
|
|
|
|
override predicate loadStoreStep(DataFlow::Node pred, DataFlow::SourceNode succ, string prop) {
|
|
exists(DataFlow::FunctionNode f | f.getFunction().isGenerator() |
|
|
prop = iteratorElement() and
|
|
exists(YieldExpr yield | yield.getContainer() = f.getFunction() and yield.isDelegating() |
|
|
pred.asExpr() = yield.getOperand()
|
|
) and
|
|
succ = f.getReturnNode()
|
|
)
|
|
}
|
|
}
|
|
}
|