aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--lib/timeout.rb11
-rw-r--r--test/test_timeout.rb16
3 files changed, 27 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index da8beb82b2..b1937ed34e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Tue Aug 27 17:18:40 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/timeout.rb (Timeout#timeout): skip rescue clause only when no
+ exception class is given.
+
Tue Aug 27 17:02:58 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
* io.c (copy_stream_body): should write in binary mode. based on a
diff --git a/lib/timeout.rb b/lib/timeout.rb
index 97af8547f4..cf46c1db66 100644
--- a/lib/timeout.rb
+++ b/lib/timeout.rb
@@ -62,7 +62,9 @@ module Timeout
# a module method, so you can call it directly as Timeout.timeout().
def timeout(sec, klass = nil) #:yield: +sec+
return yield(sec) if sec == nil or sec.zero?
- bt = catch(ExitException.new) do |exception|
+ message = "execution expired"
+ e = Error
+ bt = catch((klass||ExitException).new) do |exception|
begin
x = Thread.current
y = Thread.start {
@@ -71,11 +73,12 @@ module Timeout
rescue => e
x.raise e
else
- # no message, not to make new instance.
- x.raise exception
+ x.raise exception, message
end
}
return yield(sec)
+ rescue (klass||ExitException) => e
+ e.backtrace
ensure
if y
y.kill
@@ -89,7 +92,7 @@ module Timeout
while THIS_FILE =~ bt[level]
bt.delete_at(level)
end
- raise((klass||Error), "execution expired", bt)
+ raise(e, message, bt)
end
module_function :timeout
diff --git a/test/test_timeout.rb b/test/test_timeout.rb
index 4c6065c232..9d51ca5be3 100644
--- a/test/test_timeout.rb
+++ b/test/test_timeout.rb
@@ -33,7 +33,7 @@ class TestTimeout < Test::Unit::TestCase
def test_skip_rescue
bug8730 = '[Bug #8730]'
e = nil
- assert_raise(Timeout::Error, bug8730) do
+ assert_raise_with_message(Timeout::Error, /execution expired/, bug8730) do
timeout 0.1 do
begin
sleep 3
@@ -43,4 +43,18 @@ class TestTimeout < Test::Unit::TestCase
end
assert_nil(e, bug8730)
end
+
+ def test_rescue_exit
+ exc = Class.new(RuntimeError)
+ e = nil
+ assert_nothing_raised(exc) do
+ timeout 0.1, exc do
+ begin
+ sleep 3
+ rescue exc => e
+ end
+ end
+ end
+ assert_raise_with_message(exc, /execution expired/) {raise e if e}
+ end
end