Пример #1
0
        public override void Execute(ExecutionEnvironment environment)
        {
            DemandArgs(2);

            int offSet = environment.OpCodes.JumpTable.GetIndex(Arguments[0].Value.StringValue);
            int argCount = Arguments[1].Value.IntegerValue;

            LexicalScope ls = new LexicalScope(environment.GlobalScope);
            ExecutionStack s = new ExecutionStack(ls);

            if(argCount > 0)
            {
                ExecutionStackItem [] tmpItems = new ExecutionStackItem[argCount];
                for(int i = 0; i < argCount; i++)
                {
                    tmpItems[i] = environment.LocalStack.PopItem();
                }

                for(int i = argCount - 1; i >= 0; i--)
                {
                    s.PushItem(tmpItems[i]);
                }
            }

            environment.PushStack(s);
            environment.OpCodes.PushCurrentIPAndSet(offSet);
        }
Пример #2
0
        public override void Execute(ExecutionEnvironment environment)
        {
            DemandArgs(2);

            string name = Arguments[0].Value.StringValue;
            int index = -1;
            if(Arguments[1].Value.Type == HVMType.Variable)
            {
                Variable v = environment.LocalScope.ResolveAny(Arguments[1].Value.StringValue);
                if(v == null)
                {
                    throw new OpCodeArgumentException(1, HVMType.Variable, this);
                }

                VariableItem vi = v as VariableItem;
                if(vi == null)
                {
                    throw new OpCodeArgumentException(1, HVMType.Variable, this);
                }

                index = vi.Value.IntegerValue;
            }
            else
            {
                index = Arguments[1].Value.IntegerValue;
            }

            if(index < 0)
            {
                throw new OpCodeException("index parameter must be positive", this);
            }

            Variable vName = environment.LocalScope.ResolveAny(name);

            if(vName == null)
            {
                throw new OpCodeException(string.Format("Variable not found: {0}", name), this);
            }

            if(vName.Type != HVMType.Array)
            {
                throw new OpCodeException( string.Format("Attempt to index into non-array element: {0}", name), this);
            }

            VariableArray va = vName as VariableArray;

            if(va == null)
            {
                throw new OpCodeException( string.Format("Variable was not convertable to VariableArray: {0}", name), this);
            }

            ExecutionStackItem esi = new ExecutionStackItem(va.GetAtIndex(index));
            environment.LocalStack.PushItem(esi);
        }
Пример #3
0
        public override void Execute(ExecutionEnvironment environment)
        {
            environment.LocalStack.DemandSize(1, this);

            ExecutionStackItem esi = environment.LocalStack.Peek() as ExecutionStackItem;
            if(esi.Value.Value.Type == HVMType.Variable)
            {
                VariableItem v = environment.LocalScope.ResolveStackItem(esi);
                if(v == null)
                {
                    throw new RuntimeException("Unable to resolve stack item as variable");
                }

                VariableItem v2 = v.Clone() as VariableItem;

                environment.LocalStack.PushItem(new ExecutionStackItem(v2));
            }
            else
            {
                ExecutionStackItem esi2 = new ExecutionStackItem(esi.Value.Clone() as VariableItem);
                environment.LocalStack.PushItem(esi2);
            }
        }
Пример #4
0
        public void PushItem(ExecutionStackItem item)
        {
            if(item == null)
            {
                throw new StackException("Can not push null item onto ExecutionStack");
            }

            Push(item);
        }
Пример #5
0
        public VariableItem ResolveStackItem(ExecutionStackItem item)
        {
            VariableItem v = null;
            if(item.Value.Value.Type == HVMType.Variable)
            {
                v = ResolveAny(item.Value.Name) as VariableItem;
            }
            else
            {
                v = item.Value.Clone() as VariableItem;
            }

            if(v == null)
            {
                throw new ParseException( "Defined variable", string.Format("Undefined variable: {0}", item.Value.Name) );
            }

            return v;
        }