You are viewing a plain text version of this content. The canonical link for it is here.
Posted to modperl-cvs@perl.apache.org by st...@apache.org on 2004/11/24 20:32:49 UTC

svn commit: r106450 - in perl/modperl/trunk: . src/modules/perl t/filter t/hooks t/hooks/TestHooks

Author: stas
Date: Wed Nov 24 11:32:47 2004
New Revision: 106450

URL: http://svn.apache.org/viewcvs?view=rev&rev=106450
Log:
replace the slow implementation of anon handlers using B::Deparse,
with per-interpreter cache of compiled CODE refs (sort of emulating
named subroutines for anonymous handlers)

Modified:
   perl/modperl/trunk/Changes
   perl/modperl/trunk/src/modules/perl/mod_perl.c
   perl/modperl/trunk/src/modules/perl/modperl_callback.c
   perl/modperl/trunk/src/modules/perl/modperl_handler.c
   perl/modperl/trunk/src/modules/perl/modperl_handler.h
   perl/modperl/trunk/src/modules/perl/modperl_mgv.c
   perl/modperl/trunk/src/modules/perl/modperl_perl_global.c
   perl/modperl/trunk/src/modules/perl/modperl_perl_global.h
   perl/modperl/trunk/src/modules/perl/modperl_types.h
   perl/modperl/trunk/src/modules/perl/modperl_util.c
   perl/modperl/trunk/src/modules/perl/modperl_util.h
   perl/modperl/trunk/t/filter/both_str_req_add.t
   perl/modperl/trunk/t/hooks/TestHooks/push_handlers_blessed.pm
   perl/modperl/trunk/t/hooks/push_handlers.t

Modified: perl/modperl/trunk/Changes
Url: http://svn.apache.org/viewcvs/perl/modperl/trunk/Changes?view=diff&rev=106450&p1=perl/modperl/trunk/Changes&r1=106449&p2=perl/modperl/trunk/Changes&r2=106450
==============================================================================
--- perl/modperl/trunk/Changes	(original)
+++ perl/modperl/trunk/Changes	Wed Nov 24 11:32:47 2004
@@ -12,6 +12,10 @@
 
 =item 1.99_18-dev
 
+replace the slow implementation of anon handlers using B::Deparse,
+with per-interpreter cache of compiled CODE refs (sort of emulating
+named subroutines for anonymous handlers) [Stas].
+
 avoid segfaults when a bogus $r object is used [Stas]
 
 Remove magicness of PerlLoadModule and implement Apache::Module::add()

Modified: perl/modperl/trunk/src/modules/perl/mod_perl.c
Url: http://svn.apache.org/viewcvs/perl/modperl/trunk/src/modules/perl/mod_perl.c?view=diff&rev=106450&p1=perl/modperl/trunk/src/modules/perl/mod_perl.c&r1=106449&p2=perl/modperl/trunk/src/modules/perl/mod_perl.c&r2=106450
==============================================================================
--- perl/modperl/trunk/src/modules/perl/mod_perl.c	(original)
+++ perl/modperl/trunk/src/modules/perl/mod_perl.c	Wed Nov 24 11:32:47 2004
@@ -280,6 +280,8 @@
             newSVpv(ap_server_root_relative(p, "lib/perl"), 0));
 #endif /* MP_COMPAT_1X */
     
+    modperl_handler_anon_init(aTHX_ p);
+    
     if (!modperl_config_apply_PerlRequire(s, scfg, perl, p)) {
         exit(1);
     }

