Project

General

Profile

Actions

Bug #13656

closed

Method#super_method returns incorrect result dependent on unrelated module

Added by ccutrer (Cody Cutrer) almost 7 years ago. Updated almost 7 years ago.

Status:
Closed
Assignee:
-
Target version:
-
ruby -v:
ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-darwin16]
[ruby-core:81666]

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

Also available in: Atom PDF

Like0
Like0Like0Like0Like0