Fix DRbServer#any_to_s

My previous fix in d0ed935d5bf8c3fce9800742a36e44fb7f63dda4 was
not correct, as pointed out by cremno on GitHub.

This simplifies things by just using Kernel#to_s.  Also switch to
bind_call(obj) instead of bind(obj).call for better performance.
This commit is contained in:
Jeremy Evans 2019-10-14 09:00:42 -07:00
parent 567e312d1f
commit d5744aff3a
Notes: git 2019-10-17 04:51:34 +09:00
2 changed files with 16 additions and 8 deletions

View File

@ -1606,15 +1606,9 @@ module DRb
# Coerce an object to a string, providing our own representation if # Coerce an object to a string, providing our own representation if
# to_s is not defined for the object. # to_s is not defined for the object.
def any_to_s(obj) def any_to_s(obj)
obj.to_s + ":#{obj.class}" "#{obj}:#{obj.class}"
rescue rescue
case obj Kernel.instance_method(:to_s).bind_call(obj)
when Object
klass = obj.class
else
klass = Kernel.instance_method(:class).bind(obj).call
end
sprintf("#<%s:0x%dx>", klass, obj.__id__)
end end
# Check that a method is callable via dRuby. # Check that a method is callable via dRuby.

View File

@ -327,6 +327,20 @@ class TestBug4409 < Test::Unit::TestCase
end end
end end
class TestDRbAnyToS < Test::Unit::TestCase
class BO < BasicObject
end
def test_any_to_s
server = DRb::DRbServer.new('druby://:0')
server.singleton_class.send(:public, :any_to_s)
assert_equal("foo:String", server.any_to_s("foo"))
assert_match(/\A#<DRbTests::TestDRbAnyToS::BO:0x[0-9a-f]+>\z/, server.any_to_s(BO.new))
server.stop_service
server.thread.join
end
end
class TestDRbTCP < Test::Unit::TestCase class TestDRbTCP < Test::Unit::TestCase
def test_immediate_close def test_immediate_close
server = DRb::DRbServer.new('druby://:0') server = DRb::DRbServer.new('druby://:0')