Bug #9475
closedBehavior change with include + super + alias_method between 1.9.x and 2.x
Description
Ruby 2.0 appears to have introduced a subtle behavior change in method resolution that persists in 2.1.0.
The attached test case (also visible online at https://gist.github.com/benweint/8791007) is extracted from an actual application, and while I won't defend the need to do something like this, it is clear that the behavior changed in 2.0. Note that this sounds similar to https://bugs.ruby-lang.org/issues/9236 but is in fact distinct - the test case given in that bug was fixed in Ruby 2.1.
Steps to reproduce:
- Run the attached testcase on Ruby 1.9.3 note the output
- Run the attached testcase on Ruby 2.0.0-p353 or 2.1.0-p0, and note the output
Expected results:
While it's certainly not obvious to me what 'should' happen when executing this code, on 1.9.3, it produces this output:
foo from C
foo from B
foo from A
Actual results:
On 2.0+, I get this instead
foo from C
foo from B
foo from B (again)
foo from B
foo from B (again)
foo from B
... previous two lines repeated many times ...
test.rb:11: stack level too deep (SystemStackError)
That is to say, on 2.0, we get into an infinitely recursive loop that doesn't happen with 1.9.3.
Files
Updated by nobu (Nobuyoshi Nakada) over 10 years ago
- Status changed from Open to Assigned
- Assignee set to nobu (Nobuyoshi Nakada)
Updated by nobu (Nobuyoshi Nakada) over 10 years ago
- Status changed from Assigned to Closed
- % Done changed from 0 to 100
Applied in changeset r45367.
vm_method.c: fix infinite recursion
- vm_method.c (rb_method_entry_get_without_cache): get rid of
infinite recursion at aliases in a subclass and a superclass.
return actually defined class for other than singleton class.
[ruby-core:60431] [Bug #9475]
Updated by nobu (Nobuyoshi Nakada) over 10 years ago
- Backport changed from 1.9.3: UNKNOWN, 2.0.0: UNKNOWN, 2.1: UNKNOWN to 1.9.3: REQUIRED, 2.0.0: REQUIRED, 2.1: REQUIRED
Updated by nobu (Nobuyoshi Nakada) over 10 years ago
- Description updated (diff)
- Backport changed from 1.9.3: REQUIRED, 2.0.0: REQUIRED, 2.1: REQUIRED to 1.9.3: DONTNEED, 2.0.0: REQUIRED, 2.1: REQUIRED
Updated by nagachika (Tomoyuki Chikanaga) over 10 years ago
- Related to Bug #9663: Segfault with alias_method and include added
Updated by usa (Usaku NAKAMURA) over 10 years ago
- Backport changed from 1.9.3: DONTNEED, 2.0.0: REQUIRED, 2.1: REQUIRED to 1.9.3: DONTNEED, 2.0.0: DONE, 2.1: REQUIRED
backported r45367, r45387, r45388 and r45389 into ruby_2_0_0 at r45750.
Updated by nagachika (Tomoyuki Chikanaga) over 10 years ago
- Backport changed from 1.9.3: DONTNEED, 2.0.0: DONE, 2.1: REQUIRED to 1.9.3: DONTNEED, 2.0.0: DONE, 2.1: DONE
r45367, r45387, r45388 and r45389 were backported into ruby_2_1
branch at r45955.