This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
do PL_tmps_floor save in PUSHBLOCK
[perl5.git] / cop.h
diff --git a/cop.h b/cop.h
index 806f72c..c2a1dc0 100644 (file)
--- a/cop.h
+++ b/cop.h
@@ -592,9 +592,7 @@ struct block_format {
        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 */     \
@@ -628,8 +626,6 @@ struct block_format {
        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)
@@ -682,7 +678,6 @@ struct block_format {
         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)                                                  \
@@ -699,7 +694,6 @@ struct block_format {
        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 */
@@ -725,8 +719,6 @@ struct block_eval {
        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;  \
@@ -745,7 +737,6 @@ struct block_eval {
            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 */
@@ -798,8 +789,6 @@ struct block_loop {
        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;
 
@@ -816,8 +805,6 @@ struct block_loop {
        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);
 
@@ -837,8 +824,7 @@ struct block_loop {
             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 {
@@ -848,8 +834,6 @@ 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)                                         \
@@ -857,26 +841,21 @@ struct block_givwhen {
         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 */
@@ -934,6 +913,8 @@ struct block {
        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). */
@@ -945,8 +926,9 @@ struct block {
         /* 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). */
@@ -1028,7 +1010,7 @@ struct context {
 /* 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
@@ -1047,14 +1029,9 @@ struct context {
 #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 */
@@ -1075,8 +1052,7 @@ struct context {
 
 #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))     \
@@ -1339,20 +1315,16 @@ See L<perlcall/LIGHTWEIGHT CALLBACKS>.
        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)++;                                             \