UNPKG

@eagleoutice/flowr-dev

Version:

Static Dataflow Analyzer and Program Slicer for the R Programming Language

63 lines 2.69 kB
"use strict"; 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