mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
simple rescue+while+break should not use throw
609de71f04
fixes the issue by using
`throw` insn if `ensure` is used. However, that patch introduce
additional `throw` even if it is not needed. This patch solves
the issue.
This issue is pointed by @mame.
This commit is contained in:
parent
59b327aa58
commit
817764bd82
Notes:
git
2021-05-21 18:12:40 +09:00
2 changed files with 18 additions and 5 deletions
10
compile.c
10
compile.c
|
@ -5409,13 +5409,15 @@ add_ensure_range(rb_iseq_t *iseq, struct ensure_range *erange,
|
|||
static bool
|
||||
can_add_ensure_iseq(const rb_iseq_t *iseq)
|
||||
{
|
||||
if (ISEQ_COMPILE_DATA(iseq)->in_rescue && ISEQ_COMPILE_DATA(iseq)->ensure_node_stack) {
|
||||
return false;
|
||||
struct iseq_compile_data_ensure_node_stack *e;
|
||||
if (ISEQ_COMPILE_DATA(iseq)->in_rescue && (e = ISEQ_COMPILE_DATA(iseq)->ensure_node_stack) != NULL) {
|
||||
while (e) {
|
||||
if (e->ensure_node) return false;
|
||||
e = e->prev;
|
||||
}
|
||||
}
|
||||
else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
add_ensure_iseq(LINK_ANCHOR *const ret, rb_iseq_t *iseq, int is_return)
|
||||
|
|
|
@ -104,6 +104,17 @@ class TestException < Test::Unit::TestCase
|
|||
end
|
||||
end
|
||||
end
|
||||
|
||||
iseq = RubyVM::InstructionSequence.compile(<<-RUBY)
|
||||
begin
|
||||
while true
|
||||
break
|
||||
end
|
||||
rescue
|
||||
end
|
||||
RUBY
|
||||
|
||||
assert_equal false, iseq.to_a[13].any?{|(e,_)| e == :throw}
|
||||
end
|
||||
|
||||
def test_exception_in_ensure_with_redo
|
||||
|
|
Loading…
Add table
Reference in a new issue