This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Fix skip logic in pad_tidy and cv_clone
authorFather Chrysostomos <sprout@cpan.org>
Tue, 20 Aug 2013 06:17:08 +0000 (23:17 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Tue, 20 Aug 2013 19:50:00 +0000 (12:50 -0700)
commit3a6ce63afe9bfc9bf645e0c127824d8426a7ee67
tree6a994506662ea1964fea6cddf3afc61f994ca276
parent25451ceff7e8f05c501ecc72a1b3536005f391f7
Fix skip logic in pad_tidy and cv_clone

Commit 325e1816dc changed the logic for determining whether a pad
entry is to be treated like a constant; i.e., shared between recursion
levels and sub clones.

According the old logic, a pad entry must be shared if it is marked
READONLY or is a shared hash key scalar.  According to the new logic,
the entry must be shared if the pad name has a zero-length PV (i.e.,
&PL_sv_no).

Two pieces of code were still following the old logic.  Changing them
fixes this old bug:

my $close_over_me;
sub  {
    () = $close_over_me;
    open my $fh, "/dev/null";
    print "$$fh\n"
}->();
__END__

Output:
*main::

The name attached to the implicit rv2gv op in open() was not being
copied by sub clones.

The previous commit is also part of the fix.

In the tests, I tested the combination of sub cloning and recursion,
since it seemed like a good idea (and also as a result of copying and
pasting :-).

S_pmtrans was still relying on the old logic, so it gets changed, too.
op.c
pad.c
t/op/gv.t