summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorJean Boussier <jean.boussier@gmail.com>2020-02-03 12:29:37 +0100
committerNARUSE, Yui <naruse@airemix.jp>2020-03-15 19:35:24 +0900
commitc6944377d798e088042f2944b81aa3fa8a4e5411 (patch)
tree387d2abf013d30ef746332487868eaff307cf512 /lib
parentd07a6dc10efa71123b36a4a3ff7d2ec6e52804d7 (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 'lib')
-rw-r--r--lib/delegate.rb9
1 files changed, 8 insertions, 1 deletions
diff --git a/lib/delegate.rb b/lib/delegate.rb
index 63657646e1..1587c7e3bb 100644
--- a/lib/delegate.rb
+++ b/lib/delegate.rb
@@ -103,13 +103,20 @@ class Delegator < BasicObject
r
end
+ KERNEL_RESPOND_TO = ::Kernel.instance_method(:respond_to?)
+ private_constant :KERNEL_RESPOND_TO
+
# Handle BasicObject instances
private def target_respond_to?(target, m, include_private)
case target
when Object
target.respond_to?(m, include_private)
else
- ::Kernel.instance_method(:respond_to?).bind_call(target, m, include_private)
+ if KERNEL_RESPOND_TO.bind_call(target, :respond_to?)
+ target.respond_to?(m, include_private)
+ else
+ KERNEL_RESPOND_TO.bind_call(target, m, include_private)
+ end
end
end