Modified: perl/modperl/trunk/src/modules/perl/modperl_callback.c
Url: http://svn.apache.org/viewcvs/perl/modperl/trunk/src/modules/perl/modperl_callback.c?view=diff&rev=106450&p1=perl/modperl/trunk/src/modules/perl/modperl_callback.c&r1=106449&p2=perl/modperl/trunk/src/modules/perl/modperl_callback.c&r2=106450
==============================================================================
--- perl/modperl/trunk/src/modules/perl/modperl_callback.c	(original)
+++ perl/modperl/trunk/src/modules/perl/modperl_callback.c	Wed Nov 24 11:32:47 2004
@@ -67,20 +67,8 @@
 
     if (MpHandlerANON(handler)) {
 #ifdef USE_ITHREADS
-        /* it's possible that the interpreter that is running the anon
-         * cv, isn't the one that compiled it. so to be safe need to
-         * re-eval the deparsed form before using it.
-         * XXX: possible optimizations, see modperl_handler_new_anon */
-        SV *sv = eval_pv(handler->name, TRUE); 
-        cv = (CV*)SvRV(sv);
+        cv = modperl_handler_anon_get(aTHX_ handler->mgv_obj);
 #else
-        /* the same interpreter that has compiled the anon cv is used
-         * to run it */
-        if (!handler->cv) {
-            SV *sv = eval_pv(handler->name, TRUE); 
-            handler->cv = (CV*)SvRV(sv); /* cache */
-            SvREFCNT_inc(handler->cv);
-        }
         cv = handler->cv;
 #endif
     }
@@ -90,7 +78,6 @@
             cv = modperl_mgv_cv(gv);
         }
         else {
-            
             const char *name;
             modperl_mgv_t *symbol = handler->mgv_cv;
             

Modified: perl/modperl/trunk/src/modules/perl/modperl_handler.c
Url: http://svn.apache.org/viewcvs/perl/modperl/trunk/src/modules/perl/modperl_handler.c?view=diff&rev=106450&p1=perl/modperl/trunk/src/modules/perl/modperl_handler.c&r1=106449&p2=perl/modperl/trunk/src/modules/perl/modperl_handler.c&r2=106450
==============================================================================
--- perl/modperl/trunk/src/modules/perl/modperl_handler.c	(original)
+++ perl/modperl/trunk/src/modules/perl/modperl_handler.c	Wed Nov 24 11:32:47 2004
@@ -43,6 +43,115 @@
     return handler;
 }
 
