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