gozer 2004/08/25 13:57:15
Modified: . Changes
src/modules/perl modperl_mgv.c modperl_util.c
Log:
modperl_perl_module_loaded() fixed to use %INC to determine if a module
is loaded instead of checking for the existence of a stash.
Use Foo::Bar::Baz creates Foo:: Foo::Bar:: _and_ Foo::Bar::Baz:: stashes,
so before this mp_module_loaded() would tell you Foo and Foo::Bar were
loaded.
Revision Changes Path
1.468 +3 -0 modperl-2.0/Changes
Index: Changes
===================================================================
RCS file: /home/cvs/modperl-2.0/Changes,v
retrieving revision 1.467
retrieving revision 1.468
diff -u -r1.467 -r1.468
--- Changes 25 Aug 2004 17:20:04 -0000 1.467
+++ Changes 25 Aug 2004 20:57:14 -0000 1.468
@@ -12,6 +12,9 @@
=item 1.99_17-dev
+modperl_perl_module_loaded() fixed to use %INC to determine if a module
+is loaded instead of checking for the existence of a stash [Gozer]
+
fix the modperl build, where httpd has been built against separate
installations of apr-util and apr, where apr-util has been installed
with a different includedir to apr. [Joe Orton]
1.36 +4 -39 modperl-2.0/src/modules/perl/modperl_mgv.c
Index: modperl_mgv.c
===================================================================
RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_mgv.c,v
retrieving revision 1.35
retrieving revision 1.36
diff -u -r1.35 -r1.36
--- modperl_mgv.c 4 Mar 2004 06:01:07 -0000 1.35
+++ modperl_mgv.c 25 Aug 2004 20:57:14 -0000 1.36
@@ -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);
}
}
1.77 +33 -1 modperl-2.0/src/modules/perl/modperl_util.c
Index: modperl_util.c
===================================================================
RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_util.c,v
retrieving revision 1.76
retrieving revision 1.77
diff -u -r1.76 -r1.77
--- modperl_util.c 22 Aug 2004 20:47:37 -0000 1.76
+++ modperl_util.c 25 Aug 2004 20:57:14 -0000 1.77
@@ -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)