+/* How anon-subs are handled:
+ * We have two ways anon-subs can be registered
+ * A) at startup from httpd.conf:
+ *    PerlTransHandler 'sub { ... }'
+ * B) run-time perl code
+ *    $r->push_handlers(PerlTransHandler => sub { .... });
+ *
+ * In the case of non-threaded perl, we just compile A or grab B and
+ * store it in the mod_perl struct and call it when it's used. No
+ * problems here
+ *
+ * In the case of threads, things get more complicated. we no longer
+ * can store the CV value of the compiled anon-sub, since when
+ * perl_clone is called each interpreter will have a different CV
+ * value. since we need to be able to have 1 entry for each anon-sub
+ * across all interpreters a different solution is needed. to remind
+ * in the case of named subs, we just store the name of the sub and
+ * look its corresponding CV when we need it.
+ *
+ * The used solution: each process has a global counter, which always
+ * grows. Every time a new anon-sub is encountered, a new ID is
+ * allocated from that process-global counter and that ID is stored in
+ * the mod_perl struct. The compiled CV is stored as
+ *     $PL_modglobal{ANONSUB}{$id} = CV;
+ * when perl_clone is called, each clone will clone that CV value, but
+ * we will still be able to find it, since we stored it in the
+ * hash. so we retrieve the CV value, whatever it is and we run it.
+ * 
+ * that explanation can be written and run in perl:
+ *
+ * use threads;
+ * our %h;
+ * $h{x} = eval 'sub { print qq[this is sub @_\n] }';
+ * $h{x}->("main");
+ * threads->new(sub { $h{x}->(threads->self->tid)});
+ *
+ * XXX: more nuances will follow
+ */
+
+void modperl_handler_anon_init(pTHX_ apr_pool_t *p)
+{
+    modperl_modglobal_key_t *gkey =
+        modperl_modglobal_lookup(aTHX_ "ANONSUB");
+    MP_TRACE_h(MP_FUNC, "init $PL_modglobal{ANONSUB} = []");
+    MP_MODGLOBAL_STORE_HV(gkey);
+
+    /* init the counter to 0 */
+    modperl_global_anon_cnt_init(p);
+}
+ 
+/* allocate and populate the anon handler sub-struct */
+MP_INLINE modperl_mgv_t *modperl_handler_anon_next(pTHX_ apr_pool_t *p)
+{
+    /* re-use modperl_mgv_t entry which is otherwise is not used
+     * by anon handlers */
+    modperl_mgv_t *anon = 
+        (modperl_mgv_t *)apr_pcalloc(p, sizeof(*anon));
+
+    anon->name = apr_psprintf(p, "%d", modperl_global_anon_cnt_next());
+    anon->len  = strlen(anon->name);
+    PERL_HASH(anon->hash, anon->name, anon->len);
+
+    MP_TRACE_h(MP_FUNC, "[%s] new anon handler: '%s'",
+               modperl_pid_tid(p), anon->name);
+    return anon;
+}
+
+MP_INLINE void modperl_handler_anon_add(pTHX_ modperl_mgv_t *anon, CV *cv)
+{
+    modperl_modglobal_key_t *gkey =
+        modperl_modglobal_lookup(aTHX_ "ANONSUB");
+    HE *he = MP_MODGLOBAL_FETCH(gkey);
+    HV *hv;
+
+    if (!(he && (hv = (HV*)HeVAL(he)))) {
+        Perl_croak(aTHX_ "can't find ANONSUB top entry (get)");
+    }
+
+    SvREFCNT_inc(cv);
+    if (!(*hv_store(hv, anon->name, anon->len, (SV*)cv, anon->hash))) {
+        SvREFCNT_dec(cv);
+        Perl_croak(aTHX_ "hv_store of '%s' has failed!", anon->name);
+    }
+
+    MP_TRACE_h(MP_FUNC, "anonsub '%s' added", anon->name);
+}
+
+MP_INLINE CV *modperl_handler_anon_get(pTHX_ modperl_mgv_t *anon)
+{
+    modperl_modglobal_key_t *gkey =
+        modperl_modglobal_lookup(aTHX_ "ANONSUB");
+    HE *he = MP_MODGLOBAL_FETCH(gkey);
+    HV *hv;
+    SV *sv;
+
+    if (!(he && (hv = (HV*)HeVAL(he)))) {
+        Perl_croak(aTHX_ "can't find ANONSUB top entry (get)");
+    }
+
+    if ((he = hv_fetch_he(hv, anon->name, anon->len, anon->hash))) {
+        sv = HeVAL(he);
+        MP_TRACE_h(MP_FUNC, "anonsub get '%s'", anon->name);
+    }
+    else {
+        Perl_croak(aTHX_ "can't find ANONSUB's '%s' entry", anon->name);
+    }
+
+    return (CV*)sv;
+}
 
 static
 modperl_handler_t *modperl_handler_new_anon(pTHX_ apr_pool_t *p, CV *cv)
@@ -53,34 +162,16 @@
     MpHandlerANON_On(handler);
 
 #ifdef USE_ITHREADS
-    /* XXX: perhaps we can optimize this further. At the moment when
-     * perl w/ ithreads is used, we always deparse the anon subs
-     * before storing them and then eval them each time they are
-     * used. This is because we don't know whether the same perl that
-     * compiled the anonymous sub is used to run it.
-     *
-     * A possible optimization is to cache the CV and use that cached
-     * value w/ or w/o deparsing at all if:
-     *
-     * - the mpm is non-threaded mpm and no +Clone/+Parent is used
-     *   (i.e. no perl pools) (no deparsing is needed at all)
-     * 
-     * - the interpreter that has supplied the anon cv is the same
-     *   interpreter that is executing that cv (requires storing aTHX
-     *   in the handler's struct) (need to deparse in case the
-     *   interpreter gets switched)
-     *
-     * - other cases?
-     */
-    handler->cv = NULL;
-    handler->name = modperl_coderef2text(aTHX_ p, cv);
-    MP_TRACE_h(MP_FUNC, "[%s] new deparsed anon handler:\n%s\n",
-               modperl_pid_tid(p), handler->name);
+    handler->cv      = NULL;
+    handler->name    = NULL;
+    handler->mgv_obj = modperl_handler_anon_next(aTHX_ p);
+    modperl_handler_anon_add(aTHX_ handler->mgv_obj, cv);
 #else
     /* it's safe to cache and later use the cv, since the same perl
      * interpeter is always used */
-    handler->cv = cv;
+    handler->cv   = cv;
     handler->name = NULL;
