cx->blk_format.dfoutgv = PL_defoutgv; \
cx->blk_format.prevcomppad = PL_comppad; \
cx->blk_u16 = 0; \
- cx->blk_oldsaveix = PL_savestack_ix; \
SvREFCNT_inc_simple_void_NN(cv); \
CvDEPTH(cv)++; \
SvREFCNT_inc_void(cx->blk_format.dfoutgv)
#define PUSHLOOP_PLAIN(cx) \
- cx->blk_loop.my_op = cLOOP; \
- cx->blk_oldsaveix = PL_savestack_ix;
+ cx->blk_loop.my_op = cLOOP;
#ifdef USE_ITHREADS
# define PUSHLOOP_FOR_setpad(c) (c)->blk_loop.oldcomppad = PL_comppad
#define PUSHLOOP_FOR(cx, ivar, isave) \
cx->blk_loop.my_op = cLOOP; \
cx->blk_loop.itervar_u.svp = (SV**)(ivar); \
- cx->blk_oldsaveix = PL_savestack_ix; \
cx->blk_loop.itersave = isave; \
PUSHLOOP_FOR_setpad(cx);
};
#define PUSHWHEN(cx) \
- cx->blk_oldsaveix = PL_savestack_ix; \
cx->blk_givwhen.leave_op = cLOGOP->op_other;
#define PUSHGIVEN(cx, orig_var) \
/* basic block, i.e. pp_enter/leave */
#define PUSHBASICBLK(cx) \
- cx->blk_oldsaveix = PL_savestack_ix;
+ NOOP;
#define CX_POPBASICBLK(cx) \
assert(CxTYPE(cx) == CXt_BLOCK); \
__FILE__, __LINE__));
/* Enter a block. */
-#define PUSHBLOCK(cx,t,sp) CXINC, cx = CX_CUR(), \
+#define PUSHBLOCK(cx,t,sp, saveix) \
+ CXINC, \
+ cx = CX_CUR(), \
cx->cx_type = t, \
cx->blk_oldsp = sp - PL_stack_base, \
cx->blk_oldcop = PL_curcop, \
cx->blk_oldmarksp = PL_markstack_ptr - PL_markstack, \
+ cx->blk_oldsaveix = saveix, \
cx->blk_oldscopesp = PL_scopestack_ix, \
cx->blk_oldpm = PL_curpm, \
cx->blk_gimme = (U8)gimme; \
multicall_oldcatch = CATCH_GET; \
CATCH_SET(TRUE); \
PUSHSTACKi(PERLSI_MULTICALL); \
- PUSHBLOCK(cx, (CXt_SUB|CXp_MULTICALL|flags), PL_stack_sp); \
+ PUSHBLOCK(cx, (CXt_SUB|CXp_MULTICALL|flags), PL_stack_sp, \
+ PL_savestack_ix); \
PUSHSUB(cx); \
- cx->blk_oldsaveix = PL_savestack_ix; \
SAVEOP(); \
saveix_floor = PL_savestack_ix; \
if (!(flags & CXp_SUB_RE_FAKE)) \
}
else {
U8 hasargs = 0;
- PUSHBLOCK(cx, CXt_SUB, SP);
+ PUSHBLOCK(cx, CXt_SUB, SP, PL_savestack_ix);
PUSHSUB_DB(cx);
cx->blk_sub.retop = PL_op->op_next;
- cx->blk_oldsaveix = PL_savestack_ix;
SAVEI32(PL_debug);
PL_debug = 0;
PERL_CONTEXT *cx;
I32 gimme = GIMME_V;
- PUSHBLOCK(cx, CXt_BLOCK, SP);
+ PUSHBLOCK(cx, CXt_BLOCK, SP, PL_savestack_ix);
PUSHBASICBLK(cx);
RETURN;
/* OPpITER_DEF (implicit $_) should only occur with a GV iter var */
assert((cxflags & CXp_FOR_GV) || !(PL_op->op_private & OPpITER_DEF));
- PUSHBLOCK(cx, cxflags, MARK);
+ PUSHBLOCK(cx, cxflags, MARK, PL_savestack_ix);
PUSHLOOP_FOR(cx, itervarp, itersave);
if (PL_op->op_flags & OPf_STACKED) {
PERL_CONTEXT *cx;
const I32 gimme = GIMME_V;
- PUSHBLOCK(cx, CXt_LOOP_PLAIN, SP);
+ PUSHBLOCK(cx, CXt_LOOP_PLAIN, SP, PL_savestack_ix);
PUSHLOOP_PLAIN(cx);
RETURN;
}
/* switch to eval mode */
- PUSHBLOCK(cx, CXt_EVAL, SP);
+ PUSHBLOCK(cx, CXt_EVAL, SP, old_savestack_ix);
PUSHEVAL(cx, name);
- cx->blk_oldsaveix = old_savestack_ix;
cx->blk_eval.retop = PL_op->op_next;
SAVECOPLINE(&PL_compiling);
* to do the dirty work for us */
runcv = find_runcv(&seq);
- PUSHBLOCK(cx, (CXt_EVAL|CXp_REAL), SP);
+ PUSHBLOCK(cx, (CXt_EVAL|CXp_REAL), SP, old_savestack_ix);
PUSHEVAL(cx, 0);
- cx->blk_oldsaveix = old_savestack_ix;
cx->blk_eval.retop = PL_op->op_next;
/* prepare to compile string */
PERL_CONTEXT *cx;
const I32 gimme = GIMME_V;
- PUSHBLOCK(cx, (CXt_EVAL|CXp_TRYBLOCK), PL_stack_sp);
+ PUSHBLOCK(cx, (CXt_EVAL|CXp_TRYBLOCK), PL_stack_sp, PL_savestack_ix);
PUSHEVAL(cx, 0);
- cx->blk_oldsaveix = PL_savestack_ix;
PL_in_eval = EVAL_INEVAL;
if (flags & G_KEEPERR)
assert(!PL_op->op_targ); /* used to be set for lexical $_ */
GvSV(PL_defgv) = SvREFCNT_inc(newsv);
- PUSHBLOCK(cx, CXt_GIVEN, SP);
+ PUSHBLOCK(cx, CXt_GIVEN, SP, PL_savestack_ix);
PUSHGIVEN(cx, origsv);
RETURN;
if ((0 == (PL_op->op_flags & OPf_SPECIAL)) && !SvTRUEx(POPs))
RETURNOP(cLOGOP->op_other->op_next);
- PUSHBLOCK(cx, CXt_WHEN, SP);
+ PUSHBLOCK(cx, CXt_WHEN, SP, PL_savestack_ix);
PUSHWHEN(cx);
RETURN;
}
gimme = GIMME_V;
- PUSHBLOCK(cx, CXt_SUB, MARK);
+ PUSHBLOCK(cx, CXt_SUB, MARK, old_savestack_ix);
hasargs = cBOOL(PL_op->op_flags & OPf_STACKED);
PUSHSUB(cx);
cx->blk_sub.retop = PL_op->op_next;
- cx->blk_oldsaveix = old_savestack_ix;
padlist = CvPADLIST(cv);
if (UNLIKELY((depth = ++CvDEPTH(cv)) >= 2))
}
gimme = G_SCALAR;
- PUSHBLOCK(cx, CXt_NULL, PL_stack_base);
+ PUSHBLOCK(cx, CXt_NULL, PL_stack_base, old_savestack_ix);
if (!(flags & OPf_SPECIAL)) {
cx->cx_type = CXt_SUB|CXp_MULTICALL;
PUSHSUB(cx);
}
}
- cx->blk_oldsaveix = old_savestack_ix;
start = p1 - max;
sortsvp(aTHX_ start, max,
if (CvCLONE(cv))
cv = MUTABLE_CV(sv_2mortal(MUTABLE_SV(cv_clone(cv))));
- PUSHBLOCK(cx, CXt_FORMAT, PL_stack_sp);
+ PUSHBLOCK(cx, CXt_FORMAT, PL_stack_sp, PL_savestack_ix);
PUSHFORMAT(cx, retop);
if (CvDEPTH(cv) >= 2)
pad_push(CvPADLIST(cv), CvDEPTH(cv));