analyses
Version:
basic data flow analyses framework based on esprima
60 lines (47 loc) • 2.2 kB
Markdown
Basic data flow analyses framework based on esprima
[](https://travis-ci.org/Swatinem/analyses)
[](https://coveralls.io/r/Swatinem/analyses)
[](https://gemnasium.com/Swatinem/analyses)
$ npm install analyses
analyses depends on a globally available `Map`, which can either be provided by
running with `--harmony` or by preloading a shim before using the library.
analyses itself explicitly does not depend on a shim itself, to be more forward
compatible and to give you more choice.
Since the collections, specifically `Set` in `--harmony`
[](https://code.google.com/p/v8/issues/detail?id=2323),
analyses provides a minimal `analyses.Set` shim with some useful set operations.
This will change once native `--harmony` Sets are actually useful.
```js
var cfg = esgraph(esprima.parse('…'));
var output = analyses(cfg, function (input, list) {
this; // the cfg node
input; // the input set
list; // the worklist `.push()` nodes to it.
return new analyses.Set(); // either return a new output Set
// or return an output Set and `enqueue: false` so the worklist algorithm does
// not check and enqueue successors itself.
return {output: new analyses.Set(), enqueue: false}
}, {
// direction:
// forward or backward; defaults to forward
direction: 'forward',
// custom merge function:
// typically union or intersect; defaults to union
// merge function takes an array of inputs
// `analyses.merge()` wraps a function which takes a pair `a, b` of inputs
merge: analyses.merge(analyses.Set.union),
// custom equals function:
// this is used to determine if the output of a node still changes and to
// not enqueue any more successors and stop the iteration; defaults to
// Set.equals
equals: analyses.Set.equals
});
// the output is a `Map` from CFG nodes to a result set of type `analyses.Set`
output.get(cfg[0]).values()
```
LGPLv3