This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
PUSHSUB: don't use implicit args
authorDavid Mitchell <davem@iabyn.com>
Sat, 26 Dec 2015 11:52:33 +0000 (11:52 +0000)
committerDavid Mitchell <davem@iabyn.com>
Wed, 3 Feb 2016 09:19:18 +0000 (09:19 +0000)
Make cv and hasargs explicit parameters of PUSHSUB(), rather than just
assuming that there are such vars in scope.

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

diff --git a/cop.h b/cop.h
index 1fa485e..e2d85c1 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)                                               \
+#define PUSHSUB_BASE(cx, cv, hasargs)                                  \
        ENTRY_PROBE(CvNAMED(cv)                                         \
                        ? HEK_KEY(CvNAME_HEK(cv))                       \
                        : GvENAME(CvGV(cv)),                            \
@@ -620,17 +620,17 @@ struct block_format {
                   ? 0 : (U8)func(aTHX)                                 \
        )
 
-#define PUSHSUB(cx)                                                    \
+#define PUSHSUB(cx, cv, hasargs)                                       \
     {                                                                  \
        U8 phlags = PUSHSUB_GET_LVALUE_MASK(Perl_was_lvalue_sub);       \
-       PUSHSUB_BASE(cx)                                                \
+       PUSHSUB_BASE(cx, cv, 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)                                                 \
-       PUSHSUB_BASE(cx)                                                \
+#define PUSHSUB_DB(cx, cv, hasargs)                                    \
+       PUSHSUB_BASE(cx, cv, 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);                                                    \
+       PUSHSUB(cx, cv, 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);                                                   \
+        PUSHSUB(cx, cv, hasargs);                                      \
         if (!(flags & CXp_SUB_RE_FAKE))                                 \
             CvDEPTH(cv)++;                                             \
        if (CvDEPTH(cv) >= 2)                                           \
index f573968..7272e83 100644 (file)
--- a/pp_ctl.c
+++ b/pp_ctl.c
@@ -2013,9 +2013,8 @@ PP(pp_dbstate)
            return NORMAL;
        }
        else {
-            U8 hasargs = 0;
            PUSHBLOCK(cx, CXt_SUB, gimme, SP, PL_savestack_ix);
-           PUSHSUB_DB(cx);
+           PUSHSUB_DB(cx, cv, 0);
            cx->blk_sub.retop = PL_op->op_next;
 
             SAVEI32(PL_debug);
index 647e398..5e54622 100644 (file)
--- a/pp_hot.c
+++ b/pp_hot.c
@@ -3854,7 +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);
+       PUSHSUB(cx, cv, hasargs);
        cx->blk_sub.retop = PL_op->op_next;
 
        padlist = CvPADLIST(cv);
index e910662..2b1147f 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);
+               PUSHSUB(cx, cv, hasargs);
                if (!is_xsub) {
                    PADLIST * const padlist = CvPADLIST(cv);