From 4c0106ead6ba06487e837f32e3d80ecd8a310032 Mon Sep 17 00:00:00 2001 From: nobu Date: Tue, 24 Feb 2015 00:47:12 +0000 Subject: string.c: smart chomp * string.c (chompped_length): enable smart chomp for all non-dummy encoding strings, not only default_rs. [ruby-core:68258] [Bug #10893] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@49706 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 6 ++++++ string.c | 12 +++++++----- test/ruby/test_m17n_comb.rb | 15 ++++++++++++++- 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index 7daabe22ce..2493da9297 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Tue Feb 24 09:47:07 2015 Nobuyoshi Nakada + + * string.c (chompped_length): enable smart chomp for all non-dummy + encoding strings, not only default_rs. + [ruby-core:68258] [Bug #10893] + Mon Feb 23 23:19:42 2015 Nobuyoshi Nakada * tool/vcs.rb (IO.popen): support :chdir option. diff --git a/string.c b/string.c index e6e28d6838..9419e31115 100644 --- a/string.c +++ b/string.c @@ -7112,9 +7112,9 @@ chompped_length(VALUE str, VALUE rs) if (len == 0) return 0; e = p + len; - enc = rb_enc_get(str); if (rs == rb_default_rs) { smart_chomp: + enc = rb_enc_get(str); if (rb_enc_mbminlen(enc) > 1) { pp = rb_enc_left_char_head(p, e-rb_enc_mbminlen(enc), e, enc); if (rb_enc_is_newline(pp, e, enc)) { @@ -7143,6 +7143,7 @@ chompped_length(VALUE str, VALUE rs) return e - p; } + enc = rb_enc_get(str); RSTRING_GETMEM(rs, rsptr, rslen); if (rslen == 0) { if (rb_enc_mbminlen(enc) > 1) { @@ -7170,10 +7171,7 @@ chompped_length(VALUE str, VALUE rs) } if (rslen > len) return len; - enc = rb_enc_check(str, rs); - if (is_broken_string(rs)) { - return len; - } + enc = rb_enc_get(rs); newline = rsptr[rslen-1]; if (rslen == rb_enc_mbminlen(enc)) { if (rslen == 1) { @@ -7186,6 +7184,10 @@ chompped_length(VALUE str, VALUE rs) } } + enc = rb_enc_check(str, rs); + if (is_broken_string(rs)) { + return len; + } pp = e - rslen; if (p[len-1] == newline && (rslen <= 1 || diff --git a/test/ruby/test_m17n_comb.rb b/test/ruby/test_m17n_comb.rb index b7efd030fe..c35be701c6 100644 --- a/test/ruby/test_m17n_comb.rb +++ b/test/ruby/test_m17n_comb.rb @@ -659,7 +659,9 @@ class TestM17NComb < Test::Unit::TestCase combination(STRINGS, STRINGS) {|s1, s2| if !s1.ascii_only? && !s2.ascii_only? && !Encoding.compatible?(s1,s2) if s1.bytesize > s2.bytesize - assert_raise(Encoding::CompatibilityError) { s1.chomp(s2) } + assert_raise(Encoding::CompatibilityError, "#{encdump(s1)}.chomp(#{encdump(s2)})") do + s1.chomp(s2) + end end next end @@ -672,6 +674,17 @@ class TestM17NComb < Test::Unit::TestCase } end + def test_str_smart_chomp + bug10893 = '[ruby-core:68258] [Bug #10893]' + encodings = Encoding.list.select {|enc| !enc.dummy?} + combination(encodings, encodings) do |e1, e2| + expected = "abc".encode(e1) + combination(["abc\n", "abc\r\n"], ["", "\n"]) do |str, rs| + assert_equal(expected, str.encode(e1).chomp(rs.encode(e2)), bug10893) + end + end + end + def test_str_chop STRINGS.each {|s| s = s.dup -- cgit v1.2.3