Bug #9475

Behavior change with include + super + alias_method between 1.9.x and 2.x

Added by Ben Weintraub over 1 year ago. Updated about 1 year ago.

[ruby-core:60431]
Status:Closed
Priority:Normal
Assignee:Nobuyoshi Nakada
ruby -v:ruby 2.1.0p0 (2013-12-25 revision 44422) [x86_64-darwin12.0] Backport:1.9.3: DONTNEED, 2.0.0: DONE, 2.1: DONE

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:
1. Run the attached testcase on Ruby 1.9.3 note the output
2. 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.

test.rb Magnifier (340 Bytes) Ben Weintraub, 02/03/2014 08:21 PM


Related issues

Related to Ruby trunk - Bug #9663: Segfault with alias_method and include Closed 03/22/2014

Associated revisions

Revision 45367
Added by Nobuyoshi Nakada about 1 year ago

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. [Bug #9475]

Revision 45367
Added by Nobuyoshi Nakada about 1 year ago

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. [Bug #9475]

Revision 45750
Added by Usaku NAKAMURA about 1 year ago

merge revision(s) 45367,45387,45388,45389: [Backport #9475]

  • vm_method.c (rb_method_entry_get_without_cache): me->klass is 0
    for a method aliased in a module. [Bug #9663]

  • 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.
    [Bug #9475]

Revision 45955
Added by Tomoyuki Chikanaga about 1 year ago

merge revision(s) r45367,r45387,r45388,r45389: [Backport #9475]

* 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.
   [Bug #9475]

* vm_method.c (rb_method_entry_get_without_cache): me->klass is 0
  for a method aliased in a module.   [Bug #9663]

History

#1 Updated by Nobuyoshi Nakada over 1 year ago

  • Status changed from Open to Assigned
  • Assignee set to Nobuyoshi Nakada

#2 Updated by Nobuyoshi Nakada about 1 year 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. [Bug #9475]

#3 Updated by Nobuyoshi Nakada about 1 year 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

#4 Updated by Nobuyoshi Nakada about 1 year 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

#5 Updated by Tomoyuki Chikanaga about 1 year ago

  • Related to Bug #9663: Segfault with alias_method and include added

#6 Updated by Usaku NAKAMURA about 1 year 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.

#7 Updated by Tomoyuki Chikanaga about 1 year 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.

Also available in: Atom PDF