As per a previous thread, it became obvious that the current implementation of modperl_perl_module_loaded is broken, as it's using the existence of a stash to determine if a package is loaded, and that's not accurate at all. This patch uses an %INC lookup instead.
-- -------------------------------------------------------------------------------- Philippe M. Chiasson m/gozer\@(apache|cpan|ectoplasm)\.org/ GPG KeyID : 88C3A5A5 http://gozer.ectoplasm.org/ F9BF E0C2 480E 7680 1AE5 3631 CB32 A107 88C3A5A5
Index: src/modules/perl/modperl_mgv.c =================================================================== RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_mgv.c,v retrieving revision 1.35 diff -u -I$Id -r1.35 modperl_mgv.c --- src/modules/perl/modperl_mgv.c 4 Mar 2004 06:01:07 -0000 1.35 +++ src/modules/perl/modperl_mgv.c 25 Aug 2004 20:43:08 -0000 @@ -171,32 +171,6 @@ } #endif - -static void package2filename(apr_pool_t *p, const char *package, - char **filename, int *len) -{ - const char *s; - char *d; - - *filename = apr_palloc(p, (strlen(package)+4)*sizeof(char)); - - for (s = package, d = *filename; *s; s++, d++) { - if (*s == ':' && s[1] == ':') { - *d = '/'; - s++; - } - else { - *d = *s; - } - } - *d++ = '.'; - *d++ = 'p'; - *d++ = 'm'; - *d = '\0'; - - *len = d - *filename; -} - /* currently used for complex filters attributes parsing */ /* XXX: may want to generalize it for any handlers */ #define MODPERL_MGV_DEEP_RESOLVE(handler, p) \ @@ -281,17 +255,10 @@ } if (!stash && MpHandlerAUTOLOAD(handler)) { - int len; - char *filename; - SV **svp; - - package2filename(p, name, &filename, &len); - svp = hv_fetch(GvHVn(PL_incgv), filename, len, 0); - - if (!(svp && *svp != &PL_sv_undef)) { /* not in %INC */ + if (!modperl_perl_module_loaded(aTHX_ name)) { /* not in %INC */ MP_TRACE_h(MP_FUNC, - "package %s not in %INC, attempting to load '%s'\n", - name, filename); + "package %s not in %INC, attempting to load it\n", + name); if (modperl_require_module(aTHX_ name, logfailure)) { MP_TRACE_h(MP_FUNC, "loaded %s package\n", name); @@ -309,9 +276,7 @@ } } else { - MP_TRACE_h(MP_FUNC, "package %s seems to be loaded\n" - " $INC{'%s')='%s';\n", - name, filename, SvPV_nolen(*svp)); + MP_TRACE_h(MP_FUNC, "package %s seems to be loaded\n", name); } } Index: src/modules/perl/modperl_util.c =================================================================== RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_util.c,v retrieving revision 1.76 diff -u -I$Id -r1.76 modperl_util.c --- src/modules/perl/modperl_util.c 22 Aug 2004 20:47:37 -0000 1.76 +++ src/modules/perl/modperl_util.c 25 Aug 2004 20:43:08 -0000 @@ -486,9 +486,41 @@ return retval; } +static char *package2filename(const char *package, int *len) +{ + const char *s; + char *d; + char *filename; + + filename = malloc((strlen(package)+4)*sizeof(char)); + + for (s = package, d = filename; *s; s++, d++) { + if (*s == ':' && s[1] == ':') { + *d = '/'; + s++; + } + else { + *d = *s; + } + } + *d++ = '.'; + *d++ = 'p'; + *d++ = 'm'; + *d = '\0'; + + *len = d - filename; + return filename; +} + MP_INLINE int modperl_perl_module_loaded(pTHX_ const char *name) { - return (*name && gv_stashpv(name, FALSE)) ? 1 : 0; + SV **svp; + int len; + char *filename = package2filename(name, &len); + svp = hv_fetch(GvHVn(PL_incgv), filename, len, 0); + free(filename); + + return (svp && *svp != &PL_sv_undef) ? 1 : 0; } static int modperl_gvhv_is_stash(GV *gv)
signature.asc
Description: OpenPGP digital signature