Bug #5236
closedIncluding a module in a superclass after it has been included in a subclass leads to infinite recursion if the module uses `super`
Description
Under these particular circumstances, you get infinite recursion and a system stack error on 1.9 but not 1.8:
- Create a module that has a method that uses
super
- Include that module in a class after it has already been included in one of its subclasses
- Instantiate an object of said subclass and call the method
On 1.8, the super
works as expected. On 1.9 you get a SystemStackError. Here's example code that demonstrates the issue:
example.rb¶
module MyModule
def some_method; super; end
end
class MyBaseClass; end
class MySubClass < MyBaseClass;
include MyModule
end
To trigger this bug, we must include the module in the base class after¶
the module has already been included in the subclass. If we move this line¶
above the subclass declaration, this bug will not occur.¶
MyBaseClass.send(:include, MyModule)
MySubClass.new.some_method
The output¶
➜ ruby --version
ruby 1.8.7 (2011-02-18 patchlevel 334) [i686-darwin10.6.0]
➜ ruby example.rb
example.rb:2:in some_method': super: no superclass method
some_method' for #MySubClass:0x1001bc2d0 (NoMethodError)
from example.rb:2:in `some_method'
from example.rb:13
➜ ruby --version
ruby 1.9.2p180 (2011-02-18 revision 30909) [x86_64-darwin10.6.0]
➜ ruby example.rb
example.rb:2: stack level too deep (SystemStackError)
I've tried it on 1.9.3.preview-1 and I get the SystemStackError there, too. I would expect 1.9 to act like 1.8 here, and not infinitely recurse on itself.