Project

General

Profile

Bug #11385

`==` with bidirectional/cyclic dependency

Added by allenwq (Allen Wang) almost 5 years ago. Updated almost 5 years ago.

Status:
Rejected
Priority:
Normal
Assignee:
ruby-core
Target version:
-
[ruby-core:70076]

Description

class Something
  attr_accessor :friend
  def initialize(friend)
    self.friend = friend
  end

  def ==(other)
    friend == other.friend
  end
end


a = Something.new([])
b = Something.new([a])
a.friend = [b]

a == b

The above code returns true on OS X and Linux, by right it should give me a exception of stack level too deep.

( And on windows I can see the expected exception )


Files

test.rb (226 Bytes) test.rb Code to recreate the bug allenwq (Allen Wang), 07/22/2015 02:50 AM

Related issues

Related to Ruby master - Bug #1448: [patch] Proper handling of recursive arraysClosed05/09/2009Actions

Updated by nobu (Nobuyoshi Nakada) almost 5 years ago

  • Description updated (diff)
  • Status changed from Open to Rejected

true is the expected result, and the same with x64-mswin64_120.

Updated by lowjoel (Joel Low) almost 5 years ago

Hi Nakada-san:

D:\> ruby -v
ruby 2.2.3p147 (2015-07-04 revision 51143) [x64-mswin64_120]

D:\> ruby test.rb
test.rb:8:in `==': stack level too deep (SystemStackError)
        from test.rb:8:in `=='
        from test.rb:8:in `=='
        from test.rb:8:in `=='
        from test.rb:8:in `=='
        from test.rb:8:in `=='
        from test.rb:8:in `=='
        from test.rb:8:in `=='
        from test.rb:8:in `=='
         ... 2574 levels...
        from test.rb:8:in `=='
        from test.rb:8:in `=='
        from test.rb:8:in `=='
        from test.rb:17:in `<main>'

It seems to be a problem specific to Windows. The test suite passes (IIRC)

Updated by Eregon (Benoit Daloze) almost 5 years ago

Should the result not be false instead?
These two instances each have a different @friend and it cannot be determined if they are equal so "false" seems a much safer answer.

Also, this seems inconsistent to how Comparable#== treat such cases:

class Something
  attr_accessor :friend
  def initialize(friend)
    self.friend = friend
  end
  include Comparable
  def <=>(other)
    friend <=> other
  end
end
a = Something.new([])
b = Something.new([a])
a.friend = [b]
p a == b # false (and not true like above!)

Updated by Hanmac (Hans Mackowiak) almost 5 years ago

my version is "ruby 2.3.0dev (2015-07-21 trunk 51319) [x86_64-linux]"

and it does return true for me too

#6

Updated by Eregon (Benoit Daloze) almost 5 years ago

  • Related to Bug #1448: [patch] Proper handling of recursive arrays added

Also available in: Atom PDF