[ruby/timeout] Make Timeout::Error#exception with multiple arguments not ignore arguments

This makes:

  raise(Timeout::Error.new("hello"), "world")

raise a TimeoutError instance with "world" as the message instead
of "hello", for consistency with other Ruby exception classes.

This required some internal changes to keep the tests passing.

Fixes [Bug #17812]

https://github.com/ruby/timeout/commit/952154dbf9
This commit is contained in:
Jeremy Evans 2021-04-20 10:34:11 -07:00 коммит произвёл Hiroshi SHIBATA
Родитель a42b7de436
Коммит 33b5e179a8
2 изменённых файлов: 14 добавлений и 3 удалений

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

@ -32,7 +32,9 @@ module Timeout
def self.catch(*args)
exc = new(*args)
exc.instance_variable_set(:@thread, Thread.current)
::Kernel.catch(exc) {yield exc}
catch_value = Object.new
exc.instance_variable_set(:@catch_value, catch_value)
::Kernel.catch(catch_value) {yield exc}
end
def exception(*)
@ -40,11 +42,11 @@ module Timeout
if self.thread == Thread.current
bt = caller
begin
throw(self, bt)
throw(@catch_value, bt)
rescue UncaughtThrowError
end
end
self
super
end
end
@ -115,6 +117,7 @@ module Timeout
begin
bl.call(klass)
rescue klass => e
message = e.message
bt = e.backtrace
end
else

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

@ -80,6 +80,14 @@ class TestTimeout < Test::Unit::TestCase
end
end
def test_raise_with_message
bug17812 = '[ruby-core:103502] [Bug #17812]: Timeout::Error doesn\'t let two-argument raise() set a new message'
exc = Timeout::Error.new('foo')
assert_raise_with_message(Timeout::Error, 'bar', bug17812) do
raise exc, 'bar'
end
end
def test_enumerator_next
bug9380 = '[ruby-dev:47872] [Bug #9380]: timeout in Enumerator#next'
e = (o=Object.new).to_enum