+
     MP_TRACE_h(MP_FUNC, "[%s] new cached cv anon handler\n",
                modperl_pid_tid(p));
 #endif

Modified: perl/modperl/trunk/src/modules/perl/modperl_handler.h
Url: http://svn.apache.org/viewcvs/perl/modperl/trunk/src/modules/perl/modperl_handler.h?view=diff&rev=106450&p1=perl/modperl/trunk/src/modules/perl/modperl_handler.h&r1=106449&p2=perl/modperl/trunk/src/modules/perl/modperl_handler.h&r2=106450
==============================================================================
--- perl/modperl/trunk/src/modules/perl/modperl_handler.h	(original)
+++ perl/modperl/trunk/src/modules/perl/modperl_handler.h	Wed Nov 24 11:32:47 2004
@@ -22,6 +22,11 @@
     MP_HANDLER_ACTION_SET
 } modperl_handler_action_e;
 
+void modperl_handler_anon_init(pTHX_ apr_pool_t *p);
+MP_INLINE modperl_mgv_t *modperl_handler_anon_next(pTHX_ apr_pool_t *p);
+MP_INLINE void modperl_handler_anon_add(pTHX_ modperl_mgv_t *anon, CV *cv);
+MP_INLINE CV *modperl_handler_anon_get(pTHX_ modperl_mgv_t *anon);
+    
 #define modperl_handler_array_new(p) \
 apr_array_make(p, 1, sizeof(modperl_handler_t *))
 

Modified: perl/modperl/trunk/src/modules/perl/modperl_mgv.c
Url: http://svn.apache.org/viewcvs/perl/modperl/trunk/src/modules/perl/modperl_mgv.c?view=diff&rev=106450&p1=perl/modperl/trunk/src/modules/perl/modperl_mgv.c&r1=106449&p2=perl/modperl/trunk/src/modules/perl/modperl_mgv.c&r2=106450
==============================================================================
--- perl/modperl/trunk/src/modules/perl/modperl_mgv.c	(original)
+++ perl/modperl/trunk/src/modules/perl/modperl_mgv.c	Wed Nov 24 11:32:47 2004
@@ -193,9 +193,35 @@
     }
     
     if (strnEQ(name, "sub ", 4)) {
-        MP_TRACE_h(MP_FUNC, "handler is anonymous\n");
-        MpHandlerANON_On(handler);
+        SV *sv;
+        CV *cv;
         MpHandlerPARSED_On(handler);
+        MpHandlerANON_On(handler);
+
+        ENTER;SAVETMPS;
+        sv = eval_pv(name, TRUE);
+        if (!(SvROK(sv) && (cv = (CV*)SvRV(sv)) && (CvFLAGS(cv) & CVf_ANON))) {
+            
+            Perl_croak(aTHX_ "expected anonymous sub, got '%s'\n", name);
+        }
+
+#ifdef USE_ITHREADS
+        handler->cv      = NULL;
+        handler->name    = NULL;
+        handler->mgv_obj = modperl_handler_anon_next(aTHX_ p);
+        modperl_handler_anon_add(aTHX_ handler->mgv_obj, cv);
+        MP_TRACE_h(MP_FUNC, "[%s] new anon handler",
+                   modperl_pid_tid(p));
+#else
+        SvREFCNT_inc(cv);
+        handler->cv      = cv;
+        handler->name    = NULL;
+        MP_TRACE_h(MP_FUNC, "[%s] new cached-cv anon handler",
+                   modperl_pid_tid(p));
+#endif
+
+        FREETMPS;LEAVE;
+
         return 1;
     }
 

Modified: perl/modperl/trunk/src/modules/perl/modperl_perl_global.c
Url: http://svn.apache.org/viewcvs/perl/modperl/trunk/src/modules/perl/modperl_perl_global.c?view=diff&rev=106450&p1=perl/modperl/trunk/src/modules/perl/modperl_perl_global.c&r1=106449&p2=perl/modperl/trunk/src/modules/perl/modperl_perl_global.c&r2=106450
==============================================================================
--- perl/modperl/trunk/src/modules/perl/modperl_perl_global.c	(original)
+++ perl/modperl/trunk/src/modules/perl/modperl_perl_global.c	Wed Nov 24 11:32:47 2004
@@ -15,30 +15,14 @@
 
 #include "mod_perl.h"
 
