Beispiel #1
0
        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;
            }
        }
Beispiel #2
0
 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]);
     }
 }
Beispiel #3
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);
        }
Beispiel #4
0
        // 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();
        }
Beispiel #5
0
 // 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);
 }
Beispiel #6
0
        // i:=M[s]; s:=s - 1
        public int Return()
        {
            int currentValue = DataStack[StackPointer];

            DataStack.RemoveAt(StackPointer);
            StackPointer--;
            return(currentValue);
        }
Beispiel #7
0
        // S = s + 1, M[s] = k
        public void LoadConstant(int kI)
        {
            int k = kI;

            DataStack.Add(0);
            StackPointer++;
            DataStack[StackPointer] = k;
        }
Beispiel #8
0
        // 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--;
        }
Beispiel #9
0
        // 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--;
        }
Beispiel #10
0
        // 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--;
        }
Beispiel #11
0
        // 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--;
        }
Beispiel #12
0
        public void Push(object obj)
        {
            if (obj == null)
            {
                throw new NullValueException();
            }

            DataStack.Push(obj);
        }
Beispiel #13
0
        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();
        }
Beispiel #15
0
        // 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--;
            }
        }
Beispiel #16
0
        // 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];
            }
        }
Beispiel #17
0
        public dynamic Pop()
        {
            if (DataStack.Count == 0)
            {
                throw new DataStackEmptyException();
            }

            var pop = DataStack.Pop();

            return(!(pop is IRefBase data) ? pop : data.BaseValue);
        }
Beispiel #18
0
        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)}");
            }
        }
Beispiel #19
0
        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."));
            }
        }
Beispiel #20
0
        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>());
        }
Beispiel #21
0
        // 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--;
        }
Beispiel #22
0
        // 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--;
        }
Beispiel #23
0
        // 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--;
        }
Beispiel #24
0
        // 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--;
        }
Beispiel #25
0
        /// <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();
        }
Beispiel #26
0
		// 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();
		}
Beispiel #27
0
 //  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;
 }
Beispiel #28
0
        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();
        }
Beispiel #29
0
        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."));
        }
Beispiel #30
0
 // S = s + 1, M[s] = M[n]
 public void LoadValue(int nI)
 {
     DataStack.Add(0);
     StackPointer++;
     DataStack[StackPointer] = DataStack[nI];
 }
Beispiel #31
0
 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]);
 }
Beispiel #32
0
 public DataStack(DataStack stack) : base(stack)
 {
 }
Beispiel #33
0
		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;
        }
Beispiel #35
0
 // S:=s + 1; M[s]:= “next input value”.
 public void Read(int value)
 {
     DataStack.Add(value);
     StackPointer++;
     DataStack[StackPointer] = value;
 }