Skip to content

IRB crashes when Object's constants #235

Closed as not planned
Closed as not planned

Description

@JunichiIto

Description

I could change Object's constants in Ruby 2.6.6 and irb 1.0.0.

$ ruby -v
irb(main):001:0> RUBY_VERSION=1
(irb):1: warning: already initialized constant RUBY_VERSION
=> 1
irb(main):002:0> RUBY_VERSION
=> 1
irb(main):003:0> ENV=1
(irb):3: warning: already initialized constant ENV
=> 1
irb(main):004:0> ENV
=> 1

But IRB crashes when I do the same thing in irb 1.3.5.

$ ruby -v
ruby 3.0.1p64 (2021-04-05 revision 0fb782ee38) [arm64-darwin20]
$ irb -v
irb 1.3.5 (2021-04-03)
$ irb
irb(main):001:0> RUBY_VERSION=1
(irb):1: warning: already initialized constant RUBY_VERSION
=> 1
irb(main):002:0> RUBY_VERSION
/Users/jnito/.rbenv/versions/3.0.1/lib/ruby/3.0.0/reline.rb:178:in `<': comparison of Integer with String failed (ArgumentError)
	from /Users/jnito/.rbenv/versions/3.0.1/lib/ruby/3.0.0/reline.rb:178:in `readmultiline'
	from /Users/jnito/.rbenv/versions/3.0.1/lib/ruby/3.0.0/forwardable.rb:238:in `readmultiline'
	from /Users/jnito/.rbenv/versions/3.0.1/lib/ruby/3.0.0/forwardable.rb:238:in `readmultiline'
	from /Users/jnito/.rbenv/versions/3.0.1/lib/ruby/3.0.0/irb/input-method.rb:319:in `gets'
	from /Users/jnito/.rbenv/versions/3.0.1/lib/ruby/3.0.0/irb.rb:529:in `block (2 levels) in eval_input'
	from /Users/jnito/.rbenv/versions/3.0.1/lib/ruby/3.0.0/irb.rb:751:in `signal_status'
	from /Users/jnito/.rbenv/versions/3.0.1/lib/ruby/3.0.0/irb.rb:528:in `block in eval_input'
	from /Users/jnito/.rbenv/versions/3.0.1/lib/ruby/3.0.0/irb/ruby-lex.rb:267:in `lex'
	from /Users/jnito/.rbenv/versions/3.0.1/lib/ruby/3.0.0/irb/ruby-lex.rb:236:in `block (2 levels) in each_top_level_statement'
	from /Users/jnito/.rbenv/versions/3.0.1/lib/ruby/3.0.0/irb/ruby-lex.rb:233:in `loop'
	from /Users/jnito/.rbenv/versions/3.0.1/lib/ruby/3.0.0/irb/ruby-lex.rb:233:in `block in each_top_level_statement'
	from /Users/jnito/.rbenv/versions/3.0.1/lib/ruby/3.0.0/irb/ruby-lex.rb:232:in `catch'
	from /Users/jnito/.rbenv/versions/3.0.1/lib/ruby/3.0.0/irb/ruby-lex.rb:232:in `each_top_level_statement'
	from /Users/jnito/.rbenv/versions/3.0.1/lib/ruby/3.0.0/irb.rb:547:in `eval_input'
	from /Users/jnito/.rbenv/versions/3.0.1/lib/ruby/3.0.0/irb.rb:481:in `block in run'
	from /Users/jnito/.rbenv/versions/3.0.1/lib/ruby/3.0.0/irb.rb:480:in `catch'
	from /Users/jnito/.rbenv/versions/3.0.1/lib/ruby/3.0.0/irb.rb:480:in `run'
	from /Users/jnito/.rbenv/versions/3.0.1/lib/ruby/3.0.0/irb.rb:409:in `start'
	from /Users/jnito/.rbenv/versions/3.0.1/lib/ruby/gems/3.0.0/gems/irb-1.3.5/exe/irb:11:in `<top (required)>'
	from /Users/jnito/.rbenv/versions/3.0.1/bin/irb:23:in `load'
	from /Users/jnito/.rbenv/versions/3.0.1/bin/irb:23:in `<main>'
