From b606c3bf0a131bf2ebc14306a3d3ae2e6838fc4b Mon Sep 17 00:00:00 2001 From: Jeremy Evans Date: Mon, 19 Aug 2024 15:03:43 -0700 Subject: [PATCH] Use generic argument forwarding (...) instead of ruby2_keywords on Ruby 2.7+ On Ruby 3.4+, generic argument forwarding is significantly faster as it does not allocate. --- lib/forwardable.rb | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/lib/forwardable.rb b/lib/forwardable.rb index 71b4e6a..8e74e84 100644 --- a/lib/forwardable.rb +++ b/lib/forwardable.rb @@ -190,9 +190,7 @@ def def_instance_delegator(accessor, method, ali = method) # If it's not a class or module, it's an instance mod = Module === self ? self : singleton_class - ret = mod.module_eval(&gen) - mod.__send__(:ruby2_keywords, ali) if RUBY_VERSION >= '2.7' - ret + mod.module_eval(&gen) end alias delegate instance_delegate @@ -209,7 +207,8 @@ def self._delegator_method(obj, accessor, method, ali) accessor = "#{accessor}()" end - method_call = ".__send__(:#{method}, *args, &block)" + args = RUBY_VERSION >= '2.7' ? '...' : '*args, &block' + method_call = ".__send__(:#{method}, #{args})" if _valid_method?(method) loc, = caller_locations(2,1) pre = "_ =" @@ -220,7 +219,7 @@ def self._delegator_method(obj, accessor, method, ali) ::Kernel.warn #{mesg.dump}"\#{_.class}"'##{method}', uplevel: 1 _#{method_call} else - _.#{method}(*args, &block) + _.#{method}(#{args}) end end; end @@ -228,7 +227,7 @@ def self._delegator_method(obj, accessor, method, ali) _compile_method("#{<<-"begin;"}\n#{<<-"end;"}", __FILE__, __LINE__+1) begin; proc do - def #{ali}(*args, &block) + def #{ali}(#{args}) #{pre} begin #{accessor} @@ -310,9 +309,7 @@ def def_single_delegators(accessor, *methods) def def_single_delegator(accessor, method, ali = method) gen = Forwardable._delegator_method(self, accessor, method, ali) - ret = instance_eval(&gen) - singleton_class.__send__(:ruby2_keywords, ali) if RUBY_VERSION >= '2.7' - ret + instance_eval(&gen) end alias delegate single_delegate