This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Don’t leak formats defined inside subs
authorFather Chrysostomos <sprout@cpan.org>
Fri, 17 Aug 2012 21:24:05 +0000 (14:24 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Fri, 17 Aug 2012 23:45:22 +0000 (16:45 -0700)
I made them leak inadvertently in 5.17.2 with commit e09ac076a1da.

This was unfortunately backported to 5.16.1 (as 3149499832) without
anybody noticing the bug.

pad.c
t/op/write.t

diff --git a/pad.c b/pad.c
index 331922a..d248921 100644 (file)
--- a/pad.c
+++ b/pad.c
@@ -814,7 +814,7 @@ Perl_pad_add_anon(pTHX_ CV* func, I32 optype)
     if (SvTYPE(func) == SVt_PVCV || !CvOUTSIDE(func))
        av_store(PL_comppad, ix, (SV*)func);
     else {
-       SV *rv = newRV_inc((SV *)func);
+       SV *rv = newRV_noinc((SV *)func);
        sv_rvweaken(rv);
        assert (SvTYPE(func) == SVt_PVFM);
        av_store(PL_comppad, ix, rv);
index 5706e49..3fafc20 100644 (file)
@@ -61,7 +61,7 @@ for my $tref ( @NumTests ){
 my $bas_tests = 21;
 
 # number of tests in section 3
-my $bug_tests = 8 + 3 * 3 * 5 * 2 * 3 + 2 + 66 + 4 + 2 + 3 + 96 + 10;
+my $bug_tests = 8 + 3 * 3 * 5 * 2 * 3 + 2 + 66 + 4 + 2 + 3 + 96 + 11;
 
 # number of tests in section 4
 my $hmb_tests = 35;
@@ -1102,6 +1102,18 @@ write STRICT;
 close STRICT or die "Could not close: $!";
 is cat('Op_write.tmp'), "oof:\n", 'pragmata on format line';
 
+SKIP: {
+   skip "no weak refs" unless eval { require Scalar::Util };
+   sub Potshriggley {
+format Potshriggley =
+.
+   }
+   Scalar::Util::weaken(my $x = *Potshriggley{FORMAT});
+   undef *Potshriggley;
+   is $x, undef, 'formats in subs do not leak';
+   use Devel::Peek; Dump $x if $x;
+}
+
 
 #############################
 ## Section 4