This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
fix *_ = "" for 0 .. 1;
authorDavid Mitchell <davem@iabyn.com>
Fri, 18 Dec 2015 15:09:42 +0000 (15:09 +0000)
committerDavid Mitchell <davem@iabyn.com>
Wed, 3 Feb 2016 09:18:35 +0000 (09:18 +0000)
commit6d3ca00e6379e48bc8092acc7a90d9ce838df013
tree97811991ffda1b0b526c49cf892c3be80292d593
parent2c49879ec3c26fea291b0d87fd14cdea3709bcc9
fix *_ = "" for 0 .. 1;

RT #123994

pp_iter couldn't handle GvSv(gv) being NULL.

In that ticket, Tony Cook suggested two possible fixes. First,
always instantiate the GvSV slot at the start of pp_iter by using
GvSVn rather than GvSV in the CxITERVAR() macro;

Second, test for it being null within the two 'range' branches,
(for(1..9), for('a'..'z')), and if so create it. One advantage of doing
it there is that there's already code for (re)creating the SV if the
reference count is != 1. It also means that the list and array cases
(for(@a), for(1,3,5)) which always put the next iterated SV into the
pad/GvSV slot don't waste time creating and then immediately discarding an
SV if GvSV was NULL.

I went for the second fix.

It also means that's there's no longer any need in pp_enteriter to
initially poulate GvSV is it was null, as this will be detected during
the first pp_iter() anyway.
pp_ctl.c
pp_hot.c
t/op/for.t