Variant f_func_get_arg(int arg_num) { if (hhvm) { CallerFrame cf; ActRec* ar = cf(); if (ar == NULL || arg_num < 0 || arg_num >= ar->numArgs()) { return false; } int numParams = ar->m_func->numParams(); if (arg_num < numParams) { // Formal parameter. Value is on the stack. TypedValue* loc = (TypedValue*)(uintptr_t(ar) - (arg_num + 1) * sizeof(TypedValue)); return tvAsVariant(loc); } // Not a formal parameter. Value is in the ExtraArgs. int extraArgNum = arg_num - numParams; HPHP::VM::ExtraArgs* eArgs = ar->getExtraArgs(); int extraArgs = (eArgs ? eArgs->numExtraArgs() : 0); if (extraArgNum < extraArgs) { return tvAsVariant(eArgs->getExtraArg(extraArgNum)); } return false; } else { throw FatalErrorException("bad HPHP code generation"); } }