Skip to content

Commit aa8161a

Browse files
committed
Allow use of DelegateClass in ractor
Use `eval` instead of `define_method` when defining delegate methods for `DelegateClass`.
1 parent fa35b20 commit aa8161a

1 file changed

Lines changed: 9 additions & 11 deletions

File tree

lib/delegate.rb

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -344,17 +344,15 @@ def __setobj__(obj)
344344
end
345345
end
346346

347-
def Delegator.delegating_block(mid) # :nodoc:
348-
prok = lambda do |*args, &block|
347+
def Delegator.delegating_code(mid) # :nodoc:
348+
line = __LINE__+2
349+
src = <<~RUBY
350+
ruby2_keywords def #{mid}(*args, &block)
349351
target = self.__getobj__
350-
target.__send__(mid, *args, &block)
351-
end
352-
prok.ruby2_keywords
353-
if defined?(Ractor.shareable_proc)
354-
Ractor.shareable_proc(&prok)
355-
else
356-
prok
352+
target.__send__(:'#{mid}', *args, &block)
357353
end
354+
RUBY
355+
[src, __FILE__, line]
358356
end
359357

360358
#
@@ -418,11 +416,11 @@ def __setobj__(obj) # :nodoc:
418416
@delegate_dc_obj = obj
419417
end
420418
protected_instance_methods.each do |method|
421-
define_method(method, Delegator.delegating_block(method))
419+
module_eval(*Delegator.delegating_code(method))
422420
protected method
423421
end
424422
public_instance_methods.each do |method|
425-
define_method(method, Delegator.delegating_block(method))
423+
module_eval(*Delegator.delegating_code(method))
426424
end
427425
end
428426
klass.define_singleton_method :public_instance_methods do |all=true|

0 commit comments

Comments
 (0)