UNPKG

@eagleoutice/flowr

Version:

Static Dataflow Analyzer and Program Slicer for the R Programming Language

93 lines 4.01 kB
"use strict"; 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