With this setup, the error message changes:
Now I have:
[Sun Nov 9 20:17:26 2003] [error] Can't call method "content_type" on an undefined value at /usr/local/lib/site_perl/bug130883/Impl1.pm line 10.
when I try to access /R
that error makes more sense.
here, what is happening is that your handler is being called, but not as a method handler - meaning the
my $self = shift;
in Impl1::handler() is getting $r, thus leaving the call to
my $req = shift;
with an empty argument list.
ok, if you could try a few things for me, that would be great.
first, try prototyping all the method handlers with
sub handler : method {
instead of using ($$).
next, try applying the attached patch and see if it helps at all (both with $$ and : method).
thanks
--Geoff
Index: src/modules/perl/mod_perl.c =================================================================== RCS file: /home/cvspublic/modperl/src/modules/perl/mod_perl.c,v retrieving revision 1.147 diff -u -r1.147 mod_perl.c --- src/modules/perl/mod_perl.c 2 Oct 2003 21:30:35 -0000 1.147 +++ src/modules/perl/mod_perl.c 9 Nov 2003 21:59:05 -0000 @@ -1231,20 +1231,33 @@ if (gvp) cv = GvCV(gvp); } + if (cv != NULL) { + is_method = perl_cv_ismethod(cv); + } + + MP_TRACE_h(fprintf(stderr, "checking if `%s' is a method...%s\n", + sub, (is_method ? "yes" : "no"))); + SvREFCNT_dec(sv); + return is_method; +} + +int perl_cv_ismethod(CV *cv) +{ + int is_method=0; + #ifdef CVf_METHOD if (cv && (CvFLAGS(cv) & CVf_METHOD)) { is_method = 1; } #endif + if (!is_method && (cv && SvPOK(cv))) { is_method = strnEQ(SvPVX(cv), "$$", 2); } - MP_TRACE_h(fprintf(stderr, "checking if `%s' is a method...%s\n", - sub, (is_method ? "yes" : "no"))); - SvREFCNT_dec(sv); return is_method; } + #endif void mod_perl_noop(void *data) {} @@ -1486,6 +1499,7 @@ HV *stash = Nullhv; SV *pclass = newSVsv(sv), *dispsv = Nullsv; CV *cv = Nullcv; + GV *gv = Nullgv; char *method = "handler"; int defined_sub = 0, anon = 0; char *dispatcher = NULL; @@ -1620,8 +1634,27 @@ #endif } else { - MP_TRACE_h(fprintf(stderr, "perl_call: handler is a %s\n", - dispatcher ? "dispatcher" : "cached CV")); + if (!dispatcher) { + MP_TRACE_h(fprintf(stderr, "perl_call: handler is a cached CV\n")); +#ifdef PERL_METHOD_HANDLERS + cv = sv_2cv(sv, &stash, &gv, FALSE); + + if (cv != NULL) { + is_method = perl_cv_ismethod(cv); + } + + if (is_method) { + sv_setpv(pclass, HvNAME(stash)); + method = GvNAME(CvGV(cv)); + } + + MP_TRACE_h(fprintf(stderr, "checking if CV is a method...%s\n", + (is_method ? "yes" : "no"))); +#endif + } + else { + MP_TRACE_h(fprintf(stderr, "perl_call: handler is a dispatcher\n")); + } } callback:
-- Reporting bugs: http://perl.apache.org/bugs/ Mail list info: http://perl.apache.org/maillist/modperl.html