diff options
author | tarui <tarui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-12-05 09:54:58 +0000 |
---|---|---|
committer | tarui <tarui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-12-05 09:54:58 +0000 |
commit | 17a11774ca9bc79609128187e3b6c814bd590ce5 (patch) | |
tree | 3a5f149e17583cdd935defe5d1d0f9bbfbfd360c | |
parent | 592e87e1f8cbe257f8f11d703c1315b033537b6c (diff) |
* thread.c (rb_thread_s_async_interrupt_timing): have to check ints before jumpping out.
* test/ruby/test_thread.rb (test_async_interrupt_with_return): add test
rescue has to catch a queued async exception at the time of return.
* test/ruby/test_thread.rb (test_async_interrupt_with_break): add test
rescue has to catch a queued async exception at the time of break.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@38210 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 9 | ||||
-rw-r--r-- | test/ruby/test_thread.rb | 28 | ||||
-rw-r--r-- | thread.c | 4 |
3 files changed, 39 insertions, 2 deletions
@@ -1,3 +1,12 @@ +Wed Dec 5 18:53:00 2012 Masaya Tarui <tarui@ruby-lang.org> + + * thread.c (rb_thread_s_async_interrupt_timing): have to check ints + before jumpping out. + * test/ruby/test_thread.rb (test_async_interrupt_with_return): add test + rescue has to catch a queued async exception at the time of return. + * test/ruby/test_thread.rb (test_async_interrupt_with_break): add test + rescue has to catch a queued async exception at the time of break. + Wed Dec 5 16:54:28 2012 Koichi Sasada <ko1@atdot.net> * test/ruby/memory_status.rb: suppress warning. diff --git a/test/ruby/test_thread.rb b/test/ruby/test_thread.rb index bff34b3b25..454229ae85 100644 --- a/test/ruby/test_thread.rb +++ b/test/ruby/test_thread.rb @@ -563,6 +563,34 @@ class TestThread < Test::Unit::TestCase Thread.async_interrupt_timing([]) {} # array } end + + def for_test_async_interrupt_with_return + Thread.async_interrupt_timing(Object => :defer){ + Thread.current.raise RuntimeError.new("have to be rescured") + return + } + rescue + end + + def test_async_interrupt_with_return + assert_nothing_raised do + for_test_async_interrupt_with_return + dummy_for_check_ints=nil + end + end + + def test_async_interrupt_with_break + assert_nothing_raised do + begin + Thread.async_interrupt_timing(Object => :defer){ + Thread.current.raise RuntimeError.new("have to be rescured") + break + } + rescue + end + dummy_for_check_ints=nil + end + end def test_async_interrupt_blocking r=:ng @@ -1686,12 +1686,12 @@ rb_thread_s_async_interrupt_timing(VALUE self, VALUE mask_arg) RUBY_VM_SET_INTERRUPT(th); } + RUBY_VM_CHECK_INTS(th); + if (state) { JUMP_TAG(state); } - RUBY_VM_CHECK_INTS(th); - return r; } |