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;
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: {
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)
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:
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;
}