From 8bfdb090e179558110d2be30f27c261419d8e6a8 Mon Sep 17 00:00:00 2001 From: n-ogawa Date: Wed, 7 May 2025 23:59:14 +0900 Subject: [PATCH 1/3] Fix nil error on debugger prompt --- lib/irb.rb | 2 ++ test/irb/test_debugger_integration.rb | 50 +++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/lib/irb.rb b/lib/irb.rb index fd0bfe35c..8c933d4ae 100644 --- a/lib/irb.rb +++ b/lib/irb.rb @@ -613,9 +613,11 @@ def format_prompt(format, ltype, indent, line_no) # :nodoc: @context.irb_name when "m" main_str = @context.safe_method_call_on_main(:to_s) rescue "!#{$!.class}" + main_str = main_str || "!#{@context.safe_method_call_on_main(:class)}" truncate_prompt_main(main_str) when "M" main_str = @context.safe_method_call_on_main(:inspect) rescue "!#{$!.class}" + main_str = main_str || "!#{@context.safe_method_call_on_main(:class)}" truncate_prompt_main(main_str) when "l" ltype diff --git a/test/irb/test_debugger_integration.rb b/test/irb/test_debugger_integration.rb index 45ffb2a52..c19faa423 100644 --- a/test/irb/test_debugger_integration.rb +++ b/test/irb/test_debugger_integration.rb @@ -51,6 +51,56 @@ def test_debug assert_match(/=> 2\| puts "hello"/, output) end + def test_debug_class_to_s_return_string + write_ruby <<~'ruby' + class ToSReturnsString + def to_s + 'ok' + end + + def do_something + binding.irb + end + end + + ToSReturnsString.new.do_something + ruby + + output = run_ruby_file do + type "debug" + type "next" + type "continue" + end + + assert_match(/irb\(ok\):001> debug/, output) + assert_match(/irb:rdbg\(ok\):002> next/, output) + end + + def test_debug_class_to_s_return_nil + write_ruby <<~'ruby' + class ToSReturnsNil + def to_s + nil + end + + def do_something + binding.irb + end + end + + ToSReturnsNil.new.do_something + ruby + + output = run_ruby_file do + type "debug" + type "next" + type "continue" + end + + assert_match(/irb\(!ToSReturnsNil\):001> debug/, output) + assert_match(/irb:rdbg\(!ToSReturnsNil\):002> next/, output) + end + def test_debug_command_only_runs_once write_ruby <<~'ruby' binding.irb From 47ec270a267494b959b6cc55458ac6b756f165d6 Mon Sep 17 00:00:00 2001 From: n-ogawa Date: Thu, 8 May 2025 08:26:02 +0900 Subject: [PATCH 2/3] Delete unnecessary test case --- test/irb/test_debugger_integration.rb | 25 ------------------------- 1 file changed, 25 deletions(-) diff --git a/test/irb/test_debugger_integration.rb b/test/irb/test_debugger_integration.rb index c19faa423..856e06864 100644 --- a/test/irb/test_debugger_integration.rb +++ b/test/irb/test_debugger_integration.rb @@ -51,31 +51,6 @@ def test_debug assert_match(/=> 2\| puts "hello"/, output) end - def test_debug_class_to_s_return_string - write_ruby <<~'ruby' - class ToSReturnsString - def to_s - 'ok' - end - - def do_something - binding.irb - end - end - - ToSReturnsString.new.do_something - ruby - - output = run_ruby_file do - type "debug" - type "next" - type "continue" - end - - assert_match(/irb\(ok\):001> debug/, output) - assert_match(/irb:rdbg\(ok\):002> next/, output) - end - def test_debug_class_to_s_return_nil write_ruby <<~'ruby' class ToSReturnsNil From 03599ecc6ab60d75e9944bc37b4fe774ad9f5758 Mon Sep 17 00:00:00 2001 From: n-ogawa Date: Thu, 8 May 2025 08:30:23 +0900 Subject: [PATCH 3/3] Use empty string on prompt when to_s returns nil. --- lib/irb.rb | 6 ++---- test/irb/test_debugger_integration.rb | 4 ++-- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/lib/irb.rb b/lib/irb.rb index 8c933d4ae..6d9c96c8f 100644 --- a/lib/irb.rb +++ b/lib/irb.rb @@ -612,12 +612,10 @@ def format_prompt(format, ltype, indent, line_no) # :nodoc: when "N" @context.irb_name when "m" - main_str = @context.safe_method_call_on_main(:to_s) rescue "!#{$!.class}" - main_str = main_str || "!#{@context.safe_method_call_on_main(:class)}" + main_str = "#{@context.safe_method_call_on_main(:to_s)}" rescue "!#{$!.class}" truncate_prompt_main(main_str) when "M" - main_str = @context.safe_method_call_on_main(:inspect) rescue "!#{$!.class}" - main_str = main_str || "!#{@context.safe_method_call_on_main(:class)}" + main_str = "#{@context.safe_method_call_on_main(:inspect)}" rescue "!#{$!.class}" truncate_prompt_main(main_str) when "l" ltype diff --git a/test/irb/test_debugger_integration.rb b/test/irb/test_debugger_integration.rb index 856e06864..e125dbf85 100644 --- a/test/irb/test_debugger_integration.rb +++ b/test/irb/test_debugger_integration.rb @@ -72,8 +72,8 @@ def do_something type "continue" end - assert_match(/irb\(!ToSReturnsNil\):001> debug/, output) - assert_match(/irb:rdbg\(!ToSReturnsNil\):002> next/, output) + assert_match(/irb\(\):001> debug/, output) + assert_match(/irb:rdbg\(\):002> next/, output) end def test_debug_command_only_runs_once