void StrongForEachStatement::eval(VariableEnvironment &env) const { if (env.isGotoing()) return; ENTER_STMT; LvalExpression* lvalSource = m_source->cast<LvalExpression>(); Variant source(lvalSource ? ref(lvalSource->lval(env)) : ref(m_source->eval(env))); source.escalate(true); Variant vTemp; if (m_key) { Variant kTemp; for (MutableArrayIter iter = source.begin(&kTemp, vTemp, env.currentContext()); iter.advance();) { m_key->set(env, kTemp); m_value->set(env, ref(vTemp)); if (!m_body) continue; EVAL_STMT_HANDLE_GOTO_BEGIN(restart1); EVAL_STMT_HANDLE_BREAK(m_body, env); EVAL_STMT_HANDLE_GOTO_END(restart1); } } else { for (MutableArrayIter iter = source.begin(NULL, vTemp, env.currentContext()); iter.advance();) { m_value->set(env, ref(vTemp)); if (!m_body) continue; EVAL_STMT_HANDLE_GOTO_BEGIN(restart2); EVAL_STMT_HANDLE_BREAK(m_body, env); EVAL_STMT_HANDLE_GOTO_END(restart2); } } }
void ForEachStatement::eval(VariableEnvironment &env) const { if (env.isGotoing()) return; ENTER_STMT; DECLARE_THREAD_INFO; LOOP_COUNTER(1); Variant map(m_source->eval(env)); if (m_key) { TempExpressionList *texp = m_key->cast<TempExpressionList>(); if (texp) { for (ArrayIter iter = map.begin(env.currentContext(), true); !iter.end(); iter.next()) { { LOOP_COUNTER_CHECK_INFO(1); const Variant &value = iter.second(); const Variant &key = iter.first(); TempExpressionHelper helper(texp, env); m_value->set(env, value); texp->setImpl(env, key); } if (!m_body) continue; EVAL_STMT_HANDLE_GOTO_BEGIN(restart1); EVAL_STMT_HANDLE_BREAK(m_body, env); EVAL_STMT_HANDLE_GOTO_END(restart1); } } else { for (ArrayIter iter = map.begin(env.currentContext(), true); !iter.end(); iter.next()) { LOOP_COUNTER_CHECK_INFO(1); const Variant &value = iter.second(); const Variant &key = iter.first(); m_value->set(env, value); m_key->set(env, key); if (!m_body) continue; EVAL_STMT_HANDLE_GOTO_BEGIN(restart2); EVAL_STMT_HANDLE_BREAK(m_body, env); EVAL_STMT_HANDLE_GOTO_END(restart2); } } } else { for (ArrayIter iter = map.begin(env.currentContext(), true); !iter.end(); iter.next()) { LOOP_COUNTER_CHECK_INFO(1); m_value->set(env, iter.second()); if (!m_body) continue; EVAL_STMT_HANDLE_GOTO_BEGIN(restart3); EVAL_STMT_HANDLE_BREAK(m_body, env); EVAL_STMT_HANDLE_GOTO_END(restart3); } } }