Actions
Bug #13656
closedMethod#super_method returns incorrect result dependent on unrelated module
Bug #13656:
Method#super_method returns incorrect result dependent on unrelated module
Status:
Closed
Assignee:
-
Target version:
-
ruby -v:
ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-darwin16]
Backport:
Description
module Calculations
def pluck
puts "calculations"
end
end
module Calculations2
def pluck
puts "calculations2"
super
end
end
class Relation
include Calculations
end
Relation.prepend(Calculations2)
class CollectionProxy < Relation
def pluck
puts "collection_proxy"
super
end
end
module CollectionProxy2
def unrelated
end
end
# this is the critical line
CollectionProxy.prepend(CollectionProxy2)
ConcreteProxy = Class.new(CollectionProxy)
# these are the expected results
ConcreteProxy.new.method(:pluck).owner == CollectionProxy
ConcreteProxy.new.method(:pluck).super_method.owner == Calculations2
ConcreteProxy.new.method(:pluck).super_method.super_method.owner == Calculations
The critical line is the CollectionProxy2 module. If I don't prepend it into CollectionProxy (or if I include it instead of prepend it), the expected results pass. But when it is prepended, the owner for all super_methods will always be CollectionProxy, as if it can't find any more ancestors (if you actually call ConcreteProxy.new.pluck it does call the three methods, in the correct order). So this is an introspection only problem.
Actions