Philippe M. Chiasson wrote:
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.

+1, +Changes entry

------------------------------------------------------------------------

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)


--
__________________________________________________________________
Stas Bekman            JAm_pH ------> Just Another mod_perl Hacker
http://stason.org/     mod_perl Guide ---> http://perl.apache.org
mailto:[EMAIL PROTECTED] http://use.perl.org http://apacheweek.com
http://modperlbook.org http://apache.org   http://ticketmaster.com

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



Reply via email to