-static void modperl_perl_global_init(pTHX_ modperl_perl_globals_t *globals)
-{
-    globals->env.gv    = PL_envgv;
-    globals->inc.gv    = PL_incgv;
-    globals->defout.gv = PL_defoutgv;
-    globals->rs.sv     = &PL_rs;
-    globals->end.av    = &PL_endav;
-    globals->end.key   = MP_MODGLOBAL_END;
-}
-
 /* XXX: PL_modglobal thingers might be useful elsewhere */
 
-#define MP_MODGLOBAL_FETCH(gkey)                                        \
-    hv_fetch_he(PL_modglobal, (char *)gkey->val, gkey->len, gkey->hash)
-
-#define MP_MODGLOBAL_STORE_HV(gkey)                                     \
-    (HV*)*hv_store(PL_modglobal, gkey->val, gkey->len,                  \
-                   (SV*)newHV(), gkey->hash)
-
 #define MP_MODGLOBAL_ENT(key)                                           \
     {key, "ModPerl::" key, MP_SSTRLEN("ModPerl::") + MP_SSTRLEN(key), 0}
 
 static modperl_modglobal_key_t MP_modglobal_keys[] = {
     MP_MODGLOBAL_ENT("END"),
+    MP_MODGLOBAL_ENT("ANONSUB"),
     { NULL },
 };
 
@@ -64,6 +48,16 @@
     }
 
     return NULL;
+}
+
+static void modperl_perl_global_init(pTHX_ modperl_perl_globals_t *globals)
+{
+    globals->env.gv    = PL_envgv;
+    globals->inc.gv    = PL_incgv;
+    globals->defout.gv = PL_defoutgv;
+    globals->rs.sv     = &PL_rs;
+    globals->end.av    = &PL_endav;
+    globals->end.key   = MP_MODGLOBAL_END;
 }
 
 /*

Modified: perl/modperl/trunk/src/modules/perl/modperl_perl_global.h
Url: http://svn.apache.org/viewcvs/perl/modperl/trunk/src/modules/perl/modperl_perl_global.h?view=diff&rev=106450&p1=perl/modperl/trunk/src/modules/perl/modperl_perl_global.h&r1=106449&p2=perl/modperl/trunk/src/modules/perl/modperl_perl_global.h&r2=106450
==============================================================================
--- perl/modperl/trunk/src/modules/perl/modperl_perl_global.h	(original)
+++ perl/modperl/trunk/src/modules/perl/modperl_perl_global.h	Wed Nov 24 11:32:47 2004
@@ -16,6 +16,13 @@
 #ifndef MODPERL_PERL_GLOBAL_H
 #define MODPERL_PERL_GLOBAL_H
 
+#define MP_MODGLOBAL_FETCH(gkey)                                        \
+    hv_fetch_he(PL_modglobal, (char *)gkey->val, gkey->len, gkey->hash)
+
+#define MP_MODGLOBAL_STORE_HV(gkey)                                     \
+    (HV*)*hv_store(PL_modglobal, gkey->val, gkey->len,                  \
+                   (SV*)newHV(), gkey->hash)
+
 typedef struct {
     const char *name;
     const char *val;

Modified: perl/modperl/trunk/src/modules/perl/modperl_types.h
Url: http://svn.apache.org/viewcvs/perl/modperl/trunk/src/modules/perl/modperl_types.h?view=diff&rev=106450&p1=perl/modperl/trunk/src/modules/perl/modperl_types.h&r1=106449&p2=perl/modperl/trunk/src/modules/perl/modperl_types.h&r2=106450
==============================================================================
--- perl/modperl/trunk/src/modules/perl/modperl_types.h	(original)
+++ perl/modperl/trunk/src/modules/perl/modperl_types.h	Wed Nov 24 11:32:47 2004
@@ -176,13 +176,16 @@
 
 typedef struct modperl_handler_t modperl_handler_t;
 
-struct modperl_handler_t{
+struct modperl_handler_t {
+    /* could be:
+     * - the lightweight gv for named subs
+     * - the lookup data in $PL_modperl{ANONSUB}
+     */
     modperl_mgv_t *mgv_obj;
     modperl_mgv_t *mgv_cv;
     /* could be:
-     * - a subroutine name
-     * - a subroutine source code as a string (anon subs)
-     * - NULL, when .cv is set (anon subs)
+     * - a subroutine name for named subs
+     * - NULL for anon subs
      */
     const char *name; 
     CV *cv;

