From: Dave Mitchell Date: Thu, 4 Mar 2004 23:32:38 +0000 (+0000) Subject: [perl #27206] Memory leak in continue loop X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=936c78b5fbfb4bf020fdea54970ee48649babcc3;p=p5sagit%2Fp5-mst-13.2.git [perl #27206] Memory leak in continue loop make sure redo always frees temps p4raw-id: //depot/perl@22438 --- diff --git a/pp_ctl.c b/pp_ctl.c index 3c632e2..d426005 100644 --- 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; } diff --git a/t/op/loopctl.t b/t/op/loopctl.t index 2ed9df1..bc326c7 100644 --- a/t/op/loopctl.t +++ b/t/op/loopctl.t @@ -31,7 +31,7 @@ # # -- .robin. 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"; +} + +