Пример #1
0
        /*
         * O_NEXT
         * sp:   unchanged
         * in:   S[top-1] = arrayref
         * out:  R = arrayref[arrayref->cindex];
         * op:   if (arrayref->cindex >= arrayref->size) {
         *        R = END-OF-READ;
         *      }
         *      else {
         *        R = arrayref[arrayref->cindex]; arrayref->cindex++;
         *      }
         */

        public override void Eval(EvaluatorState ev)
        {
            //Console.WriteLine(this.ToString());

            // get the array reference
            IValue tableValue = ev.Stack.ReadN(ev.Stack.StackTop - 1);

            // work with arrays only
            if (tableValue.TypeOf() == ValueTypeID.TYPE_TABLEREF)
            {
                ValueTable table = (ValueTable)tableValue.GetObjectValue();

                ValueTableItem vti = table.Next();
                if (vti == null)
                {
                    ev.RegR = new DoneValue();
                }
                else
                {
                    ev.RegR = new TableDataRefValue(vti); // should be TYPE_STOREREF?
                }
            }
            else
            {
                //Console.WriteLine(">> nextop tableval.type = {0}", tableValue.TypeOf().ToString());
                throw new SharpNektonException(new SharpNektonError(SharpNektonErrorID.E_EXPTYPETABLEREF));
            }
        }
Пример #2
0
        /*
         * O_NEXT_KEY
         * sp:   unchanged
         * in:   S[top-2] = arrayref
         * out:  R = arrayref->cindex
         * op:   if (arrayref->cindex >= arrayref->size) {
         *        R = END-OF-READ;
         *      }
         *      else {
         *        R = arrayref->cindex; arrayref->cindex++;
         *      }
         */

        public override void Eval(EvaluatorState ev)
        {
            //Console.WriteLine(this.ToString());

            // get the array reference
            IValue tableValue = ev.Stack.ReadN(ev.Stack.StackTop - 2);

            // work with arrays only
            if (tableValue.TypeOf() == ValueTypeID.TYPE_TABLEREF)
            {
                ValueTable table = (ValueTable)tableValue.GetObjectValue();

                ValueTableItem vti = table.Next();
                if (vti == null)
                {
                    ev.RegR = new DoneValue();
                }
                else
                {
                    ev.RegR = new StringValue(vti.Key);
                }
            }
            else
            {
                throw new SharpNektonException(new SharpNektonError(SharpNektonErrorID.E_EXPTYPETABLEREF));
            }
        }