oracle / truffleruby

A high performance implementation of the Ruby programming language, built on GraalVM.
https://www.graalvm.org/ruby/
Other
3.02k stars 185 forks source link

def ! causes a weird exception `binmode?': private method `!' called for TrueClass (NoMethodError) #1496

Closed deepj closed 2 years ago

deepj commented 5 years ago

When I try to define the following code (I know weird but it doesn't cause exception under MRI but it returns :!)

To reproduce:

def !
end

Error:

~/.rubies/truffleruby-1.0.0-rc9/lib/mri/irb.rb:502:in `binmode?': private method `!' called for TrueClass (NoMethodError)
    from ~/.rubies/truffleruby-1.0.0-rc9/lib/mri/irb.rb:502:in `write'
    from ~/.rubies/truffleruby-1.0.0-rc9/lib/mri/irb.rb:502:in `print'
    from ~/.rubies/truffleruby-1.0.0-rc9/lib/mri/irb.rb:502:in `each'
    from ~/.rubies/truffleruby-1.0.0-rc9/lib/mri/irb.rb:502:in `print'
    from ~/.rubies/truffleruby-1.0.0-rc9/lib/mri/irb.rb:502:in `block (2 levels) in eval_input'
    from ~/.rubies/truffleruby-1.0.0-rc9/lib/mri/irb.rb:627:in `signal_status'
    from ~/.rubies/truffleruby-1.0.0-rc9/lib/mri/irb.rb:490:in `block in eval_input'
    from ~/.rubies/truffleruby-1.0.0-rc9/lib/mri/irb/ruby-lex.rb:246:in `block (2 levels) in each_top_level_statement'
    from ~/.rubies/truffleruby-1.0.0-rc9/lib/mri/irb/ruby-lex.rb:232:in `loop'
    from ~/.rubies/truffleruby-1.0.0-rc9/lib/mri/irb/ruby-lex.rb:232:in `block in each_top_level_statement'
    from ~/.rubies/truffleruby-1.0.0-rc9/lib/mri/irb/ruby-lex.rb:231:in `catch'
    from ~/.rubies/truffleruby-1.0.0-rc9/lib/mri/irb/ruby-lex.rb:231:in `each_top_level_statement'
    from ~/.rubies/truffleruby-1.0.0-rc9/lib/mri/irb.rb:489:in `eval_input'
    from ~/.rubies/truffleruby-1.0.0-rc9/lib/mri/irb.rb:430:in `block in run'
    from ~/.rubies/truffleruby-1.0.0-rc9/lib/mri/irb.rb:429:in `catch'
    from ~/.rubies/truffleruby-1.0.0-rc9/lib/mri/irb.rb:429:in `run'
    from ~/.rubies/truffleruby-1.0.0-rc9/lib/mri/irb.rb:385:in `start'
    from ~/.rubies/truffleruby-1.0.0-rc9/bin/irb:29:in `<main>'

There was a similar problem in JRuby https://github.com/jruby/jruby/issues/4845

chrisseaton commented 5 years ago

Thanks for the issue.

chrisseaton commented 5 years ago

Note only happens in IRB.

andrykonchin commented 2 years ago

Reproduce a similar issue on CRuby as well:

Ruby 3.1.2

irb
irb(main):001:1* def !
irb(main):002:0> end
(Object doesn't support #inspect)
=>
.../3.1.2/lib/ruby/3.1.0/irb/init.rb:350:in `rc_file': NoMethodError
...

Ruby 3.0.3

irb
irb(main):001:1* def !
irb(main):002:0> end
(Object doesn't support #inspect)
=>
.../3.0.3/lib/ruby/3.0.0/irb/init.rb:329:in `rc_file': private method `!' called for #<Proc:0x00007fb39a0dbc90 .../3.0.3/lib/ruby/3.0.0/irb/init.rb:360> (NoMethodError)
...
eregon commented 2 years ago

I could repro with a file like:

p def !
end

Without the p it works fine on TruffleRuby.

With it it fails but this is expected, this code redefines the ! globally and incorrectly for all Object, and also as a private method hence the error. So the problem also happens on CRuby with more code:

def !
end

p !1

gives

$ ruby -v excl.rb
ruby 3.0.3p157 (2021-11-24 revision 3fb7d2cadc) [x86_64-linux]
excl.rb:4:in `<main>': private method `!' called for 1:Integer (NoMethodError)

$ ruby -v excl.rb
truffleruby 22.3.0-dev-1db71db4, like ruby 3.0.3, GraalVM CE Native [x86_64-linux]
Error while formatting Ruby exception:
<internal:core> core/exception.rb:112:in `to_tty?': private method `!' called for false:FalseClass (NoMethodError)
    from <internal:core> core/truffle/exception_operations.rb:125:in `full_message'
    from <internal:core> core/truffle/exception_operations.rb:234:in `get_formatted_backtrace'
Original Ruby exception:
excl.rb:4:in `<main>': private method `!' called for 1:Integer (NoMethodError)