summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-12-22 06:45:28 +0000
committernagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-12-22 06:45:28 +0000
commit6a35c26b2dfbd2a516e450e916eb8d13c3ff5ddf (patch)
treeb48d3759a8b0e5031ad058f26ff129166803de1d
parenta44e41e8316820b51e183939d64b15ef68b321b2 (diff)
* 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--ChangeLog16
-rw-r--r--cont.c3
-rw-r--r--test/ruby/test_fiber.rb2
-rw-r--r--thread.c5
-rw-r--r--vm.c5
5 files changed, 23 insertions, 8 deletions
diff --git a/ChangeLog b/ChangeLog
index 59a8011401..01cdced1e5 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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.
diff --git a/cont.c b/cont.c
index f826cb96d5..8521a07d76 100644
--- a/cont.c
+++ b/cont.c
@@ -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
diff --git a/thread.c b/thread.c
index efc675fd8b..86a4349775 100644
--- a/thread.c
+++ b/thread.c
@@ -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 {
diff --git a/vm.c b/vm.c
index ca79a37b0e..a3e25ba52d 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;
}