Actions
Bug #21873
closed`UnboundMethod#==` returns false for methods from included/extended modules
Bug #21873:
`UnboundMethod#==` returns false for methods from included/extended modules
Description
Description¶
UnboundMethod#== returns false when comparing a module's instance method against the same method obtained via Method#unbind on a class that includes or extends that module, despite having the same owner and source location.
module MyMethods
def hello = "hello"
end
class Base
extend MyMethods
end
from_module = MyMethods.instance_method(:hello)
from_unbind = Base.method(:hello).unbind
p from_module.owner == from_unbind.owner #=> true
p from_module.source_location == from_unbind.source_location #=> true
p from_module.inspect == from_unbind.inspect #=> true
p from_module == from_unbind #=> false (expected true)
Diagnosis¶
method_eq compares method entries using method_entry_defined_class. For methods mixed in via include/extend, the "defined class" will be an ICLASS and not the original class/module. In the example above, method_eq is comparing a module's ICLASS entry against the module, and that will always be false.
Related: #18798 (fixed by @ko1 (Koichi Sasada) in 59e389af).
Actions