summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog9
-rw-r--r--test/ruby/test_thread.rb28
-rw-r--r--thread.c4
3 files changed, 39 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index a40c566912..04d075e401 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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
diff --git a/thread.c b/thread.c
index 82ca1170fb..8fd4580ab2 100644
--- a/thread.c
+++ b/thread.c
@@ -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;
}