Skip to content

Commit

Permalink
simple rescue+while+break should not use throw
Browse files Browse the repository at this point in the history
609de71 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.
  • Loading branch information
ko1 committed May 21, 2021
1 parent 9edad0d commit e473fa0
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 5 deletions.
12 changes: 7 additions & 5 deletions compile.c
Original file line number Diff line number Diff line change
Expand Up @@ -5409,12 +5409,14 @@ 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;
}
else {
return true;
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;
}
}
return true;
}

static void
Expand Down
11 changes: 11 additions & 0 deletions test/ruby/test_exception.rb
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,17 @@ def test_exception_in_ensure_with_next
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
Expand Down

0 comments on commit e473fa0

Please sign in to comment.