private VisitResult VisitFunctionCall(ASTFunctionCall functionCall) { var symbolFunction = functionCall.SymbolFunction; var functionName = functionCall.FunctionName; var formalParameters = symbolFunction.Parameters; var actualParameters = functionCall.ActualParameters; var activationRecord = new ActivationRecord(functionName, ActivationRecordType.Function, symbolFunction.ScopeLevel + 1); for (var i = 0; i < formalParameters.Count; ++i) { activationRecord[formalParameters[i].Name] = Visit(actualParameters[i]).Value; } Logger.Debug($"Enter {functionName}"); _callStack.Push(activationRecord); var result = symbolFunction is SymbolBuiltinFunction?BuiltinFunctionCall(functionCall) : Visit(symbolFunction.Body); var returnedValue = result != null ? result.Value : "null"; if (returnedValue is List <dynamic> collection) { returnedValue = collection.ToPrint(); } Logger.DebugMemory($"Leave {functionName}, returned value ({returnedValue})"); Logger.DebugMemory(_callStack.ToString()); _callStack.Pop(); return(result); }
/// <summary> /// create an activation record for node /// </summary> /// <typeparam name="T">node type</typeparam> /// <param name="node">a node in the graph</param> /// <param name="getFanouts">function to return fanouts of a node</param> /// <returns>an activation record</returns> private static ActivationRecord <T> AllocateActivationRecord <T>(T node, Func <T, IEnumerable <T> > getFanouts) { // very first time - init var children = getFanouts(node).ToList(); var info = new ActivationRecord <T>(node, children); return(info); }
public IContext Activate() { var r = new ActivationRecord { Context = this, OldValue = property.Getter() }; stack.Push(r); property.Setter(value); return(this); }
private dynamic VisitProgram(ASTProgram program) { Logger.Debug("Enter Program"); var activationRecord = new ActivationRecord("Main", ActivationRecordType.Program, 1); _callStack.Push(activationRecord); var runParameters = new List <ASTNode>(); var mainFunction = new ASTFunctionCall(program.Token, "Main", runParameters); mainFunction.SymbolFunction = program.MainFunction; var result = Visit(mainFunction); Logger.DebugMemory("Leave Program"); Logger.DebugMemory(_callStack.ToString()); _callStack.Pop(); Logger.Debug($"Program exited with status code {result?.Value ?? "null"}"); return(result); }