diff --git a/cont.c b/cont.c index be8c982..5ad9f6e 100644 --- a/cont.c +++ b/cont.c @@ -1172,6 +1172,9 @@ rb_fiber_start(void) if (state == TAG_RAISE) { rb_threadptr_async_errinfo_enque(th, th->errinfo); } + else if (state == TAG_FATAL) { + rb_threadptr_async_errinfo_enque(th, th->errinfo); + } else { VALUE err = rb_vm_make_jump_tag_but_local_jump(state, th->errinfo); if (!NIL_P(err)) diff --git a/test/ruby/test_fiber.rb b/test/ruby/test_fiber.rb index ac28059..dfdf54b 100644 --- a/test/ruby/test_fiber.rb +++ b/test/ruby/test_fiber.rb @@ -266,7 +266,7 @@ class TestFiber < Test::Unit::TestCase def test_exit_in_fiber bug5993 = '[ruby-dev:45218]' assert_nothing_raised(bug5993) do - Thread.new{ Fiber.new{ Thread.exit }.resume }.join + Thread.new{ Fiber.new{ Thread.exit }.resume; raise "unreachable" }.join end end diff --git a/thread.c b/thread.c index c94c10c..1df1ccf 100644 --- a/thread.c +++ b/thread.c @@ -1836,8 +1836,9 @@ rb_threadptr_execute_interrupts(rb_thread_t *th, int blocking_timing) if (err == Qundef) { /* no error */ } - else if (err == eKillSignal /* Thread#kill receieved */ || - err == eTerminateSignal /* Terminate thread */ ) { + else if (err == eKillSignal /* Thread#kill receieved */ || + err == eTerminateSignal /* Terminate thread */ || + err == INT2FIX(TAG_FATAL) /* Thread.exit etc. */ ) { rb_threadptr_to_kill(th); } else { diff --git a/vm.c b/vm.c index abcdf34..1d1af34 100644 --- a/vm.c +++ b/vm.c @@ -917,11 +917,6 @@ rb_vm_make_jump_tag_but_local_jump(int state, VALUE val) case TAG_RETRY: result = make_localjump_error("retry outside of rescue clause", Qnil, state); break; - case TAG_FATAL: - /* internal exception or Thread.exit */ - /* Thread.exit set th->errinfo to INT2FIX(TAG_FATAL) */ - if (!FIXNUM_P(val)) - result = val; default: break; }