Skip to content

Commit aeb7689

Browse files
jeremyevansmatzbot
authored andcommitted
[ruby/forwardable] 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. ruby/forwardable@b606c3bf0a
1 parent 45fcb9d commit aeb7689

File tree

1 file changed

+6
-9
lines changed

1 file changed

+6
-9
lines changed

lib/forwardable.rb

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -192,9 +192,7 @@ def def_instance_delegator(accessor, method, ali = method)
192192

193193
# If it's not a class or module, it's an instance
194194
mod = Module === self ? self : singleton_class
195-
ret = mod.module_eval(&gen)
196-
mod.__send__(:ruby2_keywords, ali) if RUBY_VERSION >= '2.7'
197-
ret
195+
mod.module_eval(&gen)
198196
end
199197

200198
alias delegate instance_delegate
@@ -211,7 +209,8 @@ def self._delegator_method(obj, accessor, method, ali)
211209
accessor = "#{accessor}()"
212210
end
213211

214-
method_call = ".__send__(:#{method}, *args, &block)"
212+
args = RUBY_VERSION >= '2.7' ? '...' : '*args, &block'
213+
method_call = ".__send__(:#{method}, #{args})"
215214
if _valid_method?(method)
216215
loc, = caller_locations(2,1)
217216
pre = "_ ="
@@ -222,15 +221,15 @@ def self._delegator_method(obj, accessor, method, ali)
222221
::Kernel.warn #{mesg.dump}"\#{_.class}"'##{method}', uplevel: 1
223222
_#{method_call}
224223
else
225-
_.#{method}(*args, &block)
224+
_.#{method}(#{args})
226225
end
227226
end;
228227
end
229228

230229
_compile_method("#{<<-"begin;"}\n#{<<-"end;"}", __FILE__, __LINE__+1)
231230
begin;
232231
proc do
233-
def #{ali}(*args, &block)
232+
def #{ali}(#{args})
234233
#{pre}
235234
begin
236235
#{accessor}
@@ -312,9 +311,7 @@ def def_single_delegators(accessor, *methods)
312311
def def_single_delegator(accessor, method, ali = method)
313312
gen = Forwardable._delegator_method(self, accessor, method, ali)
314313

315-
ret = instance_eval(&gen)
316-
singleton_class.__send__(:ruby2_keywords, ali) if RUBY_VERSION >= '2.7'
317-
ret
314+
instance_eval(&gen)
318315
end
319316

320317
alias delegate single_delegate

0 commit comments

Comments
 (0)