UNPKG

@eagleoutice/flowr-dev

Version:

Static Dataflow Analyzer and Program Slicer for the R Programming Language

49 lines 2.2 kB
"use strict"; 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