cx->blk_sub.prevcomppad = PL_comppad; \
cx->cx_type |= (hasargs) ? CXp_HASARGS : 0; \
cx->blk_sub.retop = NULL; \
- SvREFCNT_inc_simple_void_NN(cv); \
- cx->cx_u.cx_blk.blku_old_tmpsfloor = PL_tmps_floor; \
- PL_tmps_floor = PL_tmps_ix;
+ SvREFCNT_inc_simple_void_NN(cv);
#define PUSHSUB_GET_LVALUE_MASK(func) \
/* If the context is indeterminate, then only the lvalue */ \
cx->blk_format.prevcomppad = PL_comppad; \
cx->blk_u16 = 0; \
cx->cx_u.cx_blk.blku_old_savestack_ix = PL_savestack_ix; \
- cx->cx_u.cx_blk.blku_old_tmpsfloor = PL_tmps_floor; \
- PL_tmps_floor = PL_tmps_ix; \
SvREFCNT_inc_simple_void_NN(cv); \
CvDEPTH(cv)++; \
SvREFCNT_inc_void(cx->blk_format.dfoutgv)
PL_curpad = LIKELY(PL_comppad) ? AvARRAY(PL_comppad) : NULL; \
CvDEPTH((const CV*)cx->blk_sub.cv) = cx->blk_sub.olddepth; \
SvREFCNT_dec_NN(cx->blk_sub.cv); \
- PL_tmps_floor = cx->cx_u.cx_blk.blku_old_tmpsfloor; \
} STMT_END
#define POPFORMAT(cx) \
SvREFCNT_dec_NN(cx->blk_format.cv); \
SvREFCNT_dec_NN(dfuot); \
} \
- PL_tmps_floor = cx->cx_u.cx_blk.blku_old_tmpsfloor; \
} STMT_END
/* eval context */
assert(!(PL_in_eval & ~0x7F)); \
assert(!(PL_op->op_type & ~0x1FF)); \
cx->blk_u16 = (PL_in_eval & 0x7F) | ((U16)PL_op->op_type << 7); \
- cx->cx_u.cx_blk.blku_old_tmpsfloor = PL_tmps_floor; \
- PL_tmps_floor = PL_tmps_ix; \
cx->blk_eval.old_namesv = (n ? newSVpv(n,0) : NULL); \
cx->blk_eval.old_eval_root = PL_eval_root; \
cx->blk_eval.cur_text = PL_parser ? PL_parser->linestr : NULL; \
SvREFCNT_dec_NN(cx->blk_eval.cur_text); \
if (cx->blk_eval.old_namesv) \
sv_2mortal(cx->blk_eval.old_namesv); \
- PL_tmps_floor = cx->cx_u.cx_blk.blku_old_tmpsfloor; \
} STMT_END
/* loop context */
cx->blk_loop.state_u.ary.ary = NULL; \
cx->blk_loop.state_u.ary.ix = 0; \
cx->cx_u.cx_blk.blku_old_savestack_ix = PL_savestack_ix; \
- cx->cx_u.cx_blk.blku_old_tmpsfloor = PL_tmps_floor; \
- PL_tmps_floor = PL_tmps_ix; \
cx->blk_loop.itervar_u.svp = NULL; \
cx->blk_loop.itersave = NULL;
cx->blk_loop.state_u.ary.ix = 0; \
cx->blk_loop.itervar_u.svp = (SV**)(ivar); \
cx->cx_u.cx_blk.blku_old_savestack_ix = PL_savestack_ix; \
- cx->cx_u.cx_blk.blku_old_tmpsfloor = PL_tmps_floor; \
- PL_tmps_floor = PL_tmps_ix; \
cx->blk_loop.itersave = isave; \
PUSHLOOP_FOR_setpad(cx);
cursv = *svp; \
*svp = cx->blk_loop.itersave; \
SvREFCNT_dec(cursv); \
- } \
- PL_tmps_floor = cx->cx_u.cx_blk.blku_old_tmpsfloor;
+ }
/* given/when context */
struct block_givwhen {
#define PUSHWHEN(cx) \
cx->cx_u.cx_blk.blku_old_savestack_ix = PL_savestack_ix; \
- cx->cx_u.cx_blk.blku_old_tmpsfloor = PL_tmps_floor; \
- PL_tmps_floor = PL_tmps_ix; \
cx->blk_givwhen.leave_op = cLOGOP->op_other;
#define PUSHGIVEN(cx, orig_var) \
cx->blk_givwhen.defsv_save = orig_var;
#define POPWHEN(cx) \
- CX_LEAVE_SCOPE(cx); \
- PL_tmps_floor = cx->cx_u.cx_blk.blku_old_tmpsfloor;
+ CX_LEAVE_SCOPE(cx);
#define POPGIVEN(cx) \
CX_LEAVE_SCOPE(cx); \
SvREFCNT_dec(GvSV(PL_defgv)); \
- GvSV(PL_defgv) = cx->blk_givwhen.defsv_save; \
- PL_tmps_floor = cx->cx_u.cx_blk.blku_old_tmpsfloor;
+ GvSV(PL_defgv) = cx->blk_givwhen.defsv_save;
/* basic block, i.e. pp_enter/leave */
#define PUSHBASICBLK(cx) \
- cx->cx_u.cx_blk.blku_old_savestack_ix = PL_savestack_ix; \
- cx->cx_u.cx_blk.blku_old_tmpsfloor = PL_tmps_floor; \
- PL_tmps_floor = PL_tmps_ix;
+ cx->cx_u.cx_blk.blku_old_savestack_ix = PL_savestack_ix;
#define POPBASICBLK(cx) \
- CX_LEAVE_SCOPE(cx); \
- PL_tmps_floor = cx->cx_u.cx_blk.blku_old_tmpsfloor;
+ CX_LEAVE_SCOPE(cx);
/* context common to subroutines, evals and loops */
cx->blk_oldscopesp = PL_scopestack_ix, \
cx->blk_oldpm = PL_curpm, \
cx->blk_gimme = (U8)gimme; \
+ cx->cx_u.cx_blk.blku_old_tmpsfloor = PL_tmps_floor; \
+ PL_tmps_floor = PL_tmps_ix; \
DEBUG_CX("PUSH");
/* Exit a block (RETURN and LAST). */
/* LEAVE_SCOPE() should have made this true. /(?{})/ cheats
* and leaves a CX entry lying around for repeated use, so
* skip for multicall */ \
- assert(CxMULTICALL(cx) || \
+ assert((CxTYPE(cx) == CXt_SUB && CxMULTICALL(cx)) || \
PL_savestack_ix == cx->cx_u.cx_blk.blku_old_savestack_ix); \
+ PL_tmps_floor = cx->cx_u.cx_blk.blku_old_tmpsfloor; \
PL_curpm = cx->blk_oldpm;
/* Continue a block elsewhere (NEXT and REDO). */
/* If you re-order these, there is also an array of uppercase names in perl.h
and a static array of context names in pp_ctl.c */
#define CXTYPEMASK 0xf
-#define CXt_NULL 0
+#define CXt_NULL 0 /* currently only used for sort BLOCK */
#define CXt_WHEN 1
#define CXt_BLOCK 2
/* When micro-optimising :-) keep GIVEN next to the LOOPs, as these 5 share a
#define CXt_SUBST 11
/* SUBST doesn't feature in all switch statements. */
-/* private flags for CXt_SUB and CXt_NULL
- However, this is checked in many places which do not check the type, so
- this bit needs to be kept clear for most everything else. For reasons I
- haven't investigated, it can coexist with CXp_FOR_DEF */
-#define CXp_MULTICALL 0x10 /* part of a multicall (so don't
- tear down context on exit). */
-
/* private flags for CXt_SUB and CXt_FORMAT */
+#define CXp_MULTICALL 0x10 /* part of a multicall (so don't tear down
+ context on exit). (not CXt_FORMAT) */
#define CXp_HASARGS 0x20
#define CXp_SUB_RE 0x40 /* code called within regex, i.e. (?{}) */
#define CXp_SUB_RE_FAKE 0x80 /* fake sub CX for (?{}) in current scope */
#define CxTYPE(c) ((c)->cx_type & CXTYPEMASK)
#define CxTYPE_is_LOOP(c) (((c)->cx_type & 0xC) == 0x4)
-#define CxMULTICALL(c) (((c)->cx_type & CXp_MULTICALL) \
- == CXp_MULTICALL)
+#define CxMULTICALL(c) ((c)->cx_type & CXp_MULTICALL)
#define CxREALEVAL(c) (((c)->cx_type & (CXTYPEMASK|CXp_REAL)) \
== (CXt_EVAL|CXp_REAL))
#define CxTRYBLOCK(c) (((c)->cx_type & (CXTYPEMASK|CXp_TRYBLOCK)) \
CV * const cv = _nOnclAshIngNamE_; \
PADLIST * const padlist = CvPADLIST(cv); \
cx = &cxstack[cxstack_ix]; \
- assert(cx->cx_type & CXp_MULTICALL); \
+ assert(CxMULTICALL(cx)); \
CvDEPTH(multicall_cv) = cx->blk_sub.olddepth; \
SvREFCNT_dec_NN(multicall_cv); \
cx->cx_type = (CXt_SUB|CXp_MULTICALL|flags); \
{ \
/* save a few things that we don't want PUSHSUB to zap */ \
PAD * const prevcomppad = cx->blk_sub.prevcomppad; \
- SSize_t old_floor = cx->cx_u.cx_blk.blku_old_tmpsfloor; \
- SSize_t floor = PL_tmps_floor; \
PUSHSUB(cx); \
/* undo the stuff that PUSHSUB zapped */ \
cx->blk_sub.prevcomppad = prevcomppad ; \
- cx->cx_u.cx_blk.blku_old_tmpsfloor = old_floor; \
- PL_tmps_floor = floor; \
} \
if (!(flags & CXp_SUB_RE_FAKE)) \
CvDEPTH(cv)++; \