#define POPSUB(cx) \
STMT_START { \
- CX_LEAVE_SCOPE(cx); \
if (!(cx->blk_u16 & CxPOPSUB_DONE)) { \
cx->blk_u16 |= CxPOPSUB_DONE; \
RETURN_PROBE(CvNAMED(cx->blk_sub.cv) \
#define POPFORMAT(cx) \
STMT_START { \
- CX_LEAVE_SCOPE(cx); \
if (!(cx->blk_u16 & CxPOPSUB_DONE)) { \
CV * const cv = cx->blk_format.cv; \
GV * const dfuot = cx->blk_format.dfoutgv; \
#define POPEVAL(cx) \
STMT_START { \
- CX_LEAVE_SCOPE(cx); \
PL_in_eval = CxOLD_IN_EVAL(cx); \
optype = CxOLD_OP_TYPE(cx); \
PL_eval_root = cx->blk_eval.old_eval_root; \
PUSHLOOP_FOR_setpad(cx);
#define POPLOOP(cx) \
- CX_LEAVE_SCOPE(cx); \
if (CxTYPE(cx) == CXt_LOOP_LAZYSV) { \
SvREFCNT_dec_NN(cx->blk_loop.state_u.lazysv.cur); \
SvREFCNT_dec_NN(cx->blk_loop.state_u.lazysv.end); \
cx->blk_givwhen.defsv_save = orig_var;
#define POPWHEN(cx) \
- CX_LEAVE_SCOPE(cx);
+ NOOP;
#define POPGIVEN(cx) \
- CX_LEAVE_SCOPE(cx); \
SvREFCNT_dec(GvSV(PL_defgv)); \
GvSV(PL_defgv) = cx->blk_givwhen.defsv_save;
cx->cx_u.cx_blk.blku_old_savestack_ix = PL_savestack_ix;
#define POPBASICBLK(cx) \
- CX_LEAVE_SCOPE(cx);
+ NOOP;
/* context common to subroutines, evals and loops */
STMT_START { \
cx = &cxstack[cxstack_ix]; \
CvDEPTH(multicall_cv) = cx->blk_sub.olddepth; \
- /* includes partial unrolled POPSUB(): */ \
CX_LEAVE_SCOPE(cx); \
+ /* includes partial unrolled POPSUB(): */ \
PL_comppad = cx->blk_sub.prevcomppad; \
PL_curpad = LIKELY(PL_comppad) ? AvARRAY(PL_comppad) : NULL; \
SvREFCNT_dec_NN(multicall_cv); \
POPSUBST(cx);
continue; /* not break */
case CXt_SUB:
+ CX_LEAVE_SCOPE(cx);
POPSUB(cx);
break;
case CXt_EVAL:
+ CX_LEAVE_SCOPE(cx);
POPEVAL(cx);
break;
case CXt_BLOCK:
+ CX_LEAVE_SCOPE(cx);
POPBASICBLK(cx);
break;
case CXt_LOOP_LAZYIV:
case CXt_LOOP_LAZYSV:
case CXt_LOOP_FOR:
case CXt_LOOP_PLAIN:
+ CX_LEAVE_SCOPE(cx);
POPLOOP(cx);
break;
case CXt_WHEN:
+ CX_LEAVE_SCOPE(cx);
POPWHEN(cx);
break;
case CXt_GIVEN:
+ CX_LEAVE_SCOPE(cx);
POPGIVEN(cx);
break;
case CXt_NULL:
+ /* there isn't a POPNULL ! */
+ CX_LEAVE_SCOPE(cx);
break;
case CXt_FORMAT:
+ CX_LEAVE_SCOPE(cx);
POPFORMAT(cx);
break;
}
my_exit(1);
}
+ CX_LEAVE_SCOPE(cx);
POPEVAL(cx);
POPBLOCK(cx);
cxstack_ix--;
leave_common(newsp, newsp, gimme, SVs_PADTMP|SVs_TEMP,
PL_op->op_private & OPpLVALUE);
+ CX_LEAVE_SCOPE(cx);
POPBASICBLK(cx);
POPBLOCK(cx);
cxstack_ix--;
leave_common(newsp, MARK, gimme, SVs_PADTMP|SVs_TEMP,
PL_op->op_private & OPpLVALUE);
+ CX_LEAVE_SCOPE(cx);
POPLOOP(cx); /* Stack values are safe: release loop vars ... */
POPBLOCK(cx);
cxstack_ix--;
what = "undef";
}
croak:
+ CX_LEAVE_SCOPE(cx);
POPSUB(cx);
cxstack_ix--;
PL_curpm = cx->blk_oldpm;
}
PUTBACK;
+ CX_LEAVE_SCOPE(cx);
POPSUB(cx); /* Stack values are safe: release CV and @_ ... */
POPBLOCK(cx);
cxstack_ix--;
TAINT_NOT;
/* Stack values are safe: */
+ CX_LEAVE_SCOPE(cx);
POPLOOP(cx); /* release loop vars ... */
POPBLOCK(cx);
cxstack_ix--;
TOPBLOCK(cx);
SPAGAIN;
- /* partial unrolled POPSUB(): */
-
/* protect @_ during save stack unwind. */
if (arg)
SvREFCNT_inc_NN(sv_2mortal(MUTABLE_SV(arg)));
assert(PL_scopestack_ix == cx->blk_oldscopesp);
CX_LEAVE_SCOPE(cx);
+ /* partial unrolled POPSUB(): */
+
if (CxTYPE(cx) == CXt_SUB && CxHASARGS(cx)) {
AV* av = MUTABLE_AV(PAD_SVl(0));
assert(AvARRAY(MUTABLE_AV(
}
SP = PL_stack_base + POPMARK; /* pop original mark */
cx = &cxstack[cxstack_ix];
+ CX_LEAVE_SCOPE(cx);
POPEVAL(cx);
POPBLOCK(cx);
cxstack_ix--;
* to get the current hints. So restore it early.
*/
PL_curcop = cx->blk_oldcop;
+ CX_LEAVE_SCOPE(cx);
POPEVAL(cx);
POPBLOCK(cx);
cxstack_ix--;
I32 optype;
cx = &cxstack[cxstack_ix];
+ CX_LEAVE_SCOPE(cx);
POPEVAL(cx);
POPBLOCK(cx);
cxstack_ix--;
PL_stack_sp = newsp;
else
leave_common(newsp, newsp, gimme, SVs_PADTMP|SVs_TEMP, FALSE);
+ CX_LEAVE_SCOPE(cx);
POPEVAL(cx);
POPBLOCK(cx);
cxstack_ix--;
PL_stack_sp = newsp;
else
leave_common(newsp, newsp, gimme, SVs_PADTMP|SVs_TEMP, FALSE);
+
+ CX_LEAVE_SCOPE(cx);
POPGIVEN(cx);
POPBLOCK(cx);
cxstack_ix--;
cx = &cxstack[cxstack_ix];
assert(CxTYPE(cx) == CXt_WHEN);
PL_stack_sp = PL_stack_base + cx->blk_oldsp;
+ CX_LEAVE_SCOPE(cx);
POPWHEN(cx);
POPBLOCK(cx);
cxstack_ix--;