This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[perl #27206] Memory leak in continue loop
authorDave Mitchell <davem@fdisolutions.com>
Thu, 4 Mar 2004 23:32:38 +0000 (23:32 +0000)
committerDave Mitchell <davem@fdisolutions.com>
Thu, 4 Mar 2004 23:32:38 +0000 (23:32 +0000)
make sure redo always frees temps

p4raw-id: //depot/perl@22438

pp_ctl.c
t/op/loopctl.t

index 3c632e2..d426005 100644 (file)
--- a/pp_ctl.c
+++ b/pp_ctl.c
@@ -2115,6 +2115,7 @@ PP(pp_redo)
     TOPBLOCK(cx);
     oldsave = PL_scopestack[PL_scopestack_ix - 1];
     LEAVE_SCOPE(oldsave);
+    FREETMPS;
     return cx->blk_loop.redo_op;
 }
 
index 2ed9df1..bc326c7 100644 (file)
@@ -31,7 +31,7 @@
 #
 #  -- .robin. <robin@kitsite.com>  2001-03-13
 
-print "1..41\n";
+print "1..43\n";
 
 my $ok;
 
@@ -944,3 +944,26 @@ TEST41: {
     $ok = 0;
 }
 print ($ok ? "ok 41\n" : "not ok 41\n");
+
+
+# [perl #27206] Memory leak in continue loop
+# Ensure that the temporary object is freed each time round the loop,
+# rather then all 10 of them all being freed right at the end
+
+{
+    my $n=10; my $late_free = 0;
+    sub X::DESTROY { $late_free++ if $n < 0 };
+    {
+       ($n-- && bless {}, 'X') && redo;
+    }
+    print $late_free ? "not " : "", "ok 42 - redo memory leak\n";
+
+    $n = 10; $late_free = 0;
+    {
+       ($n-- && bless {}, 'X') && redo;
+    }
+    continue { }
+    print $late_free ? "not " : "", "ok 43 - redo with continue memory leak\n";
+}
+
+