From f2552216d43040cd42bbb9fd484eab6c70856fe6 Mon Sep 17 00:00:00 2001 From: Jean Boussier Date: Mon, 3 Feb 2020 12:29:37 +0100 Subject: 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?`. --- lib/delegate.rb | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'lib/delegate.rb') diff --git a/lib/delegate.rb b/lib/delegate.rb index b7d48effb4..e3b3488c16 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 -- cgit v1.2.3