Skip to content

Commit 372bc59

Browse files
authored
Fix exit! command warning and method behavior (#868)
* Fix exit! command warning and method behavior * Remove arg(0) from Kernel.exit and Kernel.exit!
1 parent 899d10a commit 372bc59

File tree

5 files changed

+18
-8
lines changed

5 files changed

+18
-8
lines changed

lib/irb.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -989,7 +989,7 @@ def run(conf = IRB.conf)
989989
conf[:AT_EXIT].each{|hook| hook.call}
990990

991991
context.io.save_history if save_history
992-
Kernel.exit(0) if forced_exit
992+
Kernel.exit if forced_exit
993993
end
994994
end
995995

lib/irb/cmd/force_exit.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ class ForceExit < Nop
1313
def execute(*)
1414
throw :IRB_EXIT, true
1515
rescue UncaughtThrowError
16-
Kernel.exit(0)
16+
Kernel.exit!
1717
end
1818
end
1919
end

lib/irb/workspace.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,11 +90,11 @@ def initialize(*main)
9090
IRB.conf[:__MAIN__] = @main
9191
@main.singleton_class.class_eval do
9292
private
93-
define_method(:exit) do |*a, &b|
94-
# Do nothing, will be overridden
95-
end
9693
define_method(:binding, Kernel.instance_method(:binding))
9794
define_method(:local_variables, Kernel.instance_method(:local_variables))
95+
# Define empty method to avoid delegator warning, will be overridden.
96+
define_method(:exit) {|*a, &b| }
97+
define_method(:exit!) {|*a, &b| }
9898
end
9999
@binding = eval("IRB.conf[:__MAIN__].instance_eval('binding', __FILE__, __LINE__)", @binding, *@binding.source_location)
100100
end

test/irb/cmd/test_force_exit.rb

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,5 +47,17 @@ def foo
4747

4848
assert_match(/irb\(main\):001> 123/, output)
4949
end
50+
51+
def test_forced_exit_out_of_irb_session
52+
write_ruby <<~'ruby'
53+
at_exit { puts 'un' + 'reachable' }
54+
binding.irb
55+
exit! # this will call exit! method overrided by command
56+
ruby
57+
output = run_ruby_file do
58+
type "exit"
59+
end
60+
assert_not_include(output, 'unreachable')
61+
end
5062
end
5163
end

test/irb/test_cmd.rb

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,7 @@ def test_calling_command_on_a_frozen_main
5858
"irb_info",
5959
main: main
6060
)
61-
# Because the main object is frozen, IRB would wrap a delegator around it
62-
# Which's exit! method can't be overridden and would raise a warning
63-
assert_match(/delegator does not forward private method #exit\!/, err)
61+
assert_empty(err)
6462
assert_match(/RUBY_PLATFORM/, out)
6563
end
6664
end

0 commit comments

Comments
 (0)