1
0
Fork 0
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:
Koichi Sasada 2021-05-18 17:11:39 +09:00
parent 59b327aa58
commit 817764bd82
Notes: git 2021-05-21 18:12:40 +09:00
2 changed files with 18 additions and 5 deletions

View file

@ -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)

View file

@ -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