@eagleoutice/flowr
Version:
Static Dataflow Analyzer and Program Slicer for the R Programming Language
42 lines • 2.12 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.processSpecialBinOp = processSpecialBinOp;
const known_call_handling_1 = require("../known-call-handling");
const logger_1 = require("../../../../../logger");
const edge_1 = require("../../../../../graph/edge");
const identifier_1 = require("../../../../../environments/identifier");
const built_in_proc_name_1 = require("../../../../../environments/built-in-proc-name");
/**
* Process a special built-in binary operator, possibly lazily.
* For example, the logical AND `&&` and OR `||` operators only evaluate their right-hand side if necessary.
* Please note that this is not (directly) related to R's special binary operators like `%in%`.
*/
function processSpecialBinOp(name, args, rootId, data, config) {
if (!config.lazy) {
return (0, known_call_handling_1.processKnownFunctionCall)({ name, args, rootId, data, origin: built_in_proc_name_1.BuiltInProcName.SpecialBinOp }).information;
}
else if (args.length != 2) {
logger_1.dataflowLogger.warn(`Logical bin-op ${identifier_1.Identifier.toString(name.content)} has something else than 2 arguments, skipping`);
return (0, known_call_handling_1.processKnownFunctionCall)({ name, args, rootId, data, forceArgs: config.forceArgs, origin: 'default' }).information;
}
const { information, processedArguments } = (0, known_call_handling_1.processKnownFunctionCall)({ name, args, rootId, data, forceArgs: config.forceArgs,
patchData: (d, i) => {
if (i === 1) {
return { ...d, cds: [...d.cds ?? [], { id: name.info.id, when: config.evalRhsWhen }] };
}
return d;
},
origin: built_in_proc_name_1.BuiltInProcName.SpecialBinOp
});
for (const arg of processedArguments) {
if (arg) {
information.graph.addEdge(name.info.id, arg.entryPoint, edge_1.EdgeType.Reads);
}
// only do first if lazy
if (config.lazy) {
break;
}
}
return information;
}
//# sourceMappingURL=built-in-special-bin-op.js.map