public int Eval(RuntimeEnvironment runtimeEnvironment, FunctionEnvironment functionEnvironment, int argument) { runtimeEnvironment.AllocateLocal(_argument.Item1); runtimeEnvironment.GetVariable(_argument.Item1).Value = argument; var v = _body.Eval(runtimeEnvironment, functionEnvironment); runtimeEnvironment.Pop(); return v; }
public override int Eval(RuntimeEnvironment env, FunctionEnvironment fEnv) { int value = e1.Eval(env, fEnv); env.AllocateLocal(name); // It pushes a new Pair<String, Storage>(name, new Storage()) to the stack called locals. The Storage value is 0 or null the String name is the type the storage.value is the value. Storage storage = env.GetVariable(name); // this method returns a Storage object. The storage variable that we create here, is pointing to the same object as the other Storage variable in the Stack<Pair<String, Storage> locals. storage.Value = value; // The Storage has only a value field. If we modify the value of this Storage variable, the value of the object will be modofied. int result = e2.Eval(env, fEnv); env.Pop(); return(result); }
public int Eval(RuntimeEnvironment env, FunctionEnvironment fenv, int[] values) { if (args.Count > 0) { int index = 0; foreach (Tuple <string, Type> tuple in args) { env.AllocateLocal(tuple.Item1); env.GetVariable(tuple.Item1).Value = values[index++]; } int v = body.Eval(env, fenv); foreach (Tuple <string, Type> tuple in args) { env.Pop(); } return(v); } else { int v = body.Eval(env, fenv); return(v); } }