From: Vincent Pit Date: Fri, 31 Dec 2010 17:12:38 +0000 (+0100) Subject: Use the new CLONE_PARAMS API with perl 5.13.2 X-Git-Tag: v0.10~16 X-Git-Url: http://git.vpit.fr/?p=perl%2Fmodules%2FLexical-Types.git;a=commitdiff_plain;h=b4cd1e777ea16a620c3709bbf732add1814d495c Use the new CLONE_PARAMS API with perl 5.13.2 --- diff --git a/Types.xs b/Types.xs index 6187866..56b676c 100644 --- a/Types.xs +++ b/Types.xs @@ -152,50 +152,47 @@ START_MY_CXT #if LT_THREADSAFE -STATIC SV *lt_clone(pTHX_ SV *sv, tTHX owner) { -#define lt_clone(S, O) lt_clone(aTHX_ (S), (O)) - CLONE_PARAMS param; - AV *stashes = NULL; - SV *dupsv; - - if (SvTYPE(sv) == SVt_PVHV && HvNAME_get(sv)) - stashes = newAV(); - - param.stashes = stashes; - param.flags = 0; - param.proto_perl = owner; - - dupsv = sv_dup(sv, ¶m); - - if (stashes) { - av_undef(stashes); - SvREFCNT_dec(stashes); - } - - return SvREFCNT_inc(dupsv); -} +typedef struct { + ptable *tbl; +#if LT_HAS_PERL(5, 13, 2) + CLONE_PARAMS *params; +#else + CLONE_PARAMS params; +#endif +} lt_ptable_clone_ud; + +#if LT_HAS_PERL(5, 13, 2) +# define lt_ptable_clone_ud_init(U, T, O) \ + (U).tbl = (T); \ + (U).params = Perl_clone_params_new((O), aTHX) +# define lt_ptable_clone_ud_deinit(U) Perl_clone_params_del((U).params) +# define lt_dup_inc(S, U) SvREFCNT_inc(sv_dup((S), (U)->params)) +#else +# define lt_ptable_clone_ud_init(U, T, O) \ + (U).tbl = (T); \ + (U).params.stashes = newAV(); \ + (U).params.flags = 0; \ + (U).params.proto_perl = (O) +# define lt_ptable_clone_ud_deinit(U) SvREFCNT_dec((U).params.stashes) +# define lt_dup_inc(S, U) SvREFCNT_inc(sv_dup((S), &((U)->params))) +#endif -STATIC void lt_ptable_hints_clone(pTHX_ ptable_ent *ent, void *ud_) { - my_cxt_t *ud = ud_; +STATIC void lt_ptable_clone(pTHX_ ptable_ent *ent, void *ud_) { + lt_ptable_clone_ud *ud = ud_; lt_hint_t *h1 = ent->val; lt_hint_t *h2; - if (ud->owner == aTHX) - return; - #if LT_HINT_STRUCT - h2 = PerlMemShared_malloc(sizeof *h2); - h2->code = lt_clone(h1->code, ud->owner); - SvREFCNT_inc(h2->code); + h2 = PerlMemShared_malloc(sizeof *h2); + h2->code = lt_dup_inc(h1->code, ud); #if LT_WORKAROUND_REQUIRE_PROPAGATION - h2->require_tag = PTR2IV(lt_clone(INT2PTR(SV *, h1->require_tag), ud->owner)); + h2->require_tag = PTR2IV(lt_dup_inc(INT2PTR(SV *, h1->require_tag), ud)); #endif #else /* LT_HINT_STRUCT */ - h2 = lt_clone(h1, ud->owner); - SvREFCNT_inc(h2); + h2 = lt_dup_inc(h1, ud); #endif /* !LT_HINT_STRUCT */ @@ -745,12 +742,14 @@ PREINIT: SV *cloned_default_meth; PPCODE: { - my_cxt_t ud; + lt_ptable_clone_ud ud; dMY_CXT; - ud.tbl = t = ptable_new(); - ud.owner = MY_CXT.owner; - ptable_walk(MY_CXT.tbl, lt_ptable_hints_clone, &ud); - cloned_default_meth = lt_clone(MY_CXT.default_meth, MY_CXT.owner); + + t = ptable_new(); + lt_ptable_clone_ud_init(ud, t, MY_CXT.owner); + ptable_walk(MY_CXT.tbl, lt_ptable_clone, &ud); + cloned_default_meth = lt_dup_inc(MY_CXT.default_meth, &ud); + lt_ptable_clone_ud_deinit(ud); } { MY_CXT_CLONE;