From 0787ea8aaa88d48f432536f8d8f6658fe8ba47ed Mon Sep 17 00:00:00 2001 From: Vincent Pit Date: Mon, 27 Jun 2011 09:35:57 +0200 Subject: [PATCH] Make sure break() resets the sp at its original level --- pp_ctl.c | 4 +++- t/op/switch.t | 16 +++++++++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) 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__ -- 2.7.4