示例#1
0
        public override void Execute(EpsInterpreter interpreter)
        {
            var operandStack = interpreter.OperandStack;

            bool isStopped;
            var  proc = operandStack.Pop();

            interpreter.EnterStoppedContext();

            try
            {
                interpreter.Execute(proc);
                isStopped = interpreter.GetStopProcedureStatus();
            }
            catch
            {
                isStopped = true;
            }

            var boolean = new BooleanOperand(isStopped);

            operandStack.Push(boolean);

            interpreter.LeaveStoppedContext();
        }
        public override void Execute(EpsInterpreter interpreter)
        {
            var operandStack = interpreter.OperandStack;

            var category = operandStack.PopStringValue();
            var scratch  = operandStack.PopString();
            var proc     = operandStack.Pop();
            var template = operandStack.PopStringValue();

            var list = interpreter.ResourceManager.GetFilteredResources(category, template);

            foreach (var key in list)
            {
                var keyName = OperandHelper.TryGetStringValue(key);

                if (keyName != null)
                {
                    scratch.Value = keyName;
                    operandStack.Push(scratch);
                }
                else
                {
                    operandStack.Push(key);
                }

                interpreter.Execute(proc);

                if (interpreter.BreakCurrentLoop)
                {
                    break;
                }
            }
        }
示例#3
0
        public override void Execute(EpsInterpreter interpreter)
        {
            var operandStack = interpreter.OperandStack;

            var proc2   = operandStack.Pop();
            var proc1   = operandStack.Pop();
            var boolean = operandStack.PopBoolean();

            if (boolean.Value)
            {
                interpreter.Execute(proc1);
            }
            else
            {
                interpreter.Execute(proc2);
            }
        }
示例#4
0
        public override void Execute(EpsInterpreter interpreter)
        {
            var op = interpreter.ErrorDict.TryFind("handleerror");

            if (op != null)
            {
                interpreter.Execute(op);
            }
        }
示例#5
0
        /// <summary>
        /// Execute the operand
        /// </summary>
        public override void Execute(EpsInterpreter interpreter)
        {
            if (interpreter.BreakCurrentLoop)
            {
                return;
            }

            if (BoundOperand != null)
            {
                interpreter.Execute(BoundOperand);
            }
            else
            {
                var name = new NameOperand {
                    Value = this.Name
                };
                var op = DictionaryStackHelper.FindValue(interpreter.DictionaryStack, name);

                if (op != null)
                {
                    interpreter.Execute(op);
                }
                else
                {
                    // Throwing an exception when the interpreter is within a stopped context
                    // would also be ok and is the prefered behavior. We test for the stopped
                    // context here to make debugging a bit easier. So that the debugger
                    // doesn't stop when the "exception" is handled in the postscript script,
                    // e.g. when tests are made if a command is available.

                    if (!interpreter.IsInStoppedContext)
                    {
                        throw new Exception($"unknown command \"{Name}\"");
                    }

                    interpreter.StopProcedure();
                }
            }
        }
示例#6
0
        public override void Execute(EpsInterpreter interpreter)
        {
            var proc = interpreter.OperandStack.Pop();

            interpreter.ResetExitCurrentLoop();

            while (true)
            {
                interpreter.Execute(proc);

                if (interpreter.BreakCurrentLoop)
                {
                    break;
                }
            }

            interpreter.ResetExitCurrentLoop();
        }
示例#7
0
        public override void Execute(EpsInterpreter interpreter)
        {
            var operandStack = interpreter.OperandStack;

            var proc    = operandStack.Pop();
            var countOp = operandStack.PopInteger();

            interpreter.ResetExitCurrentLoop();

            for (int i = 0; i < countOp.Value; i++)
            {
                interpreter.Execute(proc);

                if (interpreter.BreakCurrentLoop)
                {
                    break;
                }
            }

            interpreter.ResetExitCurrentLoop();
        }
示例#8
0
        public override void Execute(EpsInterpreter interpreter)
        {
            var operand = interpreter.OperandStack.Pop();

            interpreter.Execute(operand);
        }
示例#9
0
        public override void Execute(EpsInterpreter interpreter)
        {
            var operandStack = interpreter.OperandStack;

            var proc    = operandStack.Pop();
            var operand = operandStack.Pop();

            interpreter.ResetExitCurrentLoop();

            switch (operand)
            {
            case DictionaryOperand dictionaryOperand:
            {
                foreach (var kv in dictionaryOperand.Dictionary)
                {
                    operandStack.Push(kv.Key);
                    operandStack.Push(kv.Value);
                    interpreter.Execute(proc);

                    if (interpreter.BreakCurrentLoop)
                    {
                        break;
                    }
                }

                break;
            }

            case ArrayOperand arrayOperand:
            {
                foreach (var ao in arrayOperand.Values)
                {
                    operandStack.Push(ao.Operand);
                    interpreter.Execute(proc);

                    if (interpreter.BreakCurrentLoop)
                    {
                        break;
                    }
                }

                break;
            }

            case StringOperand stringOperand:
            {
                foreach (var ch in stringOperand.Value)
                {
                    operandStack.Push(new IntegerOperand((int)ch));
                    interpreter.Execute(proc);

                    if (interpreter.BreakCurrentLoop)
                    {
                        break;
                    }
                }

                break;
            }
            }

            interpreter.ResetExitCurrentLoop();
        }