From: marcandre-ruby-core@... Date: 2020-12-21T03:17:27+00:00 Subject: [ruby-core:101569] [Ruby master Bug#17405] irb ---nomultiline gets exception when output contains some non-ascii characters Issue #17405 has been updated by marcandre (Marc-Andre Lafortune). ruby -v changed from ruby 2.7.2p137 (2020-10-01 revision 5445e04352) [x86_64-darwin17] to ruby 3.0.0dev (2020-12-21T02:23:01Z master ac78d90d5e) [x86_64-darwin18] Assignee set to aycabta (aycabta .) I can reproduce on `master`. Maybe platform dependent? Hopefully @aycabta will figure something out... ``` $ ruby -v ruby 3.0.0dev (2020-12-21T02:23:01Z master ac78d90d5e) [x86_64-darwin18] $ irb --nomultiline irb(main):001:0> Reline::VERSION => "0.1.10" irb(main):001:0> source 'test.rb' test.rb(main):002:0> # coding: utf-8 => nil test.rb(main):003:0> m = "���10" Traceback (most recent call last): 8: from /Users/mal/.rbenv/versions/3/bin/irb:23:in `
' 7: from /Users/mal/.rbenv/versions/3/bin/irb:23:in `load' 6: from /Users/mal/.rbenv/versions/3.0.0-dev/lib/ruby/gems/3.0.0/gems/irb-1.2.8/exe/irb:11:in `' 5: from (irb):1:in `
' 4: from /Users/mal/.rbenv/versions/3.0.0-dev/lib/ruby/3.0.0/reline/unicode.rb:126:in `calculate_width' 3: from /Users/mal/.rbenv/versions/3.0.0-dev/lib/ruby/3.0.0/reline/unicode.rb:126:in `scan' 2: from /Users/mal/.rbenv/versions/3.0.0-dev/lib/ruby/3.0.0/reline/unicode.rb:136:in `block in calculate_width' 1: from /Users/mal/.rbenv/versions/3.0.0-dev/lib/ruby/3.0.0/reline/unicode.rb:136:in `+' TypeError (nil can't be coerced into Integer) test.rb(main):004:0> m => "���10" => nil ``` ---------------------------------------- Bug #17405: irb ---nomultiline gets exception when output contains some non-ascii characters https://bugs.ruby-lang.org/issues/17405#change-89354 * Author: rsharman (Richard Sharman) * Status: Open * Priority: Normal * Assignee: aycabta (aycabta .) * ruby -v: ruby 3.0.0dev (2020-12-21T02:23:01Z master ac78d90d5e) [x86_64-darwin18] * Backport: 2.5: UNKNOWN, 2.6: UNKNOWN, 2.7: UNKNOWN ---------------------------------------- When irb is called with the --nomultiline option (for example, when called from emacs), then if the output contains some special characters (such as the square root sign, or a single quotation mark), then irb gets an exception. Without the --multiline option the problem does not happen. Here is an example with a string assignment to variable m. Without fix: Without --nomultiline there is no problem: henry:tmp richard$ irb irb(main):001:0> source 'test.rb' test.rb(main):002:0> # coding: utf-8 => nil test.rb(main):003:0> m = "���10" => "���10" test.rb(main):004:0> m => "���10" => nil But with --nomultiline irb gets an exception (but the assignment did work): henry:tmp richard$ irb --nomultiline irb(main):001:0> source 'test.rb' test.rb(main):002:0> # coding: utf-8 => nil test.rb(main):003:0> m = "���10" Traceback (most recent call last): 8: from /Users/richard/.rbenv/versions/2.7.2/bin/irb:23:in `
' 7: from /Users/richard/.rbenv/versions/2.7.2/bin/irb:23:in `load' 6: from /Users/richard/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/irb-1.2.6/exe/irb:11:in `' 5: from (irb):1 4: from /Users/richard/.rbenv/versions/2.7.2/lib/ruby/2.7.0/reline/unicode.rb:99:in `calculate_width' 3: from /Users/richard/.rbenv/versions/2.7.2/lib/ruby/2.7.0/reline/unicode.rb:99:in `scan' 2: from /Users/richard/.rbenv/versions/2.7.2/lib/ruby/2.7.0/reline/unicode.rb:108:in `block in calculate_width' 1: from /Users/richard/.rbenv/versions/2.7.2/lib/ruby/2.7.0/reline/unicode.rb:108:in `+' TypeError (nil can't be coerced into Integer) test.rb(main):004:0> m => "���10" => nil The problem is that in method get_mbchar_width of class Reline::Unicode Reline.ambiguous_width can have a nil value, whereas the code seems to expect a low integer (unicode.rb line 84). This causes method calculate_width to add a nil value to width (line 109). I don���t know what value Reline.ambiguous_width should be in these cases; the simple change below uses a value of 1 to avoid the exception: ``` bash-5.1$ diff unicode.rb{.orig,} 84c84,85 < Reline.ambiguous_width --- > width = Reline.ambiguous_width > width.nil? ? 1 : width # if nil then assume 1 bash-5.1$ ``` ``` ``` With above fix: henry:tmp richard$ irb --nomultiline irb(main):001:0> source 'test.rb' test.rb(main):002:0> # coding: utf-8 => nil test.rb(main):003:0> m = "���10" => "���10" test.rb(main):004:0> m => "���10" => nil henry:tmp richard$ ---Files-------------------------------- test.rb (30 Bytes) Patch (456 Bytes) -- https://bugs.ruby-lang.org/ Unsubscribe: