On Thu, 24 Jan 2008, Philippe M. Chiasson wrote:

[ ... ]
Following is a patch (probably will change some more before I am done) that
gets rid of this hacking attribute handling and passes it around with magic.

Great work! And thanks for the explanations :)

I've applied a modified version of this patch (attached)
to Win32 ActivePerl 5.10 (build 1002) with Apache/2.2.8;
there's some problems with the t/perl/ithreads*.t tests,
which I'll look at more carefully, but all the filter
tests now pass.

The changes I made to your original patch are:
- change the name of mp_code_attrs to modperl_code_attrs,
as the modperl_ prefix is used for the other functions
that go into mod_perl.so
- add modperl_code_attrs to ModPerl::FunctionTable,
so that it's added to modperl.def (Win32 needs this
to include the functions in mod_perl.so)
- add a (CV*) cast in MP_CODE_ATTRS in src/modules/perl/mod_perl.h, to avoid a warning
when compiling Apache2::Filter

--
best regards,
Randy
Index: src/modules/perl/mod_perl.h
===================================================================
--- src/modules/perl/mod_perl.h (revision 615116)
+++ src/modules/perl/mod_perl.h (working copy)
@@ -141,7 +141,8 @@
 /* betting on Perl*Handlers not using CvXSUBANY
  * mod_perl reuses this field for handler attributes
  */
-#define MP_CODE_ATTRS(cv) (CvXSUBANY((CV*)cv).any_i32)
+U16 *modperl_code_attrs(pTHX_ CV *cv);
+#define MP_CODE_ATTRS(cv) (*modperl_code_attrs(aTHX_ (CV*)cv))
 
 #define MgTypeExt(mg) (mg->mg_type == '~')
 
Index: src/modules/perl/modperl_mgv.c
===================================================================
--- src/modules/perl/modperl_mgv.c      (revision 615116)
+++ src/modules/perl/modperl_mgv.c      (working copy)
@@ -271,7 +271,7 @@
     }
     else {
         if ((cv = get_cv(name, FALSE))) {
-            handler->attrs = (U32)MP_CODE_ATTRS(cv);
+            handler->attrs = MP_CODE_ATTRS(cv);
             handler->mgv_cv =
                 modperl_mgv_compile(aTHX_ p, HvNAME(GvSTASH(CvGV(cv))));
             modperl_mgv_append(aTHX_ p, handler->mgv_cv, GvNAME(CvGV(cv)));
@@ -334,7 +334,7 @@
             modperl_mgv_new_name(handler->mgv_obj, p, name);
         }
 
-        handler->attrs = (U32)MP_CODE_ATTRS(cv);
+        handler->attrs = MP_CODE_ATTRS(cv);
         /* note: this is the real function after @ISA lookup */
         handler->mgv_cv = modperl_mgv_compile(aTHX_ p, HvNAME(GvSTASH(gv)));
         modperl_mgv_append(aTHX_ p, handler->mgv_cv, handler_name);
Index: src/modules/perl/modperl_types.h
===================================================================
--- src/modules/perl/modperl_types.h    (revision 615116)
+++ src/modules/perl/modperl_types.h    (working copy)
@@ -195,7 +195,7 @@
     const char *name;
     CV *cv;
     U8 flags;
-    U32 attrs;
+    U16 attrs;
     modperl_handler_t *next;
 };
 
Index: src/modules/perl/modperl_util.c
===================================================================
--- src/modules/perl/modperl_util.c     (revision 615116)
+++ src/modules/perl/modperl_util.c     (working copy)
@@ -899,3 +899,14 @@
     }
     return newRV_inc((SV *)*pnotes);
 }
+
+U16 *modperl_code_attrs(pTHX_ CV *cv) {
+    MAGIC *mg;    
+
+    if (!SvMAGICAL(cv)) {
+       sv_magic((SV*)cv, Nullsv, PERL_MAGIC_ext, NULL, -1); 
+    }
+
+    mg = mg_find((SV*)cv, PERL_MAGIC_ext);
+    return &(mg->mg_private);
+}
Index: xs/Apache2/Filter/Apache2__Filter.h
===================================================================
--- xs/Apache2/Filter/Apache2__Filter.h (revision 615112)
+++ xs/Apache2/Filter/Apache2__Filter.h (working copy)
@@ -86,9 +86,9 @@
     return len;
 }
 
-static MP_INLINE U32 *modperl_filter_attributes(SV *package, SV *cvrv)
+static MP_INLINE U16 *modperl_filter_attributes(pTHX_ SV *package, SV *cvrv)
 {
-    return (U32 *)&MP_CODE_ATTRS(SvRV(cvrv));
+    return &MP_CODE_ATTRS(SvRV(cvrv));
 }
 
 #ifdef MP_TRACE
@@ -118,7 +118,7 @@
 MP_STATIC XS(MPXS_modperl_filter_attributes)
 {
     dXSARGS;
-    U32 *attrs = modperl_filter_attributes(ST(0), ST(1));
+    U16 *attrs = modperl_filter_attributes(aTHX_ ST(0), ST(1));
     I32 i;
 #ifdef MP_TRACE
     HV *stash = gv_stashsv(ST(0), TRUE);
Index: xs/tables/current/ModPerl/FunctionTable.pm
===================================================================
--- xs/tables/current/ModPerl/FunctionTable.pm  (revision 615431)
+++ xs/tables/current/ModPerl/FunctionTable.pm  (working copy)
@@ -1239,6 +1239,20 @@
     ]
   },
   {
+    'return_type' => 'U16 *',
+    'name' => 'modperl_code_attrs',
+    'args' => [
+      {
+        'type' => 'PerlInterpreter *',
+        'name' => 'my_perl'
+      },
+      {
+        'type' => 'CV *',
+        'name' => 'cv'
+      }
+    ]
+  },
+  {
     'return_type' => 'int',
     'name' => 'modperl_config_apply_PerlModule',
     'args' => [
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to