@eagleoutice/flowr-dev
Version:
Static Dataflow Analyzer and Program Slicer for the R Programming Language
63 lines • 2.69 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.executeAbsintQuery = executeAbsintQuery;
const cfg_kind_1 = require("../../../project/cfg-kind");
const parse_1 = require("../../../slicing/criterion/parse");
const log_1 = require("../../../util/log");
const absint_query_format_1 = require("./absint-query-format");
/**
* Executes the given abstract interpretation queries using the provided analyzer.
*/
async function executeAbsintQuery({ analyzer }, queries) {
if (queries.length === 0 || queries.some(query => query.inference !== queries[0].inference)) {
throw new Error('The inference types of bundled abstract interpretation queries must be the same.');
}
if (queries.length > 1 && queries.some(query => query.criteria === undefined)) {
log_1.log.warn('The abstract interpretation query expects only up to one query without slicing criteria, but got', queries.length);
queries = [{ type: 'absint', inference: queries[0].inference }];
}
const inference = absint_query_format_1.AbsintQueryInferences[queries[0].inference];
const ast = await analyzer.normalize();
const dfg = (await analyzer.dataflow()).graph;
const cfg = await analyzer.controlflow(undefined, cfg_kind_1.CfgKind.NoFunctionDefs);
const start = Date.now();
const visitor = inference({ controlFlow: cfg, dfg, normalizedAst: ast, ctx: analyzer.inspectContext() });
visitor.start();
const endState = visitor.getEndState();
if (queries.length === 1 && queries[0].criteria === undefined) {
return {
'.meta': {
timing: Date.now() - start
},
result: endState
};
}
const result = new Map();
for (const query of queries) {
if (query.criteria === undefined) {
log_1.log.warn('Missing criterion in abstract interpretation query');
continue;
}
for (const criterion of query.criteria) {
if (result.has(criterion)) {
log_1.log.warn('Duplicate criterion in abstract interpretation query:', query.criteria);
continue;
}
try {
const nodeId = parse_1.SlicingCriterion.parse(criterion, ast.idMap);
const value = visitor.getAbstractValue(nodeId);
result.set(criterion, value);
}
catch (err) {
console.error(err instanceof Error ? err.message : err);
}
}
}
return {
'.meta': {
timing: Date.now() - start
},
result: result
};
}
//# sourceMappingURL=absint-query-executor.js.map