This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Don’t create pads for sub stubs
authorFather Chrysostomos <sprout@cpan.org>
Thu, 14 Jun 2012 05:46:40 +0000 (22:46 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Fri, 15 Jun 2012 19:28:16 +0000 (12:28 -0700)
commit186a5ba82d5844e9713475c494fcd6682968609f
tree6de85407a073dfc7fe4dfe67d8e56746240a9081
parentd932357b9b22ec0976cc0ce8289b521ec4f8146d
Don’t create pads for sub stubs

Two code paths, sv_2cv (for \&name) and get_cvn_flags (for
&{"name"}()) were using start_subparse and newATTRSUB to create a
subroutine stub, which is what usually happens for Perl subs (with
op trees).

This resulted in subs with unused pads attached to them, because
start_subparse sets up the pad, which must be accessible dur-
ing parsing.

One code path, gv_init, which (among other things) reifies a GV after
a sub declaration (like ‘sub foo;’, which for efficiency doesn’t
create a CV), created the subroutine stub itself, without using
start_subparse/newATTRSUB.

This commit takes the code from gv_init, makes it more generic so it
can apply to the other two cases, puts it in a new function called
newSTUB, and makes all three locations call it.

Now stub creation should be faster and use less memory.

Additionally, this commit causes sv_2cv and get_cvn_flags to bypass
bug #107370 (glob stringification not round-tripping properly).  They
used to stringify the GV and pass the string to newATTRSUB (wrapped in
an op, of all things) for it to look up the GV again.  While bug
been fixed, as it was a side effect of sv_2cv triggering bug #107370.
embed.fnc
embed.h
gv.c
op.c
perl.c
pod/perldiag.pod
proto.h
sv.c