This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
pp_enteriter: don't create new SV for GvSV slot
authorDavid Mitchell <davem@iabyn.com>
Fri, 28 Aug 2015 07:21:05 +0000 (08:21 +0100)
committerDavid Mitchell <davem@iabyn.com>
Wed, 3 Feb 2016 08:59:39 +0000 (08:59 +0000)
commita62db3cf33709cf64db55ca8a466c34d151b8392
tree4da471bc773d9c12814d9a8bcc506b91bfe87f0c
parent9af0df0b57d248c9c26f1464e1f1c18f24c642c2
pp_enteriter: don't create new SV for GvSV slot

Currently in

    for $pkg_var (...) {}

pp_enteriter() saves the current SV that's in the GvSV  slot, then
replaces it with a newSV(0). Instead, leave it untouched. In the range
cases:

    for $pkg_var (1..10) {}
    for $pkg_var ('a'..'z') {}

a new SV will be created anyway in the first call to pp_iter(), since each
time round the loop it checks whether the refcount of the iterator vars is
greater than 1 and if so abandons it.

For the list case, e.g.

    for $pkg_var (1,3,5) {}
    for $pkg_var (@foo) {}

each call to pp_iter updates the GvSV slot to point to the current var,
so sticking a null SV in there initially, and freeing it the end is just
pointless extra work.

The only slight proviso is when the GvSV slot is initially NULL. In this
rare case we still create the SV, as it will be needed for the range
cases.
pp_ctl.c
t/op/for.t