/* * 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); }
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)); } }
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); } }