This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
SvTRUE(): special-case immortals
authorDavid Mitchell <davem@iabyn.com>
Wed, 12 Jul 2017 13:48:34 +0000 (14:48 +0100)
committerDavid Mitchell <davem@iabyn.com>
Thu, 27 Jul 2017 10:30:22 +0000 (11:30 +0100)
commit78a2798452edb43e37dcaaf3698916d31575b58f
tree84d00a6c012cfb1daeb74ccf4a1a75b8837e164d
parent7c123f9da96361fa49e1d9227644d5ee5af4cd0d
SvTRUE(): special-case immortals

Immortal SVs like PL_sv_no will often be used as an argument to
SvTRUE(); however it turns out that SvTRUE() is very inefficient at
determining the truth value of such SVs. For example, for PL_sv_yes
it does all the following test-and-branches to decide that it is indeed
true:

    SvOK()
    SvPOK()
    SvANY()
    xpv_cur > 1
    xpv_cur
    sv_u.svu_pv != '0'

After the previous commit it is now much cheaper to  test whether an SV is
one of the four "interpreter" immortals PL_sv_yes, PL_sv_undef, PL_sv_no,
PL_sv_zero.

So this commit adds an extra check at the beginning of SvTRUE(): if it's
an immortal, return whether it's a true immortal (i.e. PL_sv_yes).

SvTRUE_nomg_NN(&PL_sv_yes) now only requires one test-and-branch plus an
address comparison. The other immortals are similarly improved.

Non-immortals now require one extra test-and-branch.
sv.h