$ irb
irb(main):001:0> ENV=1
(irb):1: warning: already initialized constant ENV
(Object doesn't support #inspect)
=> 
/Users/jnito/.rbenv/versions/3.0.1/lib/ruby/3.0.0/reline.rb:201:in `[]': no implicit conversion of String into Integer (TypeError)
	from /Users/jnito/.rbenv/versions/3.0.1/lib/ruby/3.0.0/reline.rb:201:in `inner_readline'
	from /Users/jnito/.rbenv/versions/3.0.1/lib/ruby/3.0.0/reline.rb:175:in `readmultiline'
	from /Users/jnito/.rbenv/versions/3.0.1/lib/ruby/3.0.0/forwardable.rb:238:in `readmultiline'
	from /Users/jnito/.rbenv/versions/3.0.1/lib/ruby/3.0.0/forwardable.rb:238:in `readmultiline'
	from /Users/jnito/.rbenv/versions/3.0.1/lib/ruby/3.0.0/irb/input-method.rb:319:in `gets'
	from /Users/jnito/.rbenv/versions/3.0.1/lib/ruby/3.0.0/irb.rb:529:in `block (2 levels) in eval_input'
	from /Users/jnito/.rbenv/versions/3.0.1/lib/ruby/3.0.0/irb.rb:751:in `signal_status'
	from /Users/jnito/.rbenv/versions/3.0.1/lib/ruby/3.0.0/irb.rb:528:in `block in eval_input'
	from /Users/jnito/.rbenv/versions/3.0.1/lib/ruby/3.0.0/irb/ruby-lex.rb:267:in `lex'
	from /Users/jnito/.rbenv/versions/3.0.1/lib/ruby/3.0.0/irb/ruby-lex.rb:236:in `block (2 levels) in each_top_level_statement'
	from /Users/jnito/.rbenv/versions/3.0.1/lib/ruby/3.0.0/irb/ruby-lex.rb:233:in `loop'
	from /Users/jnito/.rbenv/versions/3.0.1/lib/ruby/3.0.0/irb/ruby-lex.rb:233:in `block in each_top_level_statement'
	from /Users/jnito/.rbenv/versions/3.0.1/lib/ruby/3.0.0/irb/ruby-lex.rb:232:in `catch'
	from /Users/jnito/.rbenv/versions/3.0.1/lib/ruby/3.0.0/irb/ruby-lex.rb:232:in `each_top_level_statement'
	from /Users/jnito/.rbenv/versions/3.0.1/lib/ruby/3.0.0/irb.rb:547:in `eval_input'
	from /Users/jnito/.rbenv/versions/3.0.1/lib/ruby/3.0.0/irb.rb:481:in `block in run'
	from /Users/jnito/.rbenv/versions/3.0.1/lib/ruby/3.0.0/irb.rb:480:in `catch'
	from /Users/jnito/.rbenv/versions/3.0.1/lib/ruby/3.0.0/irb.rb:480:in `run'
	from /Users/jnito/.rbenv/versions/3.0.1/lib/ruby/3.0.0/irb.rb:409:in `start'
	from /Users/jnito/.rbenv/versions/3.0.1/lib/ruby/gems/3.0.0/gems/irb-1.3.5/exe/irb:11:in `<top (required)>'
	from /Users/jnito/.rbenv/versions/3.0.1/bin/irb:23:in `load'
	from /Users/jnito/.rbenv/versions/3.0.1/bin/irb:23:in `<main>'

Result of irb_info

irb(main):001:0> irb_info
=> 
Ruby version: 3.0.1
IRB version: irb 1.3.5 (2021-04-03)
InputMethod: ReidlineInputMethod with Reline 0.2.5
RUBY_PLATFORM: arm64-darwin20

Terminal Emulator

Terminal.app in macOS 11.3

Setting Files

Are you using ~/.irbrc and ~/.inputrc? => No.

Activity

  1. ima1zumi commented on Jul 20, 2021

    @ima1zumi
    Member

    The reason for this crash is the use of RUBY_VERSION and ENV in reline. The Object constant can be changed.
    For example, RUBY_COPYRIGHT is an Object constant, but it can be changed.

    irb(main):001:0> RUBY_COPYRIGHT
    => "ruby - Copyright (C) 1993-2021 Yukihiro Matsumoto"
    irb(main):002:0> RUBY_COPYRIGHT = "Ruby"
    (irb):2: warning: already initialized constant RUBY_COPYRIGHT
    => "Ruby"
    irb(main):003:0> RUBY_COPYRIGHT
    => "Ruby"

    ref: https://github.com/ruby/reline/blob/d7fc111bcc1ee56d7f867cbadd132c57167ec6e7/lib/reline.rb#L181
    https://github.com/ruby/reline/blob/d7fc111bcc1ee56d7f867cbadd132c57167ec6e7/lib/reline.rb#L204

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions