diff options
author | Jean Boussier <jean.boussier@gmail.com> | 2020-02-03 12:29:37 +0100 |
---|---|---|
committer | NARUSE, Yui <naruse@airemix.jp> | 2020-03-15 19:35:24 +0900 |
commit | c6944377d798e088042f2944b81aa3fa8a4e5411 (patch) | |
tree | 387d2abf013d30ef746332487868eaff307cf512 /test | |
parent | d07a6dc10efa71123b36a4a3ff7d2ec6e52804d7 (diff) |
Fix SimpleDelegator respond_to? regression
In 2.6, SimpleDelegator would always use the target `respond_to?`
In 2.7.0 it doesn't if the target does not inherit from Object.
This breaks compatibility for delegated objects that inherit
from BasicObject and redefine `respond_to?`. [Bug #16606]
(cherry picked from commit f2552216d43040cd42bbb9fd484eab6c70856fe6)
Diffstat (limited to 'test')
-rw-r--r-- | test/test_delegate.rb | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/test/test_delegate.rb b/test/test_delegate.rb index 5660adc590..426a647808 100644 --- a/test/test_delegate.rb +++ b/test/test_delegate.rb @@ -331,6 +331,20 @@ class TestDelegateClass < Test::Unit::TestCase assert_raise(NoMethodError, /undefined method `foo' for/) { delegate.foo } end + def test_basicobject_respond_to + o = BasicObject.new + def o.bar + nil + end + + def o.respond_to?(method, include_private=false) + return false if method == :bar + ::Kernel.instance_method(:respond_to?).bind_call(self, method, include_private) + end + delegate = SimpleDelegator.new(o) + refute delegate.respond_to?(:bar) + end + def test_keyword_argument k = EnvUtil.labeled_class("Target") do def test(a, k:) [a, k]; end |