mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
[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:
parent
a42b7de436
commit
33b5e179a8
2 changed files with 14 additions and 3 deletions
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue