X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=Upper.xs;h=95a22ed74520b2f521fc871b075b60b7ba4489e5;hb=0a7ed27cbdbb90c176fc6be11c48e70776c8df84;hp=cba5d3d048b81e46ad212c51ae6714df5e89d2e5;hpb=b608ef9d319ec77f82c32837676ab68cc2e6b4cc;p=perl%2Fmodules%2FScope-Upper.git diff --git a/Upper.xs b/Upper.xs index cba5d3d..95a22ed 100644 --- a/Upper.xs +++ b/Upper.xs @@ -278,7 +278,9 @@ typedef struct { STATIC void su_call(pTHX_ void *ud_) { su_ud_reap *ud = (su_ud_reap *) ud_; #if SU_HAS_PERL(5, 10, 0) + PERL_CONTEXT saved_cx; I32 dieing = PL_op->op_type == OP_DIE; + I32 cxix; #endif dSP; @@ -297,20 +299,20 @@ STATIC void su_call(pTHX_ void *ud_) { #if SU_HAS_PERL(5, 10, 0) if (dieing) { if (cxstack_ix < cxstack_max) - ++cxstack_ix; + cxix = cxstack_ix + 1; else - cxstack_ix = Perl_cxinc(aTHX); + cxix = Perl_cxinc(aTHX); + saved_cx = cxstack[cxix]; } #endif call_sv(ud->cb, G_VOID); #if SU_HAS_PERL(5, 10, 0) - if (dieing && cxstack_ix > 0) - --cxstack_ix; + if (dieing) + cxstack[cxix] = saved_cx; #endif - SPAGAIN; PUTBACK; FREETMPS; @@ -351,11 +353,9 @@ STATIC void su_localize(pTHX_ void *ud_) { if (SvTYPE(sv) >= SVt_PVGV) { gv = (GV *) sv; - if (!val) { /* local *x; */ + if (!val || !SvROK(val)) { /* local *x; or local *x = $val; */ t = SVt_PVGV; - } else if (!SvROK(val)) { /* local *x = $val; */ - goto assign; - } else { /* local *x = \$val; */ + } else { /* local *x = \$val; */ t = SvTYPE(SvRV(val)); deref = 1; } @@ -430,7 +430,6 @@ STATIC void su_localize(pTHX_ void *ud_) { ud, PL_savestack_ix, PL_scopestack[PL_scopestack_ix])); -assign: if (val) SvSetMagicSV((SV *) gv, val); @@ -641,13 +640,15 @@ STATIC void su_unwind(pTHX_ void *ud_) { STMT_START { \ if (items > A) { \ SV *csv = ST(B); \ - if (SvOK(csv)) \ - cxix = SvIV(csv); \ + if (!SvOK(csv)) \ + goto default_cx; \ + cxix = SvIV(csv); \ if (cxix < 0) \ cxix = 0; \ else if (cxix > cxstack_ix) \ cxix = cxstack_ix; \ } else { \ +default_cx: \ cxix = cxstack_ix; \ if (PL_DBsub) \ SU_SKIP_DB(cxix); \ @@ -656,14 +657,15 @@ STATIC void su_unwind(pTHX_ void *ud_) { #define SU_GET_LEVEL(A, B) \ STMT_START { \ + level = 0; \ if (items > 0) { \ SV *lsv = ST(B); \ - if (SvOK(lsv)) \ + if (SvOK(lsv)) { \ level = SvIV(lsv); \ - if (level < 0) \ - level = 0; \ - } else \ - level = 0; \ + if (level < 0) \ + level = 0; \ + } \ + } \ } STMT_END XS(XS_Scope__Upper_unwind); /* prototype to pass -Wmissing-prototypes */ @@ -718,7 +720,8 @@ BOOT: HV *stash; MY_CXT_INIT; stash = gv_stashpv(__PACKAGE__, 1); - newCONSTSUB(stash, "TOP", newSViv(0)); + newCONSTSUB(stash, "TOP", newSViv(0)); + newCONSTSUB(stash, "SU_THREADSAFE", newSVuv(SU_THREADSAFE)); newXSproto("Scope::Upper::unwind", XS_Scope__Upper_unwind, file, NULL); } @@ -729,7 +732,9 @@ CLONE(...) PROTOTYPE: DISABLE CODE: PERL_UNUSED_VAR(items); - MY_CXT_CLONE; + { + MY_CXT_CLONE; + } #endif /* SU_THREADSAFE */