From: Vincent Pit Date: Thu, 13 Sep 2012 23:44:06 +0000 (+0200) Subject: Move PL_stack_sp/items adjustments from su_unwind/su_yield to XSubs X-Git-Tag: v0.20~7 X-Git-Url: http://git.vpit.fr/?p=perl%2Fmodules%2FScope-Upper.git;a=commitdiff_plain;h=aa287c017fc604bccef210250c7235b4e2e5a849 Move PL_stack_sp/items adjustments from su_unwind/su_yield to XSubs --- diff --git a/Upper.xs b/Upper.xs index b1d9a08..0d51f43 100644 --- a/Upper.xs +++ b/Upper.xs @@ -1071,23 +1071,17 @@ STATIC I32 su_init(pTHX_ void *ud, I32 cxix, I32 size) { STATIC void su_unwind(pTHX_ void *ud_) { dMY_CXT; - I32 cxix = MY_CXT.unwind_storage.cxix; - I32 items = MY_CXT.unwind_storage.items - 1; - SV **savesp = MY_CXT.unwind_storage.savesp; + I32 cxix = MY_CXT.unwind_storage.cxix; + I32 items = MY_CXT.unwind_storage.items; I32 mark; PERL_UNUSED_VAR(ud_); - if (savesp) - PL_stack_sp = savesp; + PL_stack_sp = MY_CXT.unwind_storage.savesp; if (cxstack_ix > cxix) dounwind(cxix); - /* Hide the level */ - if (items >= 0) - PL_stack_sp--; - mark = PL_markstack[cxstack[cxix].blk_oldmarksp]; *PL_markstack_ptr = PL_stack_sp - PL_stack_base - items; @@ -1126,17 +1120,13 @@ STATIC void su_yield(pTHX_ void *ud_) { dMY_CXT; PERL_CONTEXT *cx; I32 cxix = MY_CXT.yield_storage.cxix; - I32 items = MY_CXT.yield_storage.items - 1; - SV **savesp = MY_CXT.yield_storage.savesp; + I32 items = MY_CXT.yield_storage.items; opcode type = OP_NULL; U8 flags = 0; OP *next; PERL_UNUSED_VAR(ud_); - if (savesp) - PL_stack_sp = savesp; - cx = cxstack + cxix; switch (CxTYPE(cx)) { case CXt_BLOCK: { @@ -1260,15 +1250,11 @@ cxt_when: break; } + PL_stack_sp = MY_CXT.yield_storage.savesp; + if (cxstack_ix > cxix) dounwind(cxix); - /* Hide the level */ - if (items >= 0) - PL_stack_sp--; - else - items = 0; - /* Copy the arguments passed to yield() where the leave op expects to find * them. */ if (items) @@ -2203,17 +2189,18 @@ XS(XS_Scope__Upper_unwind) { continue; case CXt_EVAL: case CXt_FORMAT: - MY_CXT.unwind_storage.cxix = cxix; - MY_CXT.unwind_storage.items = items; + MY_CXT.unwind_storage.cxix = cxix; + MY_CXT.unwind_storage.items = items; + MY_CXT.unwind_storage.savesp = PL_stack_sp; + if (items > 0) { + MY_CXT.unwind_storage.items--; + MY_CXT.unwind_storage.savesp--; + } /* pp_entersub will want to sanitize the stack after returning from there - * Screw that, we're insane */ - if (GIMME_V == G_SCALAR) { - MY_CXT.unwind_storage.savesp = PL_stack_sp; - /* dXSARGS calls POPMARK, so we need to match PL_markstack_ptr[1] */ + * Screw that, we're insane! + * dXSARGS calls POPMARK, so we need to match PL_markstack_ptr[1] */ + if (GIMME_V == G_SCALAR) PL_stack_sp = PL_stack_base + PL_markstack_ptr[1] + 1; - } else { - MY_CXT.unwind_storage.savesp = NULL; - } SAVEDESTRUCTOR_X(su_unwind, NULL); return; default: @@ -2238,15 +2225,16 @@ XS(XS_Scope__Upper_yield) { PERL_UNUSED_VAR(ax); /* -Wall */ SU_GET_CONTEXT(0, items - 1, su_context_here()); - MY_CXT.yield_storage.cxix = cxix; - MY_CXT.yield_storage.items = items; + MY_CXT.yield_storage.cxix = cxix; + MY_CXT.yield_storage.items = items; + MY_CXT.yield_storage.savesp = PL_stack_sp; + if (items > 0) { + MY_CXT.yield_storage.items--; + MY_CXT.yield_storage.savesp--; + } /* See XS_Scope__Upper_unwind */ - if (GIMME_V == G_SCALAR) { - MY_CXT.yield_storage.savesp = PL_stack_sp; + if (GIMME_V == G_SCALAR) PL_stack_sp = PL_stack_base + PL_markstack_ptr[1] + 1; - } else { - MY_CXT.yield_storage.savesp = NULL; - } SAVEDESTRUCTOR_X(su_yield, NULL); return; }