@eagleoutice/flowr-dev
Version:
Static Dataflow Analyzer and Program Slicer for the R Programming Language
58 lines • 2.71 kB
JavaScript
;
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