UNPKG

@eagleoutice/flowr-dev

Version:

Static Dataflow Analyzer and Program Slicer for the R Programming Language

58 lines 2.71 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.fingerPrintOfQuery = fingerPrintOfQuery; exports.executeStaticSliceQuery = executeStaticSliceQuery; const static_slicer_1 = require("../../../slicing/static/static-slicer"); const slice_query_options_1 = require("../slice-query-options"); const log_1 = require("../../../util/log"); const slice_direction_1 = require("../../../util/slice-direction"); const df_helper_1 = require("../../../dataflow/graph/df-helper"); /** * Produce a fingerprint string for a static slice query */ function fingerPrintOfQuery(query) { return JSON.stringify(query); } /** * Execute static slice queries, catching duplicates with the same fingerprint * @param analyzer - The basic query data containing the analyzer * @param queries - The static slice queries to execute * @returns The results of the static slice queries */ async function executeStaticSliceQuery({ analyzer }, queries) { const start = Date.now(); const results = {}; for (const query of queries) { const key = fingerPrintOfQuery(query); if (results[key]) { log_1.log.warn(`Duplicate Key for slicing-query: ${key}, skipping...`); } const { criteria, noReconstruction, includeCallees } = query; const sliceStart = Date.now(); const n = await analyzer.normalize(); const df = await analyzer.dataflow(); const slice = (0, static_slicer_1.staticSlice)({ ctx: analyzer.inspectContext(), info: df, ast: n, ids: (0, slice_query_options_1.resolveSliceCriteria)(criteria, n), direction: query.direction ?? slice_direction_1.SliceDirection.Backward, threshold: analyzer.flowrConfig.solver.slicer?.threshold, includeCallees }); const sliceEnd = Date.now(); const packages = query.reportPackages ? [...df_helper_1.Dataflow.packagesOf(slice.result, df.graph)] : undefined; if (noReconstruction) { results[key] = { packages, slice: { ...slice, '.meta': { timing: sliceEnd - sliceStart } } }; } else { const reconstructStart = Date.now(); const reconstruct = (0, slice_query_options_1.reconstructSlice)(n, df.graph, slice.result, query); const reconstructEnd = Date.now(); results[key] = { packages, slice: { ...slice, '.meta': { timing: sliceEnd - sliceStart } }, reconstruct: { ...reconstruct, '.meta': { timing: reconstructEnd - reconstructStart } } }; } } return { '.meta': { timing: Date.now() - start }, results }; } //# sourceMappingURL=static-slice-query-executor.js.map