X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=Upper.xs;h=702481594747b6e41c6753b5f9304e1fecae3cf7;hb=089138101b5dada28467146e2d948ba041bf97d7;hp=bb4300de7e24ce302efce94a317d291d7c5d05d6;hpb=219fcff6c09b18b379da5f2d173b0a7755f83d9a;p=perl%2Fmodules%2FScope-Upper.git diff --git a/Upper.xs b/Upper.xs index bb4300d..7024815 100644 --- a/Upper.xs +++ b/Upper.xs @@ -1001,9 +1001,26 @@ static void su_pop(pTHX_ void *ud) { ud, 24, ' ', mark, base)); if (base < mark) { +#if SU_HAS_PERL(5, 19, 4) + I32 save = -1; + PERL_CONTEXT *cx; +#endif + SU_D(PerlIO_printf(Perl_debug_log, "%p: clear leftovers\n", ud)); + +#if SU_HAS_PERL(5, 19, 4) + cx = cxstack + cxstack_ix; + if (CxTYPE(cx) == CXt_SUB) + save = PL_scopestack[cx->blk_oldscopesp - 1]; +#endif + PL_savestack_ix = mark; leave_scope(base); + +#if SU_HAS_PERL(5, 19, 4) + if (CxTYPE(cx) == CXt_SUB) + PL_scopestack[cx->blk_oldscopesp - 1] = save; +#endif } PL_savestack_ix = base; @@ -1381,6 +1398,8 @@ static su_uplevel_ud *su_uplevel_storage_new(pTHX_ I32 cxix) { return sud; } +#if SU_HAS_PERL(5, 13, 7) + static void su_uplevel_storage_delete(pTHX_ su_uplevel_ud *sud) { #define su_uplevel_storage_delete(S) su_uplevel_storage_delete(aTHX_ (S)) dMY_CXT; @@ -1408,6 +1427,8 @@ static void su_uplevel_storage_delete(pTHX_ su_uplevel_ud *sud) { } } +#endif + static int su_uplevel_goto_static(const OP *o) { for (; o; o = OpSIBLING(o)) { /* goto ops are unops with kids. */ @@ -2211,6 +2232,13 @@ static void su_global_teardown(pTHX_ void *root) { return; #endif + SU_LOCK(&su_uid_seq_counter_mutex); + PerlMemShared_free(su_uid_seq_counter.seqs); + su_uid_seq_counter.size = 0; + SU_UNLOCK(&su_uid_seq_counter_mutex); + + MUTEX_DESTROY(&su_uid_seq_counter_mutex); + su_initialized = 0; return; @@ -2235,8 +2263,10 @@ static void su_global_setup(pTHX_ SU_XS_FILE_TYPE *file) { MUTEX_INIT(&su_uid_seq_counter_mutex); + SU_LOCK(&su_uid_seq_counter_mutex); su_uid_seq_counter.seqs = NULL; su_uid_seq_counter.size = 0; + SU_UNLOCK(&su_uid_seq_counter_mutex); stash = gv_stashpv(__PACKAGE__, 1); newCONSTSUB(stash, "TOP", newSViv(0));