This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
s///r leaks like a sieve
authorFather Chrysostomos <sprout@cpan.org>
Wed, 3 Nov 2010 03:06:08 +0000 (20:06 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Wed, 3 Nov 2010 04:32:34 +0000 (21:32 -0700)
pp_hot.c
t/re/subst.t

index 7f80fa5..a3fea5c 100644 (file)
--- a/pp_hot.c
+++ b/pp_hot.c
@@ -2120,7 +2120,7 @@ PP(pp_subst)
     /* In non-destructive replacement mode, duplicate target scalar so it
      * remains unchanged. */
     if (rpm->op_pmflags & PMf_NONDESTRUCT)
-       TARG = newSVsv(TARG);
+       TARG = sv_2mortal(newSVsv(TARG));
 
 #ifdef PERL_OLD_COPY_ON_WRITE
     /* Awooga. Awooga. "bool" types that are actually char are dangerous,
index cb43510..8ea53a2 100644 (file)
@@ -7,7 +7,7 @@ BEGIN {
 }
 
 require './test.pl';
-plan( tests => 172 );
+plan( tests => 174 );
 
 # Stolen from re/ReTest.pl. Can't just use the file since it doesn't support
 # like() and it conflicts with test.pl
@@ -88,6 +88,11 @@ ok( defined tied($m), 's///r magic isn\'t lost' );
 $b = $m =~ s/xxx/yyy/r;
 ok( ! defined tied($b), 's///r magic isn\'t contagious' );
 
+my $ref = \("aaa" =~ s/aaa/bbb/r);
+is (Internals::SvREFCNT($$ref), 1, 's///r does not leak');
+$ref = \("aaa" =~ s/aaa/bbb/rg);
+is (Internals::SvREFCNT($$ref), 1, 's///rg does not leak');
+
 $x = 'foo';
 $_ = "x";
 s/x/\$x/;