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,12 +5409,14 @@ add_ensure_range(rb_iseq_t *iseq, struct ensure_range *erange,
|
||||||
static bool
|
static bool
|
||||||
can_add_ensure_iseq(const rb_iseq_t *iseq)
|
can_add_ensure_iseq(const rb_iseq_t *iseq)
|
||||||
{
|
{
|
||||||
if (ISEQ_COMPILE_DATA(iseq)->in_rescue && ISEQ_COMPILE_DATA(iseq)->ensure_node_stack) {
|
struct iseq_compile_data_ensure_node_stack *e;
|
||||||
return false;
|
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;
|
return true;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
|
@ -104,6 +104,17 @@ class TestException < Test::Unit::TestCase
|
||||||
end
|
end
|
||||||
end
|
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
|
end
|
||||||
|
|
||||||
def test_exception_in_ensure_with_redo
|
def test_exception_in_ensure_with_redo
|
||||||
|
|
Loading…
Add table
Reference in a new issue