Re: very old bug report about internal_redirect
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:
Reply to: