Skip to content

Commit 244c2c9

Browse files
authored
Merge pull request #49 from luke-gruber/delegate_class_ractors
Allow use of DelegateClass in ractors
2 parents 707fb0d + cad1942 commit 244c2c9

File tree

2 files changed

+24
-2
lines changed

2 files changed

+24
-2
lines changed

lib/delegate.rb

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -345,10 +345,16 @@ def __setobj__(obj)
345345
end
346346

347347
def Delegator.delegating_block(mid) # :nodoc:
348-
lambda do |*args, &block|
348+
prok = lambda do |*args, &block|
349349
target = self.__getobj__
350350
target.__send__(mid, *args, &block)
351-
end.ruby2_keywords
351+
end
352+
prok.ruby2_keywords
353+
if defined?(Ractor.shareable_proc)
354+
Ractor.shareable_proc(&prok)
355+
else
356+
prok
357+
end
352358
end
353359

354360
#

test/test_delegate.rb

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -390,4 +390,20 @@ def test(a, k:) [a, k]; end
390390
a = DelegateClass(k).new(k.new)
391391
assert_equal([1, 0], a.test(1, k: 0))
392392
end
393+
394+
def test_delegate_class_can_be_used_in_ractors
395+
omit "no Ractor#value" unless defined?(Ractor) && Ractor.method_defined?(:value)
396+
require_path = File.expand_path(File.join(__dir__, "..", "lib", "delegate.rb"))
397+
raise "file doesn't exist: #{require_path}" unless File.exist?(require_path)
398+
assert_ractor <<-RUBY
399+
require "#{require_path}"
400+
class MyClass < DelegateClass(Array);end
401+
values = 2.times.map do
402+
Ractor.new do
403+
MyClass.new([1,2,3]).at(0)
404+
end
405+
end.map(&:value)
406+
assert_equal [1,1], values
407+
RUBY
408+
end
393409
end

0 commit comments

Comments
 (0)