timeout.rb: fix for ExitException

* lib/timeout.rb (Timeout#timeout): should not rescue ordinarily
  raised ExitException, which should not be thrown.
* lib/timeout.rb (Timeout::ExitException.catch): set @thread only if
  it ought to be caught.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@44518 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2014-01-07 03:43:08 +00:00
Родитель 9f5537c5b3
Коммит 97c0aaea71
3 изменённых файлов: 29 добавлений и 8 удалений

Просмотреть файл

@ -1,4 +1,10 @@
Tue Jan 7 12:42:35 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
Tue Jan 7 12:43:06 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
* lib/timeout.rb (Timeout#timeout): should not rescue ordinarily
raised ExitException, which should not be thrown.
* lib/timeout.rb (Timeout::ExitException.catch): set @thread only if
it ought to be caught.
* lib/timeout.rb (Timeout#timeout): when a custom exception is given,
no instance is needed to be caught, so defer creating new instance

Просмотреть файл

@ -28,10 +28,11 @@ module Timeout
class ExitException < ::Exception # :nodoc:
attr_reader :klass, :thread
def initialize(*)
super
@thread = Thread.current
freeze
def self.catch
exc = new
exc.instance_variable_set(:@thread, Thread.current)
exc.freeze
::Kernel.catch(exc) {yield exc}
end
def exception(*)
@ -80,8 +81,6 @@ module Timeout
end
}
return yield(sec)
rescue klass => e
e.backtrace
ensure
if y
y.kill
@ -89,7 +88,15 @@ module Timeout
end
end
end
bt = klass ? bl.call(klass) : catch((klass = ExitException).new, &bl)
if klass
begin
bl.call(klass)
rescue klass => e
bt = e.backtrace
end
else
bt = ExitException.catch(&bl)
end
rej = /\A#{Regexp.quote(__FILE__)}:#{__LINE__-4}\z/o
bt.reject! {|m| rej =~ m}
level = -caller(CALLER_OFFSET).size

Просмотреть файл

@ -67,4 +67,12 @@ class TestTimeout < Test::Unit::TestCase
assert_equal(:ok, timeout(100, err) {:ok})
end
end
def test_exit_exception
assert_raise_with_message(Timeout::ExitException, "boon") do
Timeout.timeout(10, Timeout::ExitException) do
raise Timeout::ExitException, "boon"
end
end
end
end