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 StrongForEachStatement::eval(VariableEnvironment &env) const {
  ENTER_STMT;
  Variant source(ref(m_source->lval(env)));
  source.escalate(true);
  Variant vTemp;

  if (m_key) {
    Variant kTemp;
    for (MutableArrayIterPtr iter = source.begin(&kTemp, vTemp);
         iter->advance();) {
      Variant &v = m_value->lval(env);
      v = ref(vTemp);
      Variant &k = m_key->lval(env);
      k = ref(kTemp);
      if (!m_body) continue;
      EVAL_STMT_HANDLE_BREAK(m_body, env);
    }
  } else {
    for (MutableArrayIterPtr iter = source.begin(NULL, vTemp);
         iter->advance();) {
      Variant &v = m_value->lval(env);
      v = ref(vTemp);
      if (!m_body) continue;
      EVAL_STMT_HANDLE_BREAK(m_body, env);
    }
  }
}
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);
    }
  }
}
void DoWhileStatement::eval(VariableEnvironment &env) const {
  ENTER_STMT;
  do {
    if (!m_body) continue;
    EVAL_STMT_HANDLE_BREAK(m_body, env);
 } while (m_cond->eval(env));
}
Example #5
0
void ForStatement::eval(VariableEnvironment &env) const {
  ENTER_STMT;
  for (Expression::evalVector(m_init, env);
       m_cond.empty() ? true : (bool)Expression::evalVector(m_cond, env);
       Expression::evalVector(m_next, env)) {
    EVAL_STMT_HANDLE_BREAK(m_body, env);
  }
}
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 ForStatement::eval(VariableEnvironment &env) const {
  ENTER_STMT;
  DECLARE_THREAD_INFO;
  LOOP_COUNTER(1);
  for (Expression::evalVector(m_init, env);
       m_cond.empty() ? true : (bool)Expression::evalVector(m_cond, env);
       Expression::evalVector(m_next, env)) {
    LOOP_COUNTER_CHECK(1);
    if (m_body) {
      EVAL_STMT_HANDLE_BREAK(m_body, env);
    }
  }
}