From: Vincent Pit Date: Mon, 27 Jun 2011 07:35:57 +0000 (+0200) Subject: Make sure break() resets the sp at its original level X-Git-Tag: accepted/trunk/20130322.191538~3503 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=0787ea8aaa88d48f432536f8d8f6658fe8ba47ed;p=platform%2Fupstream%2Fperl.git Make sure break() resets the sp at its original level --- diff --git a/pp_ctl.c b/pp_ctl.c index 9eb2814..c442d0b 100644 --- a/pp_ctl.c +++ b/pp_ctl.c @@ -5045,7 +5045,9 @@ PP(pp_break) if (cxix < cxstack_ix) dounwind(cxix); - /* RETURNOP calls PUTBACK which restores the old old sp */ + /* Restore the sp at the time we entered the given block */ + TOPBLOCK(cx); + return cx->blk_givwhen.leave_op; } diff --git a/t/op/switch.t b/t/op/switch.t index 7614630..bdf087d 100644 --- a/t/op/switch.t +++ b/t/op/switch.t @@ -9,7 +9,7 @@ BEGIN { use strict; use warnings; -plan tests => 196; +plan tests => 197; # The behaviour of the feature pragma should be tested by lib/feature.t # using the tests in t/lib/feature/*. This file tests the behaviour of @@ -1347,6 +1347,20 @@ unreified_check(undef,""); }; } +# break() must reset the stack +{ + my @res = (1, do { + given ("x") { + 2, 3, do { + when (/[a-z]/) { + 4, 5, 6, break + } + } + } + }); + is "@res", "1", "break resets the stack"; +} + # Okay, that'll do for now. The intricacies of the smartmatch # semantics are tested in t/op/smartmatch.t __END__