Example #1
0
        void ProcessCallForeach()
        {
            CodeForeach  code = (CodeForeach)m_scriptInstruction.Operand0;
            ScriptObject loop = ResolveOperand(code.LoopObject);

            if (!(loop is ScriptFunction))
            {
                throw new ExecutionException(m_script, "foreach函数必须返回一个ScriptFunction");
            }
            object         obj;
            ScriptFunction func = (ScriptFunction)loop;
            ScriptContext  context;

            for ( ; ;)
            {
                obj = func.Call();
                if (obj == null)
                {
                    return;
                }
                context = new ScriptContext(m_script, code.BlockExecutable, this, Executable_Block.Foreach);
                context.Initialize(code.Identifier, m_script.CreateObject(obj));
                context.Execute();
                if (context.IsOver)
                {
                    break;
                }
            }
        }
Example #2
0
        void ProcessCallForeach()
        {
            CodeForeach  code = (CodeForeach)m_scriptInstruction.Operand0;
            ScriptObject loop = ResolveOperand(code.LoopObject);

            if (!loop.IsFunction)
            {
                throw new ExecutionException("foreach函数必须返回一个ScriptFunction");
            }
            ScriptObject obj;

            for ( ; ;)
            {
                obj = m_script.CreateObject(((ScriptFunction)loop).Call());
                if (obj == null || obj is ScriptNull)
                {
                    return;
                }
                code.Context.Initialize(this, code.Identifier, obj);
                code.Context.Execute();
                if (code.Context.IsBreak)
                {
                    break;
                }
            }
        }
Example #3
0
        private void ProcessCallForeach()
        {
            object       obj3;
            CodeForeach  @foreach = (CodeForeach)this.m_scriptInstruction.operand0;
            ScriptObject obj2     = this.ResolveOperand(@foreach.LoopObject);

            if (!(obj2 is ScriptFunction))
            {
                throw new ExecutionException(this.m_script, "foreach函数必须返回一个ScriptFunction");
            }
            ScriptFunction function = (ScriptFunction)obj2;

Label_003E:
            obj3 = function.Call();
            if (obj3 != null)
            {
                ScriptContext context = new ScriptContext(this.m_script, @foreach.BlockExecutable, this, Executable_Block.Foreach);
                context.Initialize(@foreach.Identifier, this.m_script.CreateObject(obj3));
                context.Execute();
                if (!context.IsOver)
                {
                    goto Label_003E;
                }
            }
        }
Example #4
0
        //解析foreach语句
        private void ParseForeach()
        {
            CodeForeach ret = new CodeForeach();

            ReadLeftParenthesis();
            ret.Identifier = ReadIdentifier();
            ReadIn();
            ret.LoopObject = GetObject();
            ReadRightParenthesis();
            ret.Context = new ScriptContext(m_script, ParseStatementBlock(Executable_Block.Foreach), null, Executable_Block.Foreach);
            m_scriptExecutable.AddScriptInstruction(new ScriptInstruction(Opcode.CALL_FOREACH, ret));
        }
Example #5
0
        private void ParseForeach()
        {
            CodeForeach @foreach = new CodeForeach();

            this.ReadLeftParenthesis();
            if (this.PeekToken().Type == Scorpio.Compiler.TokenType.Var)
            {
                this.ReadToken();
            }
            @foreach.Identifier = this.ReadIdentifier();
            this.ReadIn();
            @foreach.LoopObject = this.GetObject();
            this.ReadRightParenthesis();
            @foreach.BlockExecutable = this.ParseStatementBlock(Executable_Block.Foreach);
            this.m_scriptExecutable.AddScriptInstruction(new ScriptInstruction(Opcode.CALL_FOREACH, @foreach));
        }
        //解析foreach语句
        private void ParseForeach()
        {
            CodeForeach ret = new CodeForeach();

            ReadLeftParenthesis();
            if (PeekToken().Type == TokenType.Var)
            {
                ReadToken();
            }
            ret.Identifier = ReadIdentifier();
            ReadIn();
            ret.LoopObject = GetObject();
            ReadRightParenthesis();
            ret.BlockExecutable = ParseStatementBlock(Executable_Block.Foreach);
            m_scriptExecutable.AddScriptInstruction(new ScriptInstruction(Opcode.CALL_FOREACH, ret));
        }