UNPKG

@eagleoutice/flowr-dev

Version:

Static Dataflow Analyzer and Program Slicer for the R Programming Language

42 lines 1.82 kB
"use strict"; 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