Skip to content

Crash with none array methods variable or method. #368

Closed
@ksss

Description

@ksss

Description

When I run the following code, irb crashes and exits when I enter any key.

$ cat t.rb
#! /usr/bin/env ruby

class Foo
  def a(methods)
    binding.irb
  end
end

Foo.new.a(1)
$ ruby t.rb

From: t.rb @ line 5 :

    1: #! /usr/bin/env ruby
    2:
    3: class Foo
    4:   def a(methods)
 => 5:     binding.irb
    6:   end
    7: end
    8:
    9: Foo.new.a(1)
# Pressing any key...
irb(#<Foo:0x0000000100b0ec20>):001:0> a(eval):1:in `|': Array can't be coerced into Integer (TypeError)
	from (eval):1:in `a'
	from /Users/ksss/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/irb-1.4.1/lib/irb/completion.rb:362:in `eval'
	from /Users/ksss/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/irb-1.4.1/lib/irb/completion.rb:362:in `retrieve_completion_data'
	from /Users/ksss/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/irb-1.4.1/lib/irb/completion.rb:130:in `block in <module:InputCompletor>'
	from /Users/ksss/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/reline-0.3.1/lib/reline/line_editor.rb:1681:in `call_completion_proc_with_checking_args'
	from /Users/ksss/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/reline-0.3.1/lib/reline/line_editor.rb:543:in `call_completion_proc_with_checking_args'
	from /Users/ksss/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/reline-0.3.1/lib/reline.rb:226:in `block in <class:Core>'
	from /Users/ksss/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/reline-0.3.1/lib/reline/line_editor.rb:588:in `instance_exec'
	from /Users/ksss/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/reline-0.3.1/lib/reline/line_editor.rb:588:in `call'
	from /Users/ksss/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/reline-0.3.1/lib/reline/line_editor.rb:623:in `call'
	from /Users/ksss/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/reline-0.3.1/lib/reline/line_editor.rb:667:in `render_each_dialog'
	from /Users/ksss/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/reline-0.3.1/lib/reline/line_editor.rb:651:in `block in render_dialog'
	from /Users/ksss/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/reline-0.3.1/lib/reline/line_editor.rb:650:in `each'
	from /Users/ksss/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/reline-0.3.1/lib/reline/line_editor.rb:650:in `render_dialog'
	from /Users/ksss/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/reline-0.3.1/lib/reline/line_editor.rb:510:in `rerender'
	from /Users/ksss/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/reline-0.3.1/lib/reline.rb:330:in `block (3 levels) in inner_readline'
	from /Users/ksss/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/reline-0.3.1/lib/reline.rb:328:in `each'
	from /Users/ksss/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/reline-0.3.1/lib/reline.rb:328:in `block (2 levels) in inner_readline'
	from /Users/ksss/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/reline-0.3.1/lib/reline.rb:403:in `block in read_io'
	from /Users/ksss/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/reline-0.3.1/lib/reline.rb:373:in `loop'
	from /Users/ksss/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/reline-0.3.1/lib/reline.rb:373:in `read_io'
	from /Users/ksss/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/reline-0.3.1/lib/reline.rb:326:in `block in inner_readline'
	from /Users/ksss/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/reline-0.3.1/lib/reline.rb:324:in `loop'
	from /Users/ksss/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/reline-0.3.1/lib/reline.rb:324:in `inner_readline'
	from /Users/ksss/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/reline-0.3.1/lib/reline.rb:254:in `readmultiline'
	from /Users/ksss/.rbenv/versions/3.1.1/lib/ruby/3.1.0/forwardable.rb:238:in `readmultiline'
	from /Users/ksss/.rbenv/versions/3.1.1/lib/ruby/3.1.0/forwardable.rb:238:in `readmultiline'
	from /Users/ksss/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/irb-1.4.1/lib/irb/input-method.rb:418:in `gets'
	from /Users/ksss/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/irb-1.4.1/lib/irb.rb:539:in `block (2 levels) in eval_input'
	from /Users/ksss/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/irb-1.4.1/lib/irb.rb:770:in `signal_status'
	from /Users/ksss/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/irb-1.4.1/lib/irb.rb:538:in `block in eval_input'
	from /Users/ksss/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/irb-1.4.1/lib/irb/ruby-lex.rb:284:in `lex'
	from /Users/ksss/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/irb-1.4.1/lib/irb/ruby-lex.rb:253:in `block (2 levels) in each_top_level_statement'
	from /Users/ksss/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/irb-1.4.1/lib/irb/ruby-lex.rb:250:in `loop'
	from /Users/ksss/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/irb-1.4.1/lib/irb/ruby-lex.rb:250:in `block in each_top_level_statement'
	from /Users/ksss/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/irb-1.4.1/lib/irb/ruby-lex.rb:249:in `catch'
	from /Users/ksss/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/irb-1.4.1/lib/irb/ruby-lex.rb:249:in `each_top_level_statement'
	from /Users/ksss/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/irb-1.4.1/lib/irb.rb:557:in `eval_input'
	from /Users/ksss/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/irb-1.4.1/lib/irb.rb:491:in `block in run'
	from /Users/ksss/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/irb-1.4.1/lib/irb.rb:490:in `catch'
	from /Users/ksss/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/irb-1.4.1/lib/irb.rb:490:in `run'
	from /Users/ksss/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/irb-1.4.1/lib/irb.rb:976:in `irb'
	from <internal:prelude>:5:in `irb'
	from t.rb:5:in `a'
	from t.rb:9:in `<main>'

This is happening in the following eval code.

candidates = eval("methods | private_methods | local_variables | instance_variables | self.class.constants", bind).collect{|m| m.to_s}

Probably, it occurs when any one of methods private_methods local_variables instance_variables does not have a #| method.

I discovered this problem when I inserted binding.irb into the code below.
https://github.com/ruby/rbs/blob/4dc5b95c4971e7abdbbfd1304996275c8ae0f859/lib/rbs/definition_builder/method_builder.rb#L104

Result of irb_info

$ irb
irb(main):001:0> irb_info
=>
Ruby version: 3.1.1
IRB version: irb 1.4.1 (2021-12-25)
InputMethod: ReidlineInputMethod with Reline 0.3.1
RUBY_PLATFORM: arm64-darwin21
LANG env: ja_JP.UTF-8
East Asian Ambiguous Width: 1

Terminal Emulator

What's your terminal emulator?

iTerm2

Setting Files

Are you using ~/.irbrc and ~/.inputrc?

No.

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