Ejemplo n.º 1
0
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");
  }
}