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)

Attachment: signature.asc
Description: OpenPGP digital signature



Reply via email to