public void Perform(object next) { ++NumOps; if (next == null) { throw new NullValueException(); } PerformPrelude(next); switch (next) { case EOperation op when _actions.TryGetValue(op, out var action): action(); break; case EOperation op: throw new NotImplementedException($"Operation {op} not implemented"); default: if (!TryResolve(next, out var eval)) { throw new UnknownIdentifierException(next); } DataStack.Push(eval); break; } }
protected void StackIsEmpty(DataStack stack, string message) { if (stack.Count != 0) { Assert.Fail(" {0}\n Actual stack count: {1} (Top cell: {2})", message, stack.Count, stack[0]); } }
internal static void Print(int index) { if (methods.Count == 0 || methods.Count <= index || index < 0) { return; } #if NET_2_0 Stack <Data> temp = new Stack <Data>(index - 1); #else DataStack temp = new DataStack(index - 1); #endif for (int i = 0; i < index; i++) { temp.Push(methods.Pop()); } Data data = methods.Peek(); for (int i = 0; i < temp.Count; i++) { methods.Push(temp.Pop()); } temp = null; Debug.WriteLine(data.method.DeclaringType.Name + "." + data.method.Name); }
// TODO: Remove this in favor of `Script.Create` public Script(params object[] script) { var bytes = new List <byte>(); foreach (object o in script.Reverse()) { if (o is byte[]) { bytes.AddRange(((byte[])o).Reverse()); } else if (o is int) { bytes.AddRange(new SignedInt((int)o).ToByteArray().Reverse().ToArray()); } else if (o is SignedInt) { bytes.AddRange(((SignedInt)o).ToByteArray().Reverse().ToArray()); } else { bytes.Add((byte)o); } } Execution = new Stack <byte>(bytes.ToArray()); Main = new DataStack(); Alt = new DataStack(); }
// S:=s + 1; M[s]:= i+ 1; i:=t public int Call(int n, int i) { StackPointer++; DataStack.Add(0); DataStack[StackPointer] = i + 1; return(n); }
// i:=M[s]; s:=s - 1 public int Return() { int currentValue = DataStack[StackPointer]; DataStack.RemoveAt(StackPointer); StackPointer--; return(currentValue); }
// S = s + 1, M[s] = k public void LoadConstant(int kI) { int k = kI; DataStack.Add(0); StackPointer++; DataStack[StackPointer] = k; }
// M[s - 1] = M[s - 1] / M[s], S = s - 1 public void DivideImediate() { DataStack[StackPointer - 1] = DataStack[StackPointer - 1] / DataStack[StackPointer]; DataStack.RemoveAt(StackPointer); StackPointer--; }
// M[s - 1] = M[s - 1] + M[s], S = s - 1 public void Add() { DataStack[StackPointer - 1] = DataStack[StackPointer - 1] + DataStack[StackPointer]; DataStack.RemoveAt(StackPointer); StackPointer--; }
// M[s - 1] = M[s - 1] - M[s], S = s - 1 public void Subtract() { DataStack[StackPointer - 1] = DataStack[StackPointer - 1] - DataStack[StackPointer]; DataStack.RemoveAt(StackPointer); StackPointer--; }
// M[s - 1] = M[s - 1] * M[s], S = s - 1 public void Multiply() { DataStack[StackPointer - 1] = DataStack[StackPointer - 1] * DataStack[StackPointer]; DataStack.RemoveAt(StackPointer); StackPointer--; }
public void Push(object obj) { if (obj == null) { throw new NullValueException(); } DataStack.Push(obj); }
internal static void Print(string methodName, string parameterName) { if (methods.Count == 0) { return; } #if NET_2_0 Stack <Data> temp = new Stack <Data>(); #else DataStack temp = new DataStack(); #endif Data data = methods.Peek(); bool foundit = false; for (int i = 0; i < methods.Count; i++) { data = methods.Peek(); if (data.method.Name.Equals(methodName)) { foundit = true; break; } temp.Push(methods.Pop()); } for (int i = 0; i < temp.Count; i++) { methods.Push(temp.Pop()); } temp = null; if (!foundit) { return; } Debug.WriteLine(data.method.DeclaringType.Name + "." + data.method.Name); ParameterInfo[] pi = data.method.GetParameters(); for (int i = 0; i < pi.Length; i++) { if (pi[i].Name == parameterName) { Debug.Indent(); Debug.Write(parameterName + "="); if (pi[i].ParameterType == typeof(IntPtr)) { Debug.WriteLine(String.Format("0x{0:x}", ((IntPtr)data.args[i]).ToInt32())); } else { Debug.WriteLine(data.args[i]); } Debug.Unindent(); } } }
public Environment() { Words = new WordDictionary(); Memory = new Memory(100000); DataStack = new DataStack(); ReturnStack = new DataStack("Return Stack"); ControlFlowStack = new ControlFlowStack(); }
// Para k:=n-1 até 0 faça {M[m+k]:=M[s]; s:=s - 1} public void Deallocate(int mI, int nI) { int k; for (k = (nI - 1); k >= 0; k--) { DataStack[mI + k] = DataStack[StackPointer]; DataStack.RemoveAt(StackPointer); StackPointer--; } }
// For k:=0 till n-1, do { s:=s + 1; M[s]:=M[m+k] } public void Allocate(int mI, int nI) { int k; for (k = 0; k <= (nI - 1); k++) { DataStack.Add(mI + k); StackPointer++; DataStack[StackPointer] = DataStack[mI + k]; } }
public dynamic Pop() { if (DataStack.Count == 0) { throw new DataStackEmptyException(); } var pop = DataStack.Pop(); return(!(pop is IRefBase data) ? pop : data.BaseValue); }
public void WriteDataStack(StringBuilder str, int max = 4) { str.AppendLine("Data:"); var data = DataStack.ToArray(); max = Math.Min(data.Length, max); for (var n = max - 1; n >= 0; --n) { var obj = data[n]; str.AppendLine($"\t[{n}]: {GetTyped(obj)}"); } }
protected void StackEquals(DataStack stack, string message, params int[] expected) { Assert.AreEqual(expected.Length, stack.Count, concatenate(message, "Wrong number of stack cells.")); expected = expected.Reverse().ToArray(); int[] actual = stack.ToArray(); for (int i = 0; i < expected.Length; i++) { Assert.AreEqual(expected[i], actual[i], concatenate(message, "Wrong stack cell value.")); } }
public void Test() { var a = new List <int> { 1, 2, 3 }; DataStack.Push(a); RhoRun( @" a = {1 2 3} a[1] "); Assert.AreEqual(2, Pop <int>()); }
// If M[s-1] != M[s], then M[s-1]:=1, else M[s-1]:=0; s:=s - 1 public void CompareDifference() { if (DataStack[StackPointer - 1] != DataStack[StackPointer]) { DataStack[StackPointer - 1] = 1; } else { DataStack[StackPointer - 1] = 0; } DataStack.RemoveAt(StackPointer); StackPointer--; }
// If M[s-1] >= M[s], then M[s-1]:=1 else M[s-1]:=0; s:=s - 1 public void CompareGreaterOrEqual() { if (DataStack[StackPointer - 1] >= DataStack[StackPointer]) { DataStack[StackPointer - 1] = 1; } else { DataStack[StackPointer - 1] = 0; } DataStack.RemoveAt(StackPointer); StackPointer--; }
// If M[s-1] = M[s], then M[s-1]:=1 else M[s-1]:=0; s:=s - 1 public void CompareEquals() { if (DataStack[StackPointer - 1] == DataStack[StackPointer]) { DataStack[StackPointer - 1] = 1; } else { DataStack[StackPointer - 1] = 0; } DataStack.RemoveAt(StackPointer); StackPointer--; }
// If M[s-1] = 1 or M[s] = 1, then M[s-1] =1, else M[s-1] =0; s =s - 1 public void Or() { if (DataStack[StackPointer - 1] == 1 || DataStack[StackPointer] == 1) { DataStack[StackPointer - 1] = 1; } else { DataStack[StackPointer - 1] = 0; } DataStack.RemoveAt(StackPointer); StackPointer--; }
/// <summary> /// Resume the continuation that spawned the current one /// </summary> private new void Resume() { if (!RPop(out var next)) { Break(); return; } switch (next) { case ICallable call: call.Invoke(_registry, DataStack); break; case IClassBase @class: Push(@class.NewInstance()); break; case MethodInfo mi: var numArgs = mi.GetParameters().Length; if (DataStack.Count < numArgs + 1) { var servant = DataStack.Count > 0 ? DataStack.Peek() : "null"; throw new NotEnoughArgumentsException($"{servant}.{mi.Name} expects {numArgs} args"); } var obj = Pop(); var args = new object[numArgs]; for (var n = 0; n < numArgs; ++n) { args[numArgs - n - 1] = Pop(); } var ret = mi.Invoke(obj, args); if (mi.ReturnType != typeof(void)) { Push(ret); } break; default: PushContext(next); _current = null; break; } Break(); }
// TODO: Remove this in favor of `Script.Create` public Script(params object[] script) { var bytes = new List<byte>(); foreach(object o in script.Reverse()) { if(o is byte[]) bytes.AddRange(((byte[])o).Reverse()); else if(o is int) bytes.AddRange(new SignedInt((int)o).ToByteArray().Reverse().ToArray()); else if(o is SignedInt) bytes.AddRange(((SignedInt)o).ToByteArray().Reverse().ToArray()); else bytes.Add((byte)o); } Execution = new Stack<byte>(bytes.ToArray()); Main = new DataStack(); Alt = new DataStack(); }
// Clean; up all the inputs public void cleanFields() { DataStack.Clear(); ReturnStack.Clear(); PADarea.Clear(); ParsedInput.Clear(); LoopCurrIndexes[0] = 0; LoopCurrIndexes[1] = 0; LoopCurrIndexes[2] = 0; looplabelptr = 0; outerptr = 0; innerptr = 0; paramfieldptr = 0; inputarea = ""; outputarea = ""; helpcommentfield = ""; pause = false; }
public void TestMap() { var makeMap = "1 2 \"foo\" \"bar\" 2 tomap"; PiRun(makeMap); TestMapContents(); AssertEmpty(); // expand map to the stack PiRun(makeMap + " expand"); //_Exec.WriteDataStack(10); AssertPop(2); Assert.AreEqual(4, DataStack.Count); DataStack.Clear(); // remake map from stack contents PiRun(makeMap + " expand tomap"); TestMapContents(); AssertEmpty(); }
protected void StackEquals(DataStack stack, string message, params int[] expected) { Assert.AreEqual(expected.Length, stack.Count, concatenate(message, "Wrong number of stack cells.")); expected = expected.Reverse().ToArray(); int[] actual = stack.ToArray(); for (int i = 0; i < expected.Length; i++) Assert.AreEqual(expected[i], actual[i], concatenate(message, "Wrong stack cell value.")); }
// S = s + 1, M[s] = M[n] public void LoadValue(int nI) { DataStack.Add(0); StackPointer++; DataStack[StackPointer] = DataStack[nI]; }
protected void StackIsEmpty(DataStack stack, string message) { if (stack.Count != 0) Assert.Fail(" {0}\n Actual stack count: {1} (Top cell: {2})", message, stack.Count, stack[0]); }
public DataStack(DataStack stack) : base(stack) { }
public Script(byte[] script) { Execution = new Stack<byte>(script); Main = new DataStack(); Alt = new DataStack(); }
/// <summary> /// Add options to the internal mapping of EOperation enum to /// functor that does the work for that operation. /// </summary> private void AddOperations() { _actions[EOperation.Plus] = () => { var b = RPop(); var a = RPop(); Push(a + b); }; _actions[EOperation.Minus] = () => { var a = RPop(); var b = RPop(); Push(b - a); }; _actions[EOperation.Multiply] = () => Push(RPop() * RPop()); _actions[EOperation.Divide] = Divide; _actions[EOperation.Suspend] = Suspend; _actions[EOperation.Resume] = Resume; _actions[EOperation.Replace] = Replace; _actions[EOperation.Break] = DebugBreak; _actions[EOperation.Store] = StoreValue; _actions[EOperation.Retrieve] = GetValue; _actions[EOperation.Assert] = Assert; _actions[EOperation.Equiv] = Equiv; _actions[EOperation.NotEquiv] = NotEquiv; _actions[EOperation.Not] = () => Push(!RPop <bool>()); _actions[EOperation.LogicalAnd] = LogicalAnd; _actions[EOperation.LogicalOr] = LogicalOr; _actions[EOperation.LogicalXor] = LogicalXor; _actions[EOperation.ToArray] = ToArray; _actions[EOperation.ToList] = ToArray; _actions[EOperation.ToMap] = ToMap; _actions[EOperation.ToSet] = ToSet; _actions[EOperation.Size] = GetSize; _actions[EOperation.PushFront] = PushFront; _actions[EOperation.PushBack] = PushBack; _actions[EOperation.Remove] = Remove; _actions[EOperation.Expand] = Expand; _actions[EOperation.Insert] = Insert; _actions[EOperation.New] = New; _actions[EOperation.GetType] = GetTypeOf; _actions[EOperation.At] = At; _actions[EOperation.Has] = Has; _actions[EOperation.DebugPrintDataStack] = DebugPrintDataStack; _actions[EOperation.DebugPrintContinuation] = DebugPrintContinuation; _actions[EOperation.DebugPrintContextStack] = DebugPrintContextStack; _actions[EOperation.DebugPrint] = DebugTrace; _actions[EOperation.Depth] = () => Push(DataStack.Count); _actions[EOperation.SetFloatPrecision] = SetFloatPrecision; _actions[EOperation.Write] = () => Write(RPop()); _actions[EOperation.WriteLine] = () => WriteLine(RPop()); _actions[EOperation.If] = If; _actions[EOperation.IfElse] = IfElse; _actions[EOperation.Assign] = Assign; _actions[EOperation.GetMember] = GetMember; _actions[EOperation.SetMember] = SetMember; _actions[EOperation.ForEachIn] = ForEachIn; _actions[EOperation.ForLoop] = ForLoop; _actions[EOperation.Freeze] = Freeze; _actions[EOperation.Thaw] = Thaw; _actions[EOperation.Drop] = () => Pop(); _actions[EOperation.DropN] = DropN; _actions[EOperation.Swap] = Swap; _actions[EOperation.Pick] = Pick; _actions[EOperation.Rot] = Rot; _actions[EOperation.Over] = Over; _actions[EOperation.Dup] = Dup; _actions[EOperation.Clear] = () => DataStack.Clear(); _actions[EOperation.Less] = Less; _actions[EOperation.LessOrEquiv] = LessEquiv; _actions[EOperation.Greater] = Greater; _actions[EOperation.GreaterOrEquiv] = GreaterEquiv; _actions[EOperation.Self] = () => Push(_current); _actions[EOperation.Exists] = Exists; }
// S:=s + 1; M[s]:= “next input value”. public void Read(int value) { DataStack.Add(value); StackPointer++; DataStack[StackPointer] = value; }