From: cody@... Date: 2017-06-13T16:40:30+00:00 Subject: [ruby-core:81666] [Ruby trunk Bug#13656] Method#super_method returns incorrect result dependent on unrelated module Issue #13656 has been reported by ccutrer (Cody Cutrer). ---------------------------------------- Bug #13656: Method#super_method returns incorrect result dependent on unrelated module https://bugs.ruby-lang.org/issues/13656 * Author: ccutrer (Cody Cutrer) * Status: Open * Priority: Normal * Assignee: * Target version: * ruby -v: ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-darwin16] * Backport: 2.2: UNKNOWN, 2.3: UNKNOWN, 2.4: UNKNOWN ---------------------------------------- ~~~ 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. -- https://bugs.ruby-lang.org/ Unsubscribe: