@eagleoutice/flowr-dev
Version:
Static Dataflow Analyzer and Program Slicer for the R Programming Language
42 lines • 1.82 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.executeHappensBefore = executeHappensBefore;
const happens_before_query_format_1 = require("./happens-before-query-format");
const logic_1 = require("../../../util/logic");
const log_1 = require("../../../util/log");
const happens_before_1 = require("../../../control-flow/happens-before");
const parse_1 = require("../../../slicing/criterion/parse");
const cfg_kind_1 = require("../../../project/cfg-kind");
/**
* Execute happens-before queries on the given analyzer.
* This checks, whether for two given slicing criteria `a` and `b`, `a` happens before `b` in the control flow graph.
*/
async function executeHappensBefore({ analyzer }, queries) {
const start = Date.now();
const results = {};
const ast = await analyzer.normalize();
const cfg = await analyzer.controlflow(undefined, cfg_kind_1.CfgKind.Quick);
for (const query of queries) {
const { a, b } = query;
const fingerprint = happens_before_query_format_1.HappensBeforeKey.of(a, b);
if (fingerprint in results) {
log_1.log.warn('Duplicate happens-before query', query, 'ignoring');
}
try {
const resolvedA = parse_1.SlicingCriterion.parse(a, ast.idMap);
const resolvedB = parse_1.SlicingCriterion.parse(b, ast.idMap);
results[fingerprint] = (0, happens_before_1.happensBefore)(cfg.graph, resolvedA, resolvedB);
}
catch (e) {
log_1.log.error('Error while executing happens-before query', query, e);
results[fingerprint] = logic_1.Ternary.Maybe;
}
}
return {
'.meta': {
timing: Date.now() - start
},
results
};
}
//# sourceMappingURL=happens-before-query-executor.js.map