This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
reverse the order of POPBLOCK; POPFOO
[perl5.git] / cop.h
diff --git a/cop.h b/cop.h
index f7e6f68..7078a7a 100644 (file)
--- a/cop.h
+++ b/cop.h
@@ -651,7 +651,7 @@ struct block_format {
        AvFILLp(ary) = -1;                                              \
     } STMT_END
 
-#define POPSUB(cx,sv)                                                  \
+#define POPSUB(cx)                                                     \
     STMT_START {                                                       \
        CX_LEAVE_SCOPE(cx);                                             \
         if (!(cx->blk_u16 & CxPOPSUB_DONE)) {                           \
@@ -678,16 +678,11 @@ struct block_format {
            }                                                           \
        }                                                               \
         }                                                               \
-        PL_tmps_floor = cx->cx_u.cx_blk.blku_old_tmpsfloor;             \
         PL_comppad = cx->blk_sub.prevcomppad;                           \
         PL_curpad = LIKELY(PL_comppad) ? AvARRAY(PL_comppad) : NULL;    \
-       sv = MUTABLE_SV(cx->blk_sub.cv);                                \
-        CvDEPTH((const CV*)sv) = cx->blk_sub.olddepth;                  \
-    } STMT_END
-
-#define LEAVESUB(sv)                                                   \
-    STMT_START {                                                       \
-       SvREFCNT_dec(sv);                                               \
+        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)                                                  \
@@ -697,7 +692,6 @@ struct block_format {
        CV * const cv = cx->blk_format.cv;                              \
        GV * const dfuot = cx->blk_format.dfoutgv;                      \
         cx->blk_u16 |= CxPOPSUB_DONE;                                   \
-        PL_tmps_floor = cx->cx_u.cx_blk.blku_old_tmpsfloor;             \
        setdefout(dfuot);                                               \
         PL_comppad = cx->blk_format.prevcomppad;                        \
         PL_curpad = LIKELY(PL_comppad) ? AvARRAY(PL_comppad) : NULL;    \
@@ -705,6 +699,7 @@ 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 */
@@ -742,6 +737,7 @@ struct block_eval {
 
 #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;                      \
@@ -749,6 +745,7 @@ 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 */
@@ -942,7 +939,6 @@ struct block {
 /* Exit a block (RETURN and LAST). */
 #define POPBLOCK(cx,pm)                                                        \
        DEBUG_CX("POP");                                                \
-       cx = &cxstack[cxstack_ix--],                                    \
        PL_curcop        = cx->blk_oldcop,                              \
        PL_markstack_ptr = PL_markstack + cx->blk_oldmarksp,            \
        PL_scopestack_ix = cx->blk_oldscopesp,                          \
@@ -1314,15 +1310,16 @@ See L<perlcall/LIGHTWEIGHT CALLBACKS>.
     STMT_START {                                                       \
        cx = &cxstack[cxstack_ix];                                      \
         CvDEPTH(multicall_cv) = cx->blk_sub.olddepth;                   \
-        LEAVESUB(multicall_cv);                                        \
-       POPBLOCK(cx,PL_curpm);                                          \
-        /* these two set for backcompat by callers */                   \
-        newsp = PL_stack_base + cx->blk_oldsp;                          \
-        gimme = cx->blk_gimme;                                          \
         /* includes partial unrolled POPSUB(): */                       \
        CX_LEAVE_SCOPE(cx);                                             \
         PL_comppad = cx->blk_sub.prevcomppad;                           \
         PL_curpad = LIKELY(PL_comppad) ? AvARRAY(PL_comppad) : NULL;    \
+        SvREFCNT_dec_NN(multicall_cv);                                  \
+        /* these two set for backcompat by callers */                   \
+        newsp = PL_stack_base + cx->blk_oldsp;                          \
+        gimme = cx->blk_gimme;                                          \
+       POPBLOCK(cx,PL_curpm);                                          \
+       cxstack_ix--;                                                   \
        POPSTACK;                                                       \
        CATCH_SET(multicall_oldcatch);                                  \
        SPAGAIN;                                                        \
@@ -1339,7 +1336,7 @@ See L<perlcall/LIGHTWEIGHT CALLBACKS>.
        cx = &cxstack[cxstack_ix];                                      \
        assert(cx->cx_type & CXp_MULTICALL);                            \
        CvDEPTH(multicall_cv) = cx->blk_sub.olddepth;                   \
-        LEAVESUB(multicall_cv);                                                \
+        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 */   \