Bug #16250
IRB can't print recursive Arrays or Hashes
Description
This is on Ruby 2.7.0dev but I'm almost sure it happens on master because this code has no check for recursion: https://github.com/ruby/ruby/blob/c3a626030235c0349e14c6bc07177810daee841c/lib/irb/color.rb#L73-L88
Code to reproduce:
$ irb irb(main):001:0> a = [] => [] irb(main):002:0> a << a Traceback (most recent call last): 16: from /Users/asterite/.rbenv/versions/2.7.0-dev/lib/ruby/2.7.0/irb/color.rb:80:in `all?' 15: from /Users/asterite/.rbenv/versions/2.7.0-dev/lib/ruby/2.7.0/irb/color.rb:80:in `block in inspect_colorable?' 14: from /Users/asterite/.rbenv/versions/2.7.0-dev/lib/ruby/2.7.0/irb/color.rb:80:in `inspect_colorable?' 13: from /Users/asterite/.rbenv/versions/2.7.0-dev/lib/ruby/2.7.0/irb/color.rb:80:in `all?' 12: from /Users/asterite/.rbenv/versions/2.7.0-dev/lib/ruby/2.7.0/irb/color.rb:80:in `block in inspect_colorable?' 11: from /Users/asterite/.rbenv/versions/2.7.0-dev/lib/ruby/2.7.0/irb/color.rb:80:in `inspect_colorable?' 10: from /Users/asterite/.rbenv/versions/2.7.0-dev/lib/ruby/2.7.0/irb/color.rb:80:in `all?' 9: from /Users/asterite/.rbenv/versions/2.7.0-dev/lib/ruby/2.7.0/irb/color.rb:80:in `block in inspect_colorable?' 8: from /Users/asterite/.rbenv/versions/2.7.0-dev/lib/ruby/2.7.0/irb/color.rb:80:in `inspect_colorable?' 7: from /Users/asterite/.rbenv/versions/2.7.0-dev/lib/ruby/2.7.0/irb/color.rb:80:in `all?' 6: from /Users/asterite/.rbenv/versions/2.7.0-dev/lib/ruby/2.7.0/irb/color.rb:80:in `block in inspect_colorable?' 5: from /Users/asterite/.rbenv/versions/2.7.0-dev/lib/ruby/2.7.0/irb/color.rb:80:in `inspect_colorable?' 4: from /Users/asterite/.rbenv/versions/2.7.0-dev/lib/ruby/2.7.0/irb/color.rb:80:in `all?' 3: from /Users/asterite/.rbenv/versions/2.7.0-dev/lib/ruby/2.7.0/irb/color.rb:80:in `block in inspect_colorable?' 2: from /Users/asterite/.rbenv/versions/2.7.0-dev/lib/ruby/2.7.0/irb/color.rb:80:in `inspect_colorable?' 1: from /Users/asterite/.rbenv/versions/2.7.0-dev/lib/ruby/2.7.0/irb/color.rb:80:in `all?' SystemStackError (stack level too deep) Maybe IRB bug!
Suggested fix: keep a list of visited arrays and hashes. I will try to submit a patch.
Associated revisions
Use compare_by_identity hash [Bug #16250]
Fixed the key to delete [Bug #16250]
https://github.com/ruby/ruby/commit/f94202fcc228d0348ca050a7b18a8f8a538a7305#commitcomment-35505076
Co-Authored-By: Ary Borenszweig asterite@gmail.com
History
Updated by the-asterite (Ary Borenszweig) 2 months ago
By the way, I had to create a new account to report this bug. I already tried to reset my password for account asterite@gmail.com
but after I reset it if I try to login it always says the password is incorrect. Could you try verifying "reset password" works fine?
Updated by the-asterite (Ary Borenszweig) 2 months ago
Fix here: https://github.com/ruby/ruby/pull/2555
Updated by asterite (Ary Borenszweig) about 2 months ago
- Status changed from Open to Closed
Applied in changeset git|96617ad1d57a13e9a282fb663ea73e4801519389.
IRB colorize: take into account recursive arrays and hashes (#2555)
[Bug #16250]
Updated by k0kubun (Takashi Kokubun) about 2 months ago
Great catch, thanks!
By the way, I had to create a new account to report this bug. I already tried to reset my password for account asterite@gmail.com but after I reset it if I try to login it always says the password is incorrect. Could you try verifying "reset password" works fine?
I'm not familiar with it so much. Please file another ticket somewhere, maybe https://github.com/ruby/bugs.ruby-lang.org/issues?
IRB colorize: take into account recursive arrays and hashes (#2555)
[Bug #16250]