Author: gozer Date: Mon Jan 28 00:01:57 2008 New Revision: 615751 URL: http://svn.apache.org/viewvc?rev=615751&view=rev Log: Fix erratic behaviour when filters were used with Perl 5.10.
Get rid of MP_CODE_ATTRS and re-implement it as modperl_code_attrs(aTHX_ CV *cv) relying on magic instead of some obscure CV field CvXSUBANY we were piggybacking, and hoping nobody was using (It was used in perl 5.10) Modified: perl/modperl/trunk/Changes perl/modperl/trunk/src/modules/perl/mod_perl.h perl/modperl/trunk/src/modules/perl/modperl_mgv.c 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/xs/Apache2/Filter/Apache2__Filter.h perl/modperl/trunk/xs/tables/current/ModPerl/FunctionTable.pm Modified: perl/modperl/trunk/Changes URL: http://svn.apache.org/viewvc/perl/modperl/trunk/Changes?rev=615751&r1=615750&r2=615751&view=diff ============================================================================== --- perl/modperl/trunk/Changes (original) +++ perl/modperl/trunk/Changes Mon Jan 28 00:01:57 2008 @@ -12,6 +12,9 @@ =item 2.0.4-dev +Fix erratic behaviour when filters were used with Perl 5.10 +[Gozer] + Fix problems with redefinitions of perl_free as free and perl_malloc as malloc on Win32, as described at http://marc.info/?l=apache-modperl&m=119896407510526&w=2 Modified: perl/modperl/trunk/src/modules/perl/mod_perl.h URL: http://svn.apache.org/viewvc/perl/modperl/trunk/src/modules/perl/mod_perl.h?rev=615751&r1=615750&r2=615751&view=diff ============================================================================== --- perl/modperl/trunk/src/modules/perl/mod_perl.h (original) +++ perl/modperl/trunk/src/modules/perl/mod_perl.h Mon Jan 28 00:01:57 2008 @@ -138,11 +138,6 @@ int modperl_response_handler(request_rec *r); int modperl_response_handler_cgi(request_rec *r); -/* 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) - #define MgTypeExt(mg) (mg->mg_type == '~') typedef void MP_FUNC_NONSTD_T(modperl_var_modify_t) (apr_table_t *, Modified: perl/modperl/trunk/src/modules/perl/modperl_mgv.c URL: http://svn.apache.org/viewvc/perl/modperl/trunk/src/modules/perl/modperl_mgv.c?rev=615751&r1=615750&r2=615751&view=diff ============================================================================== --- perl/modperl/trunk/src/modules/perl/modperl_mgv.c (original) +++ perl/modperl/trunk/src/modules/perl/modperl_mgv.c Mon Jan 28 00:01:57 2008 @@ -271,7 +271,7 @@ } else { if ((cv = get_cv(name, FALSE))) { - handler->attrs = (U32)MP_CODE_ATTRS(cv); + handler->attrs = *modperl_code_attrs(aTHX_ 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 = *modperl_code_attrs(aTHX_ 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); Modified: perl/modperl/trunk/src/modules/perl/modperl_types.h URL: http://svn.apache.org/viewvc/perl/modperl/trunk/src/modules/perl/modperl_types.h?rev=615751&r1=615750&r2=615751&view=diff ============================================================================== --- perl/modperl/trunk/src/modules/perl/modperl_types.h (original) +++ perl/modperl/trunk/src/modules/perl/modperl_types.h Mon Jan 28 00:01:57 2008 @@ -195,7 +195,7 @@ const char *name; CV *cv; U8 flags; - U32 attrs; + U16 attrs; modperl_handler_t *next; }; Modified: perl/modperl/trunk/src/modules/perl/modperl_util.c URL: http://svn.apache.org/viewvc/perl/modperl/trunk/src/modules/perl/modperl_util.c?rev=615751&r1=615750&r2=615751&view=diff ============================================================================== --- perl/modperl/trunk/src/modules/perl/modperl_util.c (original) +++ perl/modperl/trunk/src/modules/perl/modperl_util.c Mon Jan 28 00:01:57 2008 @@ -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); +} Modified: perl/modperl/trunk/src/modules/perl/modperl_util.h URL: http://svn.apache.org/viewvc/perl/modperl/trunk/src/modules/perl/modperl_util.h?rev=615751&r1=615750&r2=615751&view=diff ============================================================================== --- perl/modperl/trunk/src/modules/perl/modperl_util.h (original) +++ perl/modperl/trunk/src/modules/perl/modperl_util.h Mon Jan 28 00:01:57 2008 @@ -149,4 +149,6 @@ SV *modperl_pnotes(pTHX_ HV **pnotes, SV *key, SV *val, request_rec *r, conn_rec *c); +U16 *modperl_code_attrs(pTHX_ CV *cv); + #endif /* MODPERL_UTIL_H */ Modified: perl/modperl/trunk/xs/Apache2/Filter/Apache2__Filter.h URL: http://svn.apache.org/viewvc/perl/modperl/trunk/xs/Apache2/Filter/Apache2__Filter.h?rev=615751&r1=615750&r2=615751&view=diff ============================================================================== --- perl/modperl/trunk/xs/Apache2/Filter/Apache2__Filter.h (original) +++ perl/modperl/trunk/xs/Apache2/Filter/Apache2__Filter.h Mon Jan 28 00:01:57 2008 @@ -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 modperl_code_attrs(aTHX_ (CV*)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); Modified: perl/modperl/trunk/xs/tables/current/ModPerl/FunctionTable.pm URL: http://svn.apache.org/viewvc/perl/modperl/trunk/xs/tables/current/ModPerl/FunctionTable.pm?rev=615751&r1=615750&r2=615751&view=diff ============================================================================== --- perl/modperl/trunk/xs/tables/current/ModPerl/FunctionTable.pm (original) +++ perl/modperl/trunk/xs/tables/current/ModPerl/FunctionTable.pm Mon Jan 28 00:01:57 2008 @@ -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' => [