@eagleoutice/flowr
Version:
Static Dataflow Analyzer and Program Slicer for the R Programming Language
93 lines • 4.01 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.resolveNode = resolveNode;
exports.resolveAsVector = resolveAsVector;
const r_function_call_1 = require("../../../r-bridge/lang-4.x/ast/model/nodes/r-function-call");
const type_1 = require("../../../r-bridge/lang-4.x/ast/model/type");
const assert_1 = require("../../../util/assert");
const built_in_1 = require("../../environments/built-in");
const dfg_get_origin_1 = require("../../origin/dfg-get-origin");
const interval_constants_1 = require("../values/intervals/interval-constants");
const logical_constants_1 = require("../values/logical/logical-constants");
const r_value_1 = require("../values/r-value");
const string_constants_1 = require("../values/string/string-constants");
const vector_constants_1 = require("../values/vectors/vector-constants");
const alias_tracking_1 = require("./alias-tracking");
/**
* Helper function used by {@link resolveIdToValue}, please use that instead, if
* you want to resolve the value of a identifier / node
*
* This function converts an RNode to its Value, but also recursivly resolves
* aliases and vectors (in case of a vector).
*
* @param a - Ast node to resolve
* @param env - Environment to use
* @param graph - Dataflow Graph to use
* @param map - Idmap of Dataflow Graph
* @returns resolved value or top/bottom
*/
function resolveNode(a, env, graph, map) {
if (a.type === type_1.RType.String) {
return (0, string_constants_1.stringFrom)(a.content.str);
}
else if (a.type === type_1.RType.Number) {
return (0, interval_constants_1.intervalFrom)(a.content.num, a.content.num);
}
else if (a.type === type_1.RType.Logical) {
return a.content.valueOf() ? logical_constants_1.ValueLogicalTrue : logical_constants_1.ValueLogicalFalse;
}
else if (a.type === type_1.RType.FunctionCall && env && graph) {
const origin = (0, dfg_get_origin_1.getOriginInDfg)(graph, a.info.id)?.[0];
if (origin === undefined || origin.type !== 3 /* OriginType.BuiltInFunctionOrigin */) {
return r_value_1.Top;
}
if (origin.proc in built_in_1.BuiltInEvalHandlerMapper) {
const handler = built_in_1.BuiltInEvalHandlerMapper[origin.proc];
return handler(a, env, graph, map);
}
}
return r_value_1.Top;
}
/**
* Helper function used by {@link resolveIdToValue}, please use that instead, if
* you want to resolve the value of a identifier / node
*
* This function converts an rnode to a Value Vector {@link vectorFrom}
* It also recursivly resolves any symbols, values, function calls (only c), in
* order to construct the value of the vector to resolve by calling {@link resolveIdToValue}
* or {@link resolveNode}
*
* @param a - Node of the vector to resolve
* @param env - Environment to use
* @param graph - Dataflow graph
* @param map - Idmap of Dataflow Graph
* @returns ValueVector or Top
*/
function resolveAsVector(a, env, graph, map) {
(0, assert_1.guard)(a.type === type_1.RType.FunctionCall);
const values = [];
for (const arg of a.arguments) {
if (arg === r_function_call_1.EmptyArgument) {
continue;
}
if (arg.value === undefined) {
return r_value_1.Top;
}
if (arg.value.type === type_1.RType.Symbol) {
const value = (0, alias_tracking_1.resolveIdToValue)(arg.info.id, { environment: env, idMap: map, graph: graph, full: true });
if ((0, r_value_1.isTop)(value)) {
return r_value_1.Top;
}
values.push(value);
}
else {
const val = resolveNode(arg.value, env, graph, map);
if ((0, r_value_1.isTop)(val)) {
return r_value_1.Top;
}
values.push(val);
}
}
return (0, vector_constants_1.vectorFrom)((0, vector_constants_1.flattenVectorElements)(values));
}
//# sourceMappingURL=resolve.js.map