From ab3dcaa056b86f4f93c5e4731f69b91b52e2c578 Mon Sep 17 00:00:00 2001 From: Luke Gruber Date: Wed, 17 Dec 2025 16:34:16 -0500 Subject: [PATCH] Allow use of DelegateClass in ractor Use `eval` instead of `define_method` when defining delegate methods for `DelegateClass`. --- lib/delegate.rb | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/lib/delegate.rb b/lib/delegate.rb index 5ba94da..8472bb2 100644 --- a/lib/delegate.rb +++ b/lib/delegate.rb @@ -344,17 +344,15 @@ def __setobj__(obj) end end -def Delegator.delegating_block(mid) # :nodoc: - prok = lambda do |*args, &block| +def Delegator.delegating_code(mid) # :nodoc: + line = __LINE__+2 + src = <<~RUBY + ruby2_keywords def #{mid}(*args, &block) target = self.__getobj__ - target.__send__(mid, *args, &block) - end - prok.ruby2_keywords - if defined?(Ractor.shareable_proc) - Ractor.shareable_proc(&prok) - else - prok + target.__send__(:'#{mid}', *args, &block) end + RUBY + [src, __FILE__, line] end # @@ -433,7 +431,7 @@ def __setobj__(obj) # :nodoc: class_eval(source.join(";"), __FILE__, __LINE__) special.each do |method| - define_method(method, Delegator.delegating_block(method)) + module_eval(*Delegator.delegating_code(method)) end protected(*protected_instance_methods)