[ruby/forwardable] Make def_{instance,single}_delegators skip :__send__ and :__id__

Previously, __send__ and __id__ were skipped if provided as strings,
but not skipped if provided as symbols.

Fixes Ruby Bug 8855.

https://github.com/ruby/forwardable/commit/2e61c8c66c
This commit is contained in:
Jeremy Evans 2019-08-15 15:21:55 -07:00 коммит произвёл Hiroshi SHIBATA
Родитель b15e0983f7
Коммит d00551a7bb
2 изменённых файлов: 28 добавлений и 6 удалений

Просмотреть файл

@ -149,9 +149,8 @@ module Forwardable
# def_delegator :@records, :map
#
def def_instance_delegators(accessor, *methods)
methods.delete("__send__")
methods.delete("__id__")
for method in methods
methods.each do |method|
next if method.to_s == "__send__" || method.to_s == "__id__"
def_instance_delegator(accessor, method)
end
end
@ -286,9 +285,8 @@ module SingleForwardable
# def_delegator :@records, :map
#
def def_single_delegators(accessor, *methods)
methods.delete("__send__")
methods.delete("__id__")
for method in methods
methods.each do |method|
next if method.to_s == "__send__" || method.to_s == "__id__"
def_single_delegator(accessor, method)
end
end

Просмотреть файл

@ -107,6 +107,18 @@ class TestForwardable < Test::Unit::TestCase
end
end
def test_def_instance_delegators_send_id
%i[def_delegators def_instance_delegators].each do |m|
cls = forwardable_class do
attr_reader :receiver
__send__ m, :@receiver, :__send__, :__id__
end
assert_not_equal cls.new.__id__, cls.new.receiver.__id__
assert_not_equal cls.new.__send__(:__id__), cls.new.receiver.__send__(:__id__)
end
end
def test_instance_delegate
%i[delegate instance_delegate].each do |m|
cls = forwardable_class do
@ -215,6 +227,18 @@ class TestForwardable < Test::Unit::TestCase
end
end
def test_obj_single_delegators_send_id
%i[def_delegators def_single_delegators].each do |m|
obj = single_forwardable_object do
singleton_class.attr_reader :receiver
__send__ m, :@receiver, :__send__, :__id__
end
assert_not_equal obj.__id__, obj.receiver.__id__
assert_not_equal obj.__send__(:__id__), obj.receiver.__send__(:__id__)
end
end
def test_obj_single_delegate
%i[delegate single_delegate].each do |m|
obj = single_forwardable_object do