This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
PUSHSUB: make retop a parameter
authorDavid Mitchell <davem@iabyn.com>
Sat, 26 Dec 2015 12:37:30 +0000 (12:37 +0000)
committerDavid Mitchell <davem@iabyn.com>
Wed, 3 Feb 2016 09:19:18 +0000 (09:19 +0000)
Rather than doing cx->blk_sub.retop = NULL in PUSHSUB, then relying on
the caller to subsequently change it to something more useful, make it an
arg to PUSHSUB.

cop.h
pp_ctl.c
pp_hot.c
pp_sort.c

diff --git a/cop.h b/cop.h
index 7934484..268c24f 100644 (file)
--- a/cop.h
+++ b/cop.h
@@ -595,7 +595,7 @@ struct block_format {
  * The context frame holds a reference to the CV so that it can't be
  * freed while we're executing it */
 
-#define PUSHSUB_BASE(cx, cv, hasargs)                                  \
+#define PUSHSUB_BASE(cx, cv, op, hasargs)                              \
        ENTRY_PROBE(CvNAMED(cv)                                         \
                        ? HEK_KEY(CvNAME_HEK(cv))                       \
                        : GvENAME(CvGV(cv)),                            \
@@ -607,7 +607,7 @@ struct block_format {
        cx->blk_sub.olddepth = CvDEPTH(cv);                             \
        cx->blk_sub.prevcomppad = PL_comppad;                           \
        cx->cx_type |= (hasargs) ? CXp_HASARGS : 0;                     \
-       cx->blk_sub.retop = NULL;                                       \
+       cx->blk_sub.retop = op;                                         \
         SvREFCNT_inc_simple_void_NN(cv);
 
 #define PUSHSUB_GET_LVALUE_MASK(func) \
@@ -620,17 +620,17 @@ struct block_format {
                   ? 0 : (U8)func(aTHX)                                 \
        )
 
-#define PUSHSUB(cx, cv, hasargs)                                       \
+#define PUSHSUB(cx, cv, op, hasargs)                                   \
     {                                                                  \
        U8 phlags = PUSHSUB_GET_LVALUE_MASK(Perl_was_lvalue_sub);       \
-       PUSHSUB_BASE(cx, cv, hasargs)                                   \
+       PUSHSUB_BASE(cx, cv, op, hasargs)                               \
        cx->blk_u16 = PL_op->op_private &                               \
                          (phlags|OPpDEREF);                            \
     }
 
 /* variant for use by OP_DBSTATE, where op_private holds hint bits */
-#define PUSHSUB_DB(cx, cv, hasargs)                                    \
-       PUSHSUB_BASE(cx, cv, hasargs)                                   \
+#define PUSHSUB_DB(cx, cv, op, hasargs)                                        \
+       PUSHSUB_BASE(cx, cv, op, hasargs)                               \
        cx->blk_u16 = 0;
 
 
@@ -1345,7 +1345,7 @@ See L<perlcall/LIGHTWEIGHT CALLBACKS>.
        PUSHSTACKi(PERLSI_MULTICALL);                                   \
        PUSHBLOCK(cx, (CXt_SUB|CXp_MULTICALL|flags), gimme,             \
                   PL_stack_sp, PL_savestack_ix);                       \
-       PUSHSUB(cx, cv, hasargs);                                       \
+       PUSHSUB(cx, cv, NULL, hasargs);                                 \
        SAVEOP();                                                       \
         saveix_floor = PL_savestack_ix;                                 \
         if (!(flags & CXp_SUB_RE_FAKE))                                 \
@@ -1394,7 +1394,7 @@ See L<perlcall/LIGHTWEIGHT CALLBACKS>.
        assert(CxMULTICALL(cx));                                        \
         CX_POPSUB_COMMON(cx);                                           \
        cx->cx_type = (CXt_SUB|CXp_MULTICALL|flags);                    \
-        PUSHSUB(cx, cv, hasargs);                                      \
+        PUSHSUB(cx, cv, NULL, hasargs);                                        \
         if (!(flags & CXp_SUB_RE_FAKE))                                 \
             CvDEPTH(cv)++;                                             \
        if (CvDEPTH(cv) >= 2)                                           \
index b1452cd..16d5e11 100644 (file)
--- a/pp_ctl.c
+++ b/pp_ctl.c
@@ -2014,8 +2014,7 @@ PP(pp_dbstate)
        }
        else {
            PUSHBLOCK(cx, CXt_SUB, gimme, SP, PL_savestack_ix);
-           PUSHSUB_DB(cx, cv, 0);
-           cx->blk_sub.retop = PL_op->op_next;
+           PUSHSUB_DB(cx, cv, PL_op->op_next, 0);
 
             SAVEI32(PL_debug);
             PL_debug = 0;
index 5e54622..825cf3f 100644 (file)
--- a/pp_hot.c
+++ b/pp_hot.c
@@ -3854,8 +3854,7 @@ PP(pp_entersub)
         gimme = GIMME_V;
        PUSHBLOCK(cx, CXt_SUB, gimme, MARK, old_savestack_ix);
         hasargs = cBOOL(PL_op->op_flags & OPf_STACKED);
-       PUSHSUB(cx, cv, hasargs);
-       cx->blk_sub.retop = PL_op->op_next;
+       PUSHSUB(cx, cv, PL_op->op_next, hasargs);
 
        padlist = CvPADLIST(cv);
        if (UNLIKELY((depth = ++CvDEPTH(cv)) >= 2))
index 2b1147f..5f7ae22 100644 (file)
--- a/pp_sort.c
+++ b/pp_sort.c
@@ -1671,7 +1671,7 @@ PP(pp_sort)
            PUSHBLOCK(cx, CXt_NULL, gimme, PL_stack_base, old_savestack_ix);
            if (!(flags & OPf_SPECIAL)) {
                cx->cx_type = CXt_SUB|CXp_MULTICALL;
-               PUSHSUB(cx, cv, hasargs);
+               PUSHSUB(cx, cv, NULL, hasargs);
                if (!is_xsub) {
                    PADLIST * const padlist = CvPADLIST(cv);