X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=Types.xs;h=9c02bd8a434caf16346b08e3edfb0dfa6c6cc064;hb=c5d3b9e2115202f79337d1fcfe44ae673c2d9251;hp=8367cba9949c64a39938be2d0c7a47e5a8ec98c2;hpb=67165b7d215ffac8a1c56642fbffbf2715b9e6d1;p=perl%2Fmodules%2FLexical-Types.git diff --git a/Types.xs b/Types.xs index 8367cba..9c02bd8 100644 --- a/Types.xs +++ b/Types.xs @@ -39,8 +39,8 @@ # define HvNAMELEN_get(H) strlen(HvNAME_get(H)) #endif -#ifndef SvREFCNT_inc_simple_NN -# define SvREFCNT_inc_simple_NN SvREFCNT_inc +#ifndef SvREFCNT_inc_simple_void_NN +# define SvREFCNT_inc_simple_void_NN(S) ((void) SvREFCNT_inc(S)) #endif /* ... Thread safety and multiplicity ...................................... */ @@ -145,8 +145,6 @@ typedef SV lt_hint_t; /* ... "Seen" pointer table ................................................ */ -#if !LT_HAS_RPEEP - #define PTABLE_NAME ptable_seen #define PTABLE_VAL_FREE(V) NOOP @@ -157,8 +155,6 @@ typedef SV lt_hint_t; #define ptable_seen_clear(T) ptable_seen_clear(aPTBLMS_ (T)) #define ptable_seen_free(T) ptable_seen_free(aPTBLMS_ (T)) -#endif /* !LT_HAS_RPEEP */ - /* ... Global data ......................................................... */ #define MY_CXT_KEY __PACKAGE__ "::_guts" XS_VERSION @@ -168,9 +164,7 @@ typedef struct { ptable *tbl; /* It really is a ptable_hints */ tTHX owner; #endif -#if !LT_HAS_RPEEP ptable *seen; /* It really is a ptable_seen */ -#endif SV *default_meth; } my_cxt_t; @@ -233,9 +227,7 @@ STATIC void lt_thread_cleanup(pTHX_ void *ud) { dMY_CXT; ptable_hints_free(MY_CXT.tbl); -#if !LT_HAS_RPEEP ptable_seen_free(MY_CXT.seen); -#endif /* !LT_HAS_RPEEP */ } #endif /* LT_THREADSAFE */ @@ -299,7 +291,7 @@ STATIC SV *lt_tag(pTHX_ SV *value) { value = SvRV(value); if (SvTYPE(value) >= SVt_PVCV) { code = value; - SvREFCNT_inc_simple_NN(code); + SvREFCNT_inc_simple_void_NN(code); } } @@ -362,7 +354,7 @@ STATIC SV *lt_hint(pTHX) { 0, lt_hash); #else - SV **val = hv_fetch(GvHV(PL_hintgv), __PACKAGE__, __PACKAGE_LEN__, lt_hash); + SV **val = hv_fetch(GvHV(PL_hintgv), __PACKAGE__, __PACKAGE_LEN__, 0); if (!val) return 0; hint = *val; @@ -624,12 +616,12 @@ STATIC OP *lt_ck_padany(pTHX_ OP *o) { if (!type_pkg) { type_pkg = orig_pkg; - SvREFCNT_inc(orig_pkg); + SvREFCNT_inc_simple_void_NN(orig_pkg); } if (!type_meth) { type_meth = orig_meth; - SvREFCNT_inc(orig_meth); + SvREFCNT_inc_simple_void_NN(orig_meth); } lt_map_store(o, orig_pkg, type_pkg, type_meth, o->op_ppaddr); @@ -653,31 +645,15 @@ STATIC OP *lt_ck_padsv(pTHX_ OP *o) { STATIC peep_t lt_old_peep = 0; /* This is actually the rpeep past 5.13.5 */ -#if !LT_HAS_RPEEP -# define LT_PEEP_REC_PROTO STATIC void lt_peep_rec(pTHX_ OP *o, ptable *seen) -#else /* !LT_HAS_RPEEP */ -# define LT_PEEP_REC_PROTO STATIC void lt_peep_rec(pTHX_ OP *o) -#endif /* LT_HAS_RPEEP */ - -LT_PEEP_REC_PROTO; -LT_PEEP_REC_PROTO { -#if !LT_HAS_RPEEP -# define lt_peep_rec(O) lt_peep_rec(aTHX_ (O), seen) -#else /* !LT_HAS_RPEEP */ -# define lt_peep_rec(O) lt_peep_rec(aTHX_ (O)) -#endif /* LT_HAS_RPEEP */ - -#if !LT_HAS_RPEEP - if (ptable_fetch(seen, o)) - return; -#endif - +STATIC void lt_peep_rec(pTHX_ OP *o, ptable *seen) { +#define lt_peep_rec(O) lt_peep_rec(aTHX_ (O), seen) for (; o; o = o->op_next) { lt_op_info *oi = NULL; -#if !LT_HAS_RPEEP + if (ptable_fetch(seen, o)) + break; ptable_seen_store(seen, o, o); -#endif + switch (o->op_type) { case OP_PADSV: if (o->op_ppaddr != lt_pp_padsv && o->op_private & OPpLVAL_INTRO) { @@ -731,15 +707,14 @@ LT_PEEP_REC_PROTO { } STATIC void lt_peep(pTHX_ OP *o) { -#if !LT_HAS_RPEEP dMY_CXT; ptable *seen = MY_CXT.seen; - ptable_seen_clear(seen); -#endif /* !LT_HAS_RPEEP */ - lt_old_peep(aTHX_ o); + + ptable_seen_clear(seen); lt_peep_rec(o); + ptable_seen_clear(seen); } /* --- Interpreter setup/teardown ------------------------------------------ */ @@ -761,9 +736,7 @@ STATIC void lt_teardown(pTHX_ void *root) { #if LT_THREADSAFE ptable_hints_free(MY_CXT.tbl); #endif -#if !LT_HAS_RPEEP ptable_seen_free(MY_CXT.seen); -#endif SvREFCNT_dec(MY_CXT.default_meth); } @@ -793,9 +766,7 @@ STATIC void lt_setup(pTHX) { MY_CXT.tbl = ptable_new(); MY_CXT.owner = aTHX; #endif -#if !LT_HAS_RPEEP MY_CXT.seen = ptable_new(); -#endif MY_CXT.default_meth = newSVpvn("TYPEDSCALAR", 11); SvREADONLY_on(MY_CXT.default_meth); } @@ -857,9 +828,7 @@ CLONE(...) PROTOTYPE: DISABLE PREINIT: ptable *t; -#if !LT_HAS_RPEEP ptable *s; -#endif SV *cloned_default_meth; PPCODE: { @@ -873,17 +842,13 @@ PPCODE: cloned_default_meth = lt_dup_inc(MY_CXT.default_meth, &ud); lt_ptable_clone_ud_deinit(ud); } -#if !LT_HAS_RPEEP s = ptable_new(); -#endif } { MY_CXT_CLONE; MY_CXT.tbl = t; MY_CXT.owner = aTHX; -#if !LT_HAS_RPEEP MY_CXT.seen = s; -#endif MY_CXT.default_meth = cloned_default_meth; } reap(3, lt_thread_cleanup, NULL);