This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
revamp pp_entersub()'s CV locating code
authorDavid Mitchell <davem@iabyn.com>
Mon, 13 Jul 2015 11:48:17 +0000 (12:48 +0100)
committerDavid Mitchell <davem@iabyn.com>
Wed, 3 Feb 2016 08:59:37 +0000 (08:59 +0000)
commit1ff56747187edf1f59cfa937d579cc52a48084a8
treea42aed0268bcb543ca947360818da5dfc6aca2b8
parent3073d04f153724a688310430661d6c6a311d7500
revamp pp_entersub()'s CV locating code

The big switch statement at the top of pp_entersub() is intended
to extract the CV from the passed argument, which might be a CV, a GV,
a ref to a CV, etc etc.

In 5.22.0, an optimisation was added to stashes such that if an entry
contained only a CV, then a ref to the CV was stored in the stash, rather
than a GV. This means that in the common case for a plain sub call, sv is
now a ref to a CV rather than a GV. So update the code to:

1) remove the special-casing of GVs;
2) add special casing for the sv being a non-magical, non-overloaded RV
   pointing to a CV;
3) add special casing for the sv being a CV (true on method calls);
3) move the rare "sv == &PL_sv_yes" test further down the condition chain;
4) generally rearrange the switch cases so that common things fall though
   and uncommon things do a goto;
5) sprinkle more LIKELY() pixie dust.

Part of the intention of special-casing is to avoid doing an indirect
branch by avoiding the switch statement completely.
pp_hot.c