From: Vincent Pit Date: Sun, 11 Jan 2009 17:36:13 +0000 (+0100) Subject: Context initialization overhaul X-Git-Tag: v0.04~4 X-Git-Url: http://git.vpit.fr/?a=commitdiff_plain;h=700ce600c7f40f6889a4b11f21fe45eff6040335;p=perl%2Fmodules%2FScope-Upper.git Context initialization overhaul --- diff --git a/Upper.xs b/Upper.xs index 6a0b35e..aad6980 100644 --- a/Upper.xs +++ b/Upper.xs @@ -565,29 +565,36 @@ STATIC void su_unwind(pTHX_ void *ud_) { /* --- XS ------------------------------------------------------------------ */ -#define SU_GET_LEVEL(A) \ - if (items > A) { \ - SV *lsv = ST(A); \ - if (SvOK(lsv)) \ - level = SvIV(lsv); \ - if (level < 0) \ - XSRETURN(0); \ - } \ - if (level > cxstack_ix) \ - level = cxstack_ix; +#define SU_GET_LEVEL(A) \ + STMT_START { \ + if (items > A) { \ + SV *lsv = ST(A); \ + if (SvOK(lsv)) \ + level = SvIV(lsv); \ + if (level < 0) \ + XSRETURN(0); \ + } \ + if (level > cxstack_ix) \ + level = cxstack_ix; \ + } STMT_END + +#define SU_GET_CONTEXT(A, B) \ + STMT_START { \ + if (items > A) { \ + SV *lsv = ST(B); \ + if (SvOK(lsv)) \ + level = SvIV(lsv); \ + if (level < 0) \ + level = 0; \ + else if (level > cxix) \ + level = cxix; \ + } \ + } STMT_END #define SU_DOPOPTOCX(t) \ STMT_START { \ I32 i, cxix = cxstack_ix, level = 0; \ - if (items) { \ - SV *lsv = ST(0); \ - if (SvOK(lsv)) \ - level = SvIV(lsv); \ - if (level < 0) \ - level = 0; \ - else if (level > cxix) \ - level = cxix; \ - } \ + SU_GET_CONTEXT(0, 0); \ for (i = cxix - level; i >= 0; --i) { \ if (CxTYPE(&cxstack[i]) == t) { \ ST(0) = sv_2mortal(newSViv(cxix - i)); \ @@ -605,19 +612,13 @@ XS(XS_Scope__Upper_unwind) { #else dXSARGS; #endif - I32 level = 0, cxix = cxstack_ix; + I32 cxix = cxstack_ix, level = 0; su_ud_unwind *ud; + PERL_UNUSED_VAR(cv); /* -W */ PERL_UNUSED_VAR(ax); /* -Wall */ - if (items) { - SV *lsv = ST(items - 1); - if (SvOK(lsv)) - level = SvIV(lsv); - if (level < 0) - level = 0; - else if (level > cxix) - level = cxix; - } + + SU_GET_CONTEXT(0, items - 1); cxix -= level; do { PERL_CONTEXT *cx = cxstack + cxix; @@ -735,15 +736,7 @@ PROTOTYPE: ;$ PREINIT: I32 cxix = cxstack_ix, level = 0; PPCODE: - if (items) { - SV *lsv = ST(0); - if (SvOK(lsv)) - level = SvIV(lsv); - if (level < 0) - level = 0; - else if (level > cxix) - level = cxix; - } + SU_GET_CONTEXT(0, 0); cxix -= level; while (cxix > 0) { PERL_CONTEXT *cx = cxstack + cxix--;