Modified: perl/modperl/trunk/src/modules/perl/modperl_util.c
Url: http://svn.apache.org/viewcvs/perl/modperl/trunk/src/modules/perl/modperl_util.c?view=diff&rev=106450&p1=perl/modperl/trunk/src/modules/perl/modperl_util.c&r1=106449&p2=perl/modperl/trunk/src/modules/perl/modperl_util.c&r2=106450
==============================================================================
--- perl/modperl/trunk/src/modules/perl/modperl_util.c	(original)
+++ perl/modperl/trunk/src/modules/perl/modperl_util.c	Wed Nov 24 11:32:47 2004
@@ -702,86 +702,6 @@
     return package;
 }
 
-char *modperl_coderef2text(pTHX_ apr_pool_t *p, CV *cv)
-{
-    dSP;
-    int count;
-    SV *bdeparse;
-    SV *use;
-    char *text;
-    int tainted_orig;
-    
-    /* B::Deparse >= 0.61 needed for blessed code references.
-     * 0.6 works fine for non-blessed code refs.
-     * notice that B::Deparse is not CPAN-updatable.
-     * 0.61 is available starting from 5.8.0
-     */
-    
-     /*
-      Perl_load_module(aTHX_ PERL_LOADMOD_NOIMPORT,
-                      newSVpvn("B::Deparse", 10),
-                      newSVnv(SvOBJECT((SV*)cv) ? 0.61 : 0.60));   
-     * Perl_load_module() was causing segfaults in the worker MPM.
-     * this is a work around until we can find the problem with
-     * Perl_load_module() 
-     * See: http://marc.theaimsgroup.com/?t=109684579900001&r=1&w=2
-     */ 
-    use = newSVpv("use B::Deparse ", 15);
-    if (SvOBJECT((SV*)cv)) {
-        sv_catpvn(use, "0.61", 3);
-    }
-    sv_catpvn(use, " ();", 4);
-    
-    tainted_orig = PL_tainted;
-    TAINT_NOT;
-    eval_sv(use, G_DISCARD);
-    PL_tainted = tainted_orig;
-    sv_free(use);
-
-    ENTER;
-    SAVETMPS;
-
-    /* create the B::Deparse object */
-    PUSHMARK(sp);
-    XPUSHs(sv_2mortal(newSVpvn("B::Deparse", 10)));
-    PUTBACK;
-    count = call_method("new", G_SCALAR);
-    SPAGAIN;
-    if (count != 1) {
-        Perl_croak(aTHX_ "Unexpected return value from B::Deparse::new\n");
-    }
-    if (SvTRUE(ERRSV)) {
-        Perl_croak(aTHX_ "error: %s", SvPVX(ERRSV));
-    }
-    bdeparse = POPs;
-
-    PUSHMARK(sp);
-    XPUSHs(bdeparse);
-    XPUSHs(sv_2mortal(newRV_inc((SV*)cv)));
-    PUTBACK;
-    count = call_method("coderef2text", G_SCALAR);
-    SPAGAIN;
-    if (count != 1) {
-        Perl_croak(aTHX_ "Unexpected return value from "
-                   "B::Deparse::coderef2text\n");
-    }
-    if (SvTRUE(ERRSV)) {
-        Perl_croak(aTHX_ "error: %s", SvPVX(ERRSV));
-    }
-    
-    {
-        STRLEN n_a;
-        text = apr_pstrcat(p, "sub ", POPpx, NULL);
-    }
-    
-    PUTBACK;
-    
-    FREETMPS;
-    LEAVE;
-
-    return text;
-}
-
 SV *modperl_apr_array_header2avrv(pTHX_ apr_array_header_t *array)
 {
     AV *av = newAV(); 

Modified: perl/modperl/trunk/src/modules/perl/modperl_util.h
Url: http://svn.apache.org/viewcvs/perl/modperl/trunk/src/modules/perl/modperl_util.h?view=diff&rev=106450&p1=perl/modperl/trunk/src/modules/perl/modperl_util.h&r1=106449&p2=perl/modperl/trunk/src/modules/perl/modperl_util.h&r2=106450
==============================================================================
--- perl/modperl/trunk/src/modules/perl/modperl_util.h	(original)
+++ perl/modperl/trunk/src/modules/perl/modperl_util.h	Wed Nov 24 11:32:47 2004
@@ -96,14 +96,6 @@
 
 char *modperl_file2package(apr_pool_t *p, const char *file);
 
-/**
- * convert a compiled *CV ref to its original source code
- * @param p       pool object (with a shortest possible life scope)
- * @param cv      compiled *CV
- * @return string of original source code
- */
-char *modperl_coderef2text(pTHX_ apr_pool_t *p, CV *cv);
-
 SV *modperl_apr_array_header2avrv(pTHX_ apr_array_header_t *array);
 apr_array_header_t *modperl_avrv2apr_array_header(pTHX_ apr_pool_t *p,
                                                   SV *avrv);

Modified: perl/modperl/trunk/t/filter/both_str_req_add.t
Url: http://svn.apache.org/viewcvs/perl/modperl/trunk/t/filter/both_str_req_add.t?view=diff&rev=106450&p1=perl/modperl/trunk/t/filter/both_str_req_add.t&r1=106449&p2=perl/modperl/trunk/t/filter/both_str_req_add.t&r2=106450
==============================================================================
--- perl/modperl/trunk/t/filter/both_str_req_add.t	(original)
+++ perl/modperl/trunk/t/filter/both_str_req_add.t	Wed Nov 24 11:32:47 2004
@@ -5,7 +5,7 @@
 use Apache::TestRequest;
 use Apache::TestUtil;
 
-plan tests => 1, need_min_module_version('B::Deparse', 0.6);
+plan tests => 1;
 
 my $data = join ' ', 'A'..'Z', 0..9;
 my $expected = lc $data; # that's what the input filter does

Modified: perl/modperl/trunk/t/hooks/TestHooks/push_handlers_blessed.pm
Url: http://svn.apache.org/viewcvs/perl/modperl/trunk/t/hooks/TestHooks/push_handlers_blessed.pm?view=diff&rev=106450&p1=perl/modperl/trunk/t/hooks/TestHooks/push_handlers_blessed.pm&r1=106449&p2=perl/modperl/trunk/t/hooks/TestHooks/push_handlers_blessed.pm&r2=106450
==============================================================================
--- perl/modperl/trunk/t/hooks/TestHooks/push_handlers_blessed.pm	(original)
+++ perl/modperl/trunk/t/hooks/TestHooks/push_handlers_blessed.pm	Wed Nov 24 11:32:47 2004
@@ -19,7 +19,7 @@
 sub handler {
     my $r = shift;
 
-    plan $r, tests => 1, need_min_module_version('B::Deparse', 0.61);;
+    plan $r, tests => 1;
 
     my $sub = sub {
         ok 1;

Modified: perl/modperl/trunk/t/hooks/push_handlers.t
Url: http://svn.apache.org/viewcvs/perl/modperl/trunk/t/hooks/push_handlers.t?view=diff&rev=106450&p1=perl/modperl/trunk/t/hooks/push_handlers.t&r1=106449&p2=perl/modperl/trunk/t/hooks/push_handlers.t&r2=106450
==============================================================================
--- perl/modperl/trunk/t/hooks/push_handlers.t	(original)
+++ perl/modperl/trunk/t/hooks/push_handlers.t	Wed Nov 24 11:32:47 2004
@@ -5,7 +5,7 @@
 use Apache::TestUtil;
 use Apache::TestRequest;
 
-plan tests => 1, need_min_module_version('B::Deparse', 0.6);
+plan tests => 1;
 
 my @refs = qw(conf conf1 conf2 coderef 
              full_coderef coderef1 coderef2 coderef3);