X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=Types.xs;h=0a13cdb88caf7c94517d61d6188349c1e15a604c;hb=c09d4ed8764e8dcbcf9948d6dfd6ca03874439e2;hp=7f653838b11f09c6e98bbf204cef274ab464437a;hpb=103bcf77697abc23bcb4f82a6c43025856eef980;p=perl%2Fmodules%2FLexical-Types.git diff --git a/Types.xs b/Types.xs index 7f65383..0a13cdb 100644 --- a/Types.xs +++ b/Types.xs @@ -39,12 +39,18 @@ # define SvREFCNT_inc_simple_NN SvREFCNT_inc #endif -#ifndef ENTER_with_name -# define ENTER_with_name(N) ENTER +#undef ENTERn +#if defined(ENTER_with_name) && !LT_HAS_PERL(5, 11, 4) +# define ENTERn(N) ENTER_with_name(N) +#else +# define ENTERn(N) ENTER #endif -#ifndef LEAVE_with_name -# define LEAVE_with_name(N) LEAVE +#undef LEAVEn +#if defined(LEAVE_with_name) && !LT_HAS_PERL(5, 11, 4) +# define LEAVEn(N) LEAVE_with_name(N) +#else +# define LEAVEn(N) LEAVE #endif /* ... Thread safety and multiplicity ...................................... */ @@ -350,10 +356,10 @@ typedef struct { SV *type_pkg; SV *type_meth; #endif /* !MULTIPLICITY */ - OP *(*pp_padsv)(pTHX); + OP *(*old_pp_padsv)(pTHX); } lt_op_info; -STATIC void lt_map_store(pTHX_ const OP *o, SV *orig_pkg, SV *type_pkg, SV *type_meth, OP *(*pp_padsv)(pTHX)) { +STATIC void lt_map_store(pTHX_ const OP *o, SV *orig_pkg, SV *type_pkg, SV *type_meth, OP *(*old_pp_padsv)(pTHX)) { #define lt_map_store(O, OP, TP, TM, PP) lt_map_store(aTHX_ (O), (OP), (TP), (TM), (PP)) lt_op_info *oi; @@ -406,7 +412,7 @@ STATIC void lt_map_store(pTHX_ const OP *o, SV *orig_pkg, SV *type_pkg, SV *type oi->type_meth = type_meth; #endif /* !MULTIPLICITY */ - oi->pp_padsv = pp_padsv; + oi->old_pp_padsv = old_pp_padsv; #ifdef USE_ITHREADS MUTEX_UNLOCK(<_op_map_mutex); @@ -509,7 +515,7 @@ STATIC OP *lt_pp_padsv(pTHX) { LEAVE; } - return CALL_FPTR(oi.pp_padsv)(aTHX); + return CALL_FPTR(oi.old_pp_padsv)(aTHX); } return CALL_FPTR(PL_ppaddr[OP_PADSV])(aTHX); @@ -587,6 +593,8 @@ STATIC OP *lt_ck_padany(pTHX_ OP *o) { croak(__PACKAGE__ " mangler should return zero, one or two scalars, but got %d", items); if (items == 0) { SvREFCNT_dec(orig_pkg); + FREETMPS; + LEAVE; goto skip; } else { SV *rsv; @@ -667,19 +675,21 @@ STATIC void lt_teardown(pTHX_ void *root) { lt_initialized = 0; } -STATIC lt_setup(pTHX) { +STATIC void lt_setup(pTHX) { #define lt_setup() lt_setup(aTHX) if (lt_initialized) return; - MY_CXT_INIT; + { + MY_CXT_INIT; #if LT_THREADSAFE - MY_CXT.tbl = ptable_new(); - MY_CXT.owner = aTHX; + MY_CXT.tbl = ptable_new(); + MY_CXT.owner = aTHX; #endif - MY_CXT.pp_padsv_saved = 0; - MY_CXT.default_meth = newSVpvn("TYPEDSCALAR", 11); - SvREADONLY_on(MY_CXT.default_meth); + MY_CXT.pp_padsv_saved = 0; + MY_CXT.default_meth = newSVpvn("TYPEDSCALAR", 11); + SvREADONLY_on(MY_CXT.default_meth); + } lt_old_ck_padany = PL_check[OP_PADANY]; PL_check[OP_PADANY] = MEMBER_TO_FPTR(lt_ck_padany); @@ -703,8 +713,8 @@ MODULE = Lexical::Types PACKAGE = Lexical::Types PROTOTYPES: ENABLE -BOOT: -{ +BOOT: +{ if (!lt_booted++) { HV *stash; @@ -731,7 +741,7 @@ PREINIT: ptable *t; int *level; SV *cloned_default_meth; -CODE: +PPCODE: { my_cxt_t ud; dMY_CXT; @@ -750,10 +760,11 @@ CODE: { level = PerlMemShared_malloc(sizeof *level); *level = 1; - LEAVE_with_name("sub"); + LEAVEn("sub"); SAVEDESTRUCTOR_X(lt_thread_cleanup, level); - ENTER_with_name("sub"); + ENTERn("sub"); } + XSRETURN(0); #endif