diff options
author | Father Chrysostomos <sprout@cpan.org> | 2012-06-13 22:46:40 -0700 |
---|---|---|
committer | Father Chrysostomos <sprout@cpan.org> | 2012-06-15 12:28:16 -0700 |
commit | 186a5ba82d5844e9713475c494fcd6682968609f (patch) | |
tree | 6de85407a073dfc7fe4dfe67d8e56746240a9081 /sv.c | |
parent | d932357b9b22ec0976cc0ce8289b521ec4f8146d (diff) | |
download | perl-186a5ba82d5844e9713475c494fcd6682968609f.tar.gz |
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.
Diffstat (limited to 'sv.c')
-rw-r--r-- | sv.c | 12 |
1 files changed, 1 insertions, 11 deletions
@@ -9021,20 +9021,10 @@ Perl_sv_2cv(pTHX_ SV *sv, HV **const st, GV **const gvp, const I32 lref) } *st = GvESTASH(gv); if (lref & ~GV_ADDMG && !GvCVu(gv)) { - SV *tmpsv; - ENTER; - tmpsv = newSV(0); - gv_efullname3(tmpsv, gv, NULL); /* XXX this is probably not what they think they're getting. * It has the same effect as "sub name;", i.e. just a forward * declaration! */ - newSUB(start_subparse(FALSE, 0), - newSVOP(OP_CONST, 0, tmpsv), - NULL, NULL); - LEAVE; - if (!GvCVu(gv)) - Perl_croak(aTHX_ "Unable to create sub named \"%"SVf"\"", - SVfARG(SvOK(sv) ? sv : &PL_sv_no)); + newSTUB(gv,0); } return GvCVu(gv); } |