@eagleoutice/flowr-dev
Version:
Static Dataflow Analyzer and Program Slicer for the R Programming Language
49 lines • 2.2 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.executeDiceQuery = executeDiceQuery;
const static_slicer_1 = require("../../../slicing/static/static-slicer");
const slice_query_options_1 = require("../slice-query-options");
const log_1 = require("../../../util/log");
/**
* Execute dice queries. Each dice computes the intersection of a forward slice from `from`
* and a backward slice from `to`, yielding only those program points that lie on a path
* from the start criteria to the end criteria.
*/
async function executeDiceQuery({ analyzer }, queries) {
const start = Date.now();
const results = {};
const ast = await analyzer.normalize();
const df = await analyzer.dataflow();
for (const query of queries) {
const key = JSON.stringify(query);
if (results[key]) {
log_1.log.warn(`Duplicate key for dice-query: ${key}, skipping...`);
continue;
}
const { from, to, noReconstruction, includeCallees } = query;
const startIds = (0, slice_query_options_1.resolveSliceCriteria)(from, ast);
const endIds = (0, slice_query_options_1.resolveSliceCriteria)(to, ast);
const sliceStart = Date.now();
const slice = (0, static_slicer_1.staticDice)(analyzer.inspectContext(), df, ast, startIds, endIds, analyzer.flowrConfig.solver.slicer?.threshold, includeCallees);
const sliceEnd = Date.now();
if (noReconstruction) {
results[key] = { slice: { ...slice, '.meta': { timing: sliceEnd - sliceStart } } };
}
else {
const reconstructStart = Date.now();
const reconstruct = (0, slice_query_options_1.reconstructSlice)(ast, df.graph, slice.result, query);
const reconstructEnd = Date.now();
results[key] = {
slice: { ...slice, '.meta': { timing: sliceEnd - sliceStart } },
reconstruct: { ...reconstruct, '.meta': { timing: reconstructEnd - reconstructStart } }
};
}
}
return {
'.meta': {
timing: Date.now() - start
},
results
};
}
//# sourceMappingURL=dice-query-executor.js.map