Stas Bekman <[EMAIL PROTECTED]> writes:
+static MP_INLINE SV *mpxs_APR__Table_make(pTHX_ SV *p_sv, int nelts) +{ + apr_pool_t *p = mp_xs_sv2_APR__Pool(p_sv); + apr_table_t *t = apr_table_make(p, nelts); + SV *t_sv = modperl_hash_tie(aTHX_ "APR::Table", Nullsv, t); + sv_magic(SvRV(t_sv), p_sv, PERL_MAGIC_ext, Nullch, -1); + return t_sv; +}
And that just happened to work, since it wasn't 5.8.x+
sv_magic(SvRV(t_sv), p_sv, PERL_MAGIC_ext, Nullch, -1);
can't be used since it's already used by:
MP_INLINE SV *modperl_hash_tie(pTHX_ [...]
/* Prefetch magic requires perl 5.8 */ #if ((PERL_REVISION == 5) && (PERL_VERSION >= 8))
sv_magic(hv, NULL, PERL_MAGIC_ext, Nullch, -1); SvMAGIC(hv)->mg_virtual = (MGVTBL *)&modperl_table_magic_prefetch; SvMAGIC(hv)->mg_flags |= MGf_COPY;
#endif /* End of prefetch magic */
sv_magic(hv, rsv, PERL_MAGIC_tied, Nullch, 0);
so it happened to worked before I guess because I was testing with 5.6.x,
with 5.8.x, if I dump the table object it has only one _ext magic.
so we need to use some other magic to create this dependency.
You probably just need to use sv_magicext with 5.8.x, because
sv_magic doesn't seem to permit duplicates. The only issue
then is ordering: you want the mpxs_APR__Table_make one further down the SvMAGIC chain than the modperl_hash_tie one.
joe++, it works. but man, talking about automating this kind of wrappers... here is the partial patch with tweaks suggested from Joe:
in fact the only reason modperl_hash_tie calls sv_magic is to assign some flags, may be it can be eliminated completely. I haven't looked at the other places where it is used. Why do you think the order matters, if it doesn't really use that magic via mg_find.
Index: src/modules/perl/modperl_common_util.c
===================================================================
--- src/modules/perl/modperl_common_util.c (revision 122696)
+++ src/modules/perl/modperl_common_util.c (working copy)
@@ -69,7 +69,7 @@
/* Prefetch magic requires perl 5.8 */
#if ((PERL_REVISION == 5) && (PERL_VERSION >= 8))- sv_magic(hv, NULL, PERL_MAGIC_ext, Nullch, -1);
+ sv_magicext(hv, NULL, PERL_MAGIC_ext, NULL, Nullch, -1);
SvMAGIC(hv)->mg_virtual = (MGVTBL *)&modperl_table_magic_prefetch;
SvMAGIC(hv)->mg_flags |= MGf_COPY;Index: xs/APR/Table/APR__Table.h =================================================================== --- xs/APR/Table/APR__Table.h (revision 122696) +++ xs/APR/Table/APR__Table.h (working copy) @@ -17,6 +17,22 @@ #define mpxs_APR__Table_DELETE apr_table_unset #define mpxs_APR__Table_CLEAR apr_table_clear
+static MP_INLINE SV *mpxs_APR__Table_make(pTHX_ SV *p_sv, int nelts)
+{
+ apr_pool_t *p = mp_xs_sv2_APR__Pool(p_sv);
+ apr_table_t *t = apr_table_make(p, nelts);
+ SV *t_sv = modperl_hash_tie(aTHX_ "APR::Table", Nullsv, t);
+ sv_dump(SvRV(p_sv));
+ /* XXX: this seems to be ignored by perl 5.8.x+, since
+ * modperl_hash_tie already attached another _ext magic */
+#if ((PERL_REVISION == 5) && (PERL_VERSION >= 8))
+ sv_magicext(SvRV(t_sv), p_sv, PERL_MAGIC_ext, NULL, Nullch, -1);
+#else
+ sv_magic(SvRV(t_sv), p_sv, PERL_MAGIC_ext, Nullch, -1);
+#endif
+ return t_sv;
+}
+
typedef struct {
SV *cv;
apr_hash_t *filter;-- __________________________________________________________________ Stas Bekman JAm_pH ------> Just Another mod_perl Hacker http://stason.org/ mod_perl Guide ---> http://perl.apache.org mailto:[EMAIL PROTECTED] http://use.perl.org http://apacheweek.com http://modperlbook.org http://apache.org http://ticketmaster.com
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
