Project

General

Profile

Actions

Bug #9475

closed

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

Added by benweint (Ben Weintraub) almost 11 years ago. Updated over 10 years ago.

Status:
Closed
Target version:
-
ruby -v:
ruby 2.1.0p0 (2013-12-25 revision 44422) [x86_64-darwin12.0]
[ruby-core:60431]

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.


Files

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

Related issues 1 (0 open1 closed)

Related to Ruby master - Bug #9663: Segfault with alias_method and includeClosed03/22/2014Actions

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.

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0