[前][次][番号順一覧][スレッド一覧]

ruby-changes:66083

From: Jeremy <ko1@a...>
Date: Thu, 6 May 2021 17:08:43 +0900 (JST)
Subject: [ruby-changes:66083] 33b5e179a8 (master): [ruby/timeout] Make Timeout::Error#exception with multiple arguments not ignore arguments

https://git.ruby-lang.org/ruby.git/commit/?id=33b5e179a8

From 33b5e179a88e67f1ee12e2e8993121b2f445b54f Mon Sep 17 00:00:00 2001
From: Jeremy Evans <code@j...>
Date: Tue, 20 Apr 2021 10:34:11 -0700
Subject: [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
---
 lib/timeout.rb       | 9 ++++++---
 test/test_timeout.rb | 8 ++++++++
 2 files changed, 14 insertions(+), 3 deletions(-)

diff --git a/lib/timeout.rb b/lib/timeout.rb
index 11db4be..572e90c 100644
--- a/lib/timeout.rb
+++ b/lib/timeout.rb
@@ -32,7 +32,9 @@ module Timeout https://github.com/ruby/ruby/blob/trunk/lib/timeout.rb#L32
     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 https://github.com/ruby/ruby/blob/trunk/lib/timeout.rb#L42
       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 https://github.com/ruby/ruby/blob/trunk/lib/timeout.rb#L117
       begin
         bl.call(klass)
       rescue klass => e
+        message = e.message
         bt = e.backtrace
       end
     else
diff --git a/test/test_timeout.rb b/test/test_timeout.rb
index c57d90c..71607ed 100644
--- a/test/test_timeout.rb
+++ b/test/test_timeout.rb
@@ -80,6 +80,14 @@ class TestTimeout < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/test_timeout.rb#L80
     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
-- 
cgit v1.1


--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]