int modperl_callback(pTHX_ modperl_handler_t *handler)
int modperl_callback(pTHX_ modperl_handler_t *handler, ap_pool_t *p)
int modperl_callback(pTHX_ modperl_handler_t *handler){    dSP;    int count, status;    if (!MpHandlerPARSED(handler)) {        if (!modperl_handler_parse(aTHX_ handler)) {            MP_TRACE_h(MP_FUNC, "failed to parse handler `%s'\n",                       handler->name);            return HTTP_INTERNAL_SERVER_ERROR;        }    }    ENTER;SAVETMPS;    PUSHMARK(SP);    if (MpHandlerMETHOD(handler)) {        XPUSHs(handler->obj);    }    if (handler->args) {        I32 i, len = AvFILL(handler->args);        EXTEND(SP, len);        for (i=0; i<=len; i++) {            PUSHs(sv_2mortal(*av_fetch(handler->args, i, FALSE)));        }    }    PUTBACK;    if (MpHandlerMETHOD(handler)) {        count = call_method(SvPVX(handler->cv), G_EVAL|G_SCALAR);    }    else {        count = call_sv(handler->cv, G_EVAL|G_SCALAR);    }    SPAGAIN;    if (count != 1) {        status = OK;    }    else {        status = POPi;    }    PUTBACK;    FREETMPS;LEAVE;    if (SvTRUE(ERRSV)) {        MP_TRACE_h(MP_FUNC, "$@ = %s\n", SvPVX(ERRSV));        status = HTTP_INTERNAL_SERVER_ERROR;    }    /* XXX: since the interpreter from which this data was allocated     * can be knocked off (PerlInterpMax{Spare,Requests}, the parse caching     * is broken.     */    modperl_handler_unparse(handler);    return status;}