Index: src/modules/perl/mod_perl.h =================================================================== --- src/modules/perl/mod_perl.h (revision 607690) +++ 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 *mp_code_attrs(pTHX_ CV *cv); +#define MP_CODE_ATTRS(cv) (*mp_code_attrs(aTHX_ cv)) #define MgTypeExt(mg) (mg->mg_type == '~') Index: src/modules/perl/modperl_mgv.c =================================================================== --- src/modules/perl/modperl_mgv.c (revision 607694) +++ 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 607690) +++ 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 607694) +++ src/modules/perl/modperl_util.c (working copy) Index: xs/Apache2/Filter/Apache2__Filter.h @@ -903,3 +903,13 @@ return retval ? SvREFCNT_inc(retval) : &PL_sv_undef; } +U16 *mp_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); +} =================================================================== --- xs/Apache2/Filter/Apache2__Filter.h (revision 607694) +++ 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);