Project

General

Profile

Actions

Bug #21873

closed

`UnboundMethod#==` returns false for methods from included/extended modules

Bug #21873: `UnboundMethod#==` returns false for methods from included/extended modules

Added by mdalessio (Mike Dalessio) 3 days ago. Updated 2 days ago.

Status:
Closed
Assignee:
-
Target version:
-
[ruby-core:124741]

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

Also available in: PDF Atom