diff --git a/lib/irb/ext/save-history.rb b/lib/irb/ext/save-history.rb index edc4f234cc..2d9808259d 100644 --- a/lib/irb/ext/save-history.rb +++ b/lib/irb/ext/save-history.rb @@ -109,7 +109,12 @@ module IRB open(history_file, "w:#{IRB.conf[:LC_MESSAGES].encoding}", 0600) do |f| hist = history.map{ |l| l.split("\n").join("\\\n") } - f.puts(hist[-num..-1] || hist) + begin + hist = hist.last(num) if hist.size > num + rescue RangeError # bignum too big to convert into `long' + # Do nothing because the bignum should be treated as inifinity + end + f.puts(hist) end end end diff --git a/test/irb/test_history.rb b/test/irb/test_history.rb index dbfdf6fb2b..a2554faf26 100644 --- a/test/irb/test_history.rb +++ b/test/irb/test_history.rb @@ -52,6 +52,29 @@ module TestIRB HISTORY_FILE end + def test_history_save_bignum + result_output, result_history_file = launch_irb_with_irbrc_and_irb_history(<<~IRBRC, <<~IRB_HISTORY) do |stdin| + IRB.conf[:USE_READLINE] = true + IRB.conf[:SAVE_HISTORY] = 10 ** 19 + IRBRC + 1 + 2 + 3 + 4 + IRB_HISTORY + stdin.write("5\nexit\n") + end + + assert_equal(<<~HISTORY_FILE, result_history_file) + 1 + 2 + 3 + 4 + 5 + exit + HISTORY_FILE + end + private def launch_irb_with_irbrc_and_irb_history(irbrc, irb_history)