예제 #1
0
        /*
         * O_FSTORE
         * sin:  S[top] = varref; S[top-1] = arrayref
         * sout: S[top] = arrayref
         * in:   R = index; S[top] = varref; S[top-1] = arrayref
         * out:  R = arrayref[index]; S[top] = arrayref;
         * op:   R = arrayref[index]; store;
         */

        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();

                // if this creates a new array item, foreach fall into a endless loop!
                ValueTableItem vti = table.Search(ev.RegR.GetStringValue());
                if (vti != null)
                {
                    ev.RegR = new TableDataRefValue(vti);
                }
                else
                {
                    throw new SharpNektonException(new SharpNektonError(SharpNektonErrorID.E_BADKEYINFOREACH));
                }
            }
            else
            {
                throw new SharpNektonException(new SharpNektonError(SharpNektonErrorID.E_EXPTYPETABLEREF));
            }

            // store the R to the var
            // TODO: remove the new opcode creation here
            AOpCode storeOpCode = new StoreOpCode(this.line, this.linePosition, TokenID.T_ASSIGN_OP);

            storeOpCode.Eval(ev);
        }
예제 #2
0
        public override void Eval(EvaluatorState ev)
        {
            //Console.WriteLine(this.ToString());

            // index is in R
            IValue keyValue = ev.GetVal();

            // get table (it is on the stack[top])
            IValue tableValue = ev.GetStackTopVal();

            ev.Stack.Pop();

            // for array returns ptr to array[index] as TYPE_TABLEDATAREF
            // else raises an error
            if (tableValue.TypeOf() == ValueTypeID.TYPE_TABLEREF)
            {
                string         key   = keyValue.GetStringValue();
                ValueTable     table = (ValueTable)tableValue.GetObjectValue();
                ValueTableItem vti   = table.Search(key);
                if (vti == null)
                {
                    vti = table.Insert(key, new UndefinedValue());
                }

                ev.RegR = new TableDataRefValue(vti);
            }
            else
            {
                throw new SharpNektonException(new SharpNektonError(SharpNektonErrorID.E_EXPTYPETABLEREF));
            }
        }
예제 #3
0
        public override void Eval(EvaluatorState ev)
        {
            //Console.WriteLine(this.ToString());

            // second operand (table) is in R
            IValue tableValue = ev.GetVal();

            if (tableValue.TypeOf() != ValueTypeID.TYPE_TABLEREF)
            {
                throw new SharpNektonException(new SharpNektonError(SharpNektonErrorID.E_EXPTYPETABLEREF));
            }

            // first operand (key)
            IValue key = ev.GetStackTopVal();

            ev.Stack.Pop(); // pop the key

            ValueTable table = (ValueTable)tableValue.GetObjectValue();

            if (table.Search(key.GetStringValue()) != null)
            {
                ev.RegR = new BooleanValue(true);
            }
            else
            {
                ev.RegR = new BooleanValue(false);
            }
        }