This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
pp_entersub(): don't prematurely calc hasargs
authorDavid Mitchell <davem@iabyn.com>
Mon, 13 Jul 2015 12:11:01 +0000 (13:11 +0100)
committerDavid Mitchell <davem@iabyn.com>
Wed, 3 Feb 2016 08:59:37 +0000 (08:59 +0000)
Currently at the top of pp_entersub() is:

    const bool hasargs = (PL_op->op_flags & OPf_STACKED) != 0;

Defer testing this flag and/or saving it to a local var until
its actually needed. This is a micro-optimisation.

pp_hot.c

index 959b09c..0796e56 100644 (file)
--- a/pp_hot.c
+++ b/pp_hot.c
@@ -3365,7 +3365,6 @@ PP(pp_entersub)
     CV *cv;
     PERL_CONTEXT *cx;
     I32 gimme;
-    const bool hasargs = (PL_op->op_flags & OPf_STACKED) != 0;
     I32 old_savestack_ix;
 
     if (UNLIKELY(!sv))
@@ -3424,7 +3423,7 @@ PP(pp_entersub)
                     DIE(aTHX_ PL_no_usym, "a subroutine");
 
                 if (UNLIKELY(sv == &PL_sv_yes)) { /* unfound import, ignore */
-                    if (hasargs)
+                    if (PL_op->op_flags & OPf_STACKED) /* hasargs */
                         SP = PL_stack_base + POPMARK;
                     else
                         (void)POPMARK;
@@ -3520,6 +3519,7 @@ PP(pp_entersub)
        dMARK;
        PADLIST * const padlist = CvPADLIST(cv);
         I32 depth;
+        bool hasargs;
 
         /* keep PADTMP args alive throughout the call (we need to do this
          * because @_ isn't refcounted). Note that we create the mortals
@@ -3539,6 +3539,7 @@ PP(pp_entersub)
         }
 
        PUSHBLOCK(cx, CXt_SUB, MARK);
+        hasargs = cBOOL(PL_op->op_flags & OPf_STACKED);
        PUSHSUB(cx);
        cx->blk_sub.retop = PL_op->op_next;
         cx->blk_sub.old_savestack_ix = old_savestack_ix;
@@ -3605,7 +3606,7 @@ PP(pp_entersub)
             DIE(aTHX_ "Can't modify non-lvalue subroutine call of &%"SVf,
                 SVfARG(cv_name(cv, NULL, 0)));
 
-       if (UNLIKELY(!hasargs && GvAV(PL_defgv))) {
+       if (UNLIKELY(!(PL_op->op_flags & OPf_STACKED) && GvAV(PL_defgv))) {
            /* Need to copy @_ to stack. Alternative may be to
             * switch stack to @_, and copy return values
             * back. This would allow popping @_ in XSUB, e.g.. XXXX */