void DoWhileStatement::eval(VariableEnvironment &env) const { if (env.isGotoing() && env.isLimitedGoto()) return; ENTER_STMT; DECLARE_THREAD_INFO; LOOP_COUNTER(1); do { LOOP_COUNTER_CHECK_INFO(1); EVAL_STMT_HANDLE_GOTO_BEGIN(restart); if (m_body) EVAL_STMT_HANDLE_BREAK(m_body, env); EVAL_STMT_HANDLE_GOTO_END(restart); } while (m_cond->eval(env)); }
void SwitchStatement::eval(VariableEnvironment &env) const { bool gotoing = false; if (env.isGotoing()) { if (env.isLimitedGoto()) return; gotoing = true; } ENTER_STMT; Variant source, *srcPtr; if (!gotoing) { if (!m_simpleVar) { source = m_source->eval(env); srcPtr = &source; } else { m_source->cast<VariableExpression>()->weakLval(env, srcPtr); } } bool matched = false; vector<CaseStatementPtr>::const_iterator defaultPos = m_cases.end(); EVAL_STMT_HANDLE_GOTO_BEGIN(restart); for (vector<CaseStatementPtr>::const_iterator iter = m_cases.begin(); iter != m_cases.end(); ++iter) { if (!gotoing) { if ((*iter)->isDefault()) { defaultPos = iter; } else if (!matched && (*iter)->match(env, *srcPtr)) { matched = true; } } if (gotoing || matched) { EVAL_STMT_HANDLE_BREAK_CONT(*iter, env); } } if (!gotoing && !matched && defaultPos != m_cases.end()) { for (; defaultPos != m_cases.end(); ++defaultPos) { EVAL_STMT_HANDLE_BREAK_CONT(*defaultPos, env); } } EVAL_STMT_HANDLE_GOTO_END(restart); }
void WhileStatement::eval(VariableEnvironment &env) const { DECLARE_THREAD_INFO; if (env.isGotoing()) { if (env.isLimitedGoto()) return; goto body; } ENTER_STMT; LOOP_COUNTER(1); begin: if (m_cond->eval(env)) { body: LOOP_COUNTER_CHECK_INFO(1); EVAL_STMT_HANDLE_GOTO_BEGIN(restart); if (m_body) EVAL_STMT_HANDLE_GOTO(m_body, env); EVAL_STMT_HANDLE_GOTO_END(restart); goto begin; } end:; }
void CaseStatement::eval(VariableEnvironment &env) const { if (env.isGotoing() && env.isLimitedGoto()) return; if (m_body) m_body->eval(env); }