diff --git a/compile.c b/compile.c index e8bb023b78..d2de521ec8 100644 --- a/compile.c +++ b/compile.c @@ -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 diff --git a/test/ruby/test_exception.rb b/test/ruby/test_exception.rb index af29163ce3..8c4e6889ab 100644 --- a/test/ruby/test_exception.rb +++ b/test/ruby/test_exception.rb @@ -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