diff options
author | nagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-12-22 06:45:28 +0000 |
---|---|---|
committer | nagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-12-22 06:45:28 +0000 |
commit | 6a35c26b2dfbd2a516e450e916eb8d13c3ff5ddf (patch) | |
tree | b48d3759a8b0e5031ad058f26ff129166803de1d | |
parent | a44e41e8316820b51e183939d64b15ef68b321b2 (diff) | |
download | ruby-6a35c26b2dfbd2a516e450e916eb8d13c3ff5ddf.tar.gz |
* cont.c (rb_fiber_start): in case of jump with TAG_FATAL,
enqueue error into async_errinfo_queue, because you cannot call
TH_TAG_JUMP() in this function. [ruby-dev:45218] [Bug #5993]
* thread.c (rb_threadptr_execute_interrupts): now INT2FIX(TAG_FATAL)
can be popped from async_errinfo_queue.
* vm.c (rb_vm_make_jump_tag_but_local_jump): revert r38441.
rb_vm_make_jump_tag_but_local_jump() shouldn't return exception
in case of state == TAG_FATAL.
* test/ruby/test_fiber.rb (test_exit_in_fiber): fix a test to illuminate
Thread.exit should terminate current Thread.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@38550 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 16 | ||||
-rw-r--r-- | cont.c | 3 | ||||
-rw-r--r-- | test/ruby/test_fiber.rb | 2 | ||||
-rw-r--r-- | thread.c | 5 | ||||
-rw-r--r-- | vm.c | 5 |
5 files changed, 23 insertions, 8 deletions
@@ -1,3 +1,19 @@ +Wed Dec 19 02:34:48 2012 CHIKANAGA Tomoyuki <nagachika@ruby-lang.org> + + * cont.c (rb_fiber_start): in case of jump with TAG_FATAL, + enqueue error into async_errinfo_queue, because you cannot call + TH_TAG_JUMP() in this function. [ruby-dev:45218] [Bug #5993] + + * thread.c (rb_threadptr_execute_interrupts): now INT2FIX(TAG_FATAL) + can be popped from async_errinfo_queue. + + * vm.c (rb_vm_make_jump_tag_but_local_jump): revert r38441. + rb_vm_make_jump_tag_but_local_jump() shouldn't return exception + in case of state == TAG_FATAL. + + * test/ruby/test_fiber.rb (test_exit_in_fiber): fix a test to illuminate + Thread.exit should terminate current Thread. + Sat Dec 22 13:15:08 2012 Hiroshi Shirosaki <h.shirosaki@gmail.com> * gc.c (obj_id_to_ref): add a macro to treat Bignum object id. @@ -1164,6 +1164,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 4288cabe09..b6beca8d49 100644 --- a/test/ruby/test_fiber.rb +++ b/test/ruby/test_fiber.rb @@ -267,7 +267,7 @@ if false 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 @@ -1834,8 +1834,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 { @@ -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; } |