This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
use the new PL_sv_zero in obvious places
authorDavid Mitchell <davem@iabyn.com>
Tue, 4 Jul 2017 08:45:29 +0000 (09:45 +0100)
committerDavid Mitchell <davem@iabyn.com>
Thu, 27 Jul 2017 10:30:21 +0000 (11:30 +0100)
commit725c44f93c35f696d7175c36a6d2ec5987b5a4d1
tree721f07a19addb4cffc53b5d7736dae71f68c01fb
parentb043c4bf3fff5c679dad74f1a0c13ac539a97815
use the new PL_sv_zero in obvious places

In places that do things like mPUSHi(0) or newSViv(0), replace them
with PUSHs(&PL_sv_zero) and &PL_sv_zero, etc.

This avoids the cost of creating and/or mortalising an SV, and/or setting
its value to 0.

This commit causes a subtle change to tainting in various places as a
side-effect. For example, grep in scalar context retunrs 0 if it has no
args.  Formerly the zero value could in theory get tainted:

    @a = ();
    $x = ( ($^X . ""), grep { 1 } @a);

It used to be the case that $x would be tainted; now its not.
In practice this doesn't matter - the zero value was only getting tainted
as a side-effect of tainting's "if anything in the statement uses a
tainted value, taint everything" mechanism, which gives (documented) false
positives. This commit merely removes some such false positives, and
makes the behaviour similar to functions which return &PL_sv_undef/no/yes,
which are also immune to side-effect tainting.
gv.c
hv.c
pp_ctl.c
pp_sys.c