Variant UnaryOpExpression::eval(VariableEnvironment &env) const { if (m_op == '@') { Silencer s; s.enable(); return m_exp->eval(env); } else if (m_op == T_ISSET || m_op == T_EMPTY) { return m_exp->exist(env, m_op); } Variant exp(m_exp ? m_exp->eval(env) : null_variant); SET_LINE; switch (m_op) { case T_CLONE: return f_clone(exp); case '+': return +exp; case '-': return negate(exp); case '!': return !exp; case '~': return ~exp; case T_INT_CAST: return toInt64(exp); case T_DOUBLE_CAST: return toDouble(exp); case T_STRING_CAST: return toString(exp); case T_ARRAY_CAST: return toArray(exp); case T_OBJECT_CAST: return toObject(exp); case T_BOOL_CAST: return toBoolean(exp); case T_UNSET_CAST: return unset(exp); case T_EXIT: return f_exit(exp); case T_PRINT: return print(exp.toString()); case T_EVAL: return HPHP::eval(&env, env.currentObject(), exp); default: ASSERT(false); return Variant(); } }
void f_clwalk(Chan *cp, Oldfcall *in, Oldfcall *ou) { int er, fid; if(CHAT(cp)) print("c_clwalk macro\n"); f_clone(cp, in, ou); /* sets tag, fid */ if(ou->err) return; fid = in->fid; in->fid = in->newfid; f_walk(cp, in, ou); /* sets tag, fid, qid */ er = ou->err; if(er == Eentry) { /* * if error is "no entry" * return non error and fid */ ou->err = 0; f_clunk(cp, in, ou); /* sets tag, fid */ ou->err = 0; ou->fid = fid; if(CHAT(cp)) print(" error: %s\n", errstring[er]); return; } if(er) { /* * if any other error * return an error */ ou->err = 0; f_clunk(cp, in, ou); /* sets tag, fid */ ou->err = er; return; } /* * non error * return newfid */ }