This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
pp_entersub(): remove an unnecessary condition
authorDavid Mitchell <davem@iabyn.com>
Sat, 11 Jul 2015 12:10:00 +0000 (13:10 +0100)
committerDavid Mitchell <davem@iabyn.com>
Wed, 3 Feb 2016 08:59:36 +0000 (08:59 +0000)
The code that scans the args list making mortal copies is protected by an

    if (LIKELY(hasargs)) {

However, a sub called as "&foo;" (which is how hasargs is determined)
won't have pushed anything on the stack, so the first part of that code
block, "while (svp < SP)", will drop out immediately.

So skip doing the hasargs test.

NB - it's possible in theory for XS code to call call_sv() jn such a way
as to both have !hasargs but with stuff on the stack; in this worst case,
we just waste a bit of time making some mortal copies of those args.

pp_hot.c

index 05a84d9..ae8b2a4 100644 (file)
--- a/pp_hot.c
+++ b/pp_hot.c
@@ -3502,7 +3502,7 @@ PP(pp_entersub)
          * in the caller's tmps frame, so they won't be freed until after
          * we return from the sub.
          */
-       if (LIKELY(hasargs)) {
+       {
             SV **svp = MARK;
             while (svp < SP) {
                 SV *sv = *++svp;