summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--string.c12
-rw-r--r--test/ruby/test_m17n_comb.rb15
-rw-r--r--version.h2
4 files changed, 28 insertions, 7 deletions
diff --git a/ChangeLog b/ChangeLog
index f8c65cf02b..478ab9defc 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Tue Feb 24 16:37:26 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * string.c (chompped_length): enable smart chomp for all non-dummy
+ encoding strings, not only default_rs.
+ [ruby-core:68258] [Bug #10893]
+
Tue Feb 24 16:31:53 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
* string.c (rb_str_split_m): raise ArgumentError at broken string
diff --git a/string.c b/string.c
index 3d9887b517..2652b291a5 100644
--- a/string.c
+++ b/string.c
@@ -7109,9 +7109,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)) {
@@ -7140,6 +7140,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) {
@@ -7167,10 +7168,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) {
@@ -7183,6 +7181,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
diff --git a/version.h b/version.h
index 0dd23deaa3..de73db6847 100644
--- a/version.h
+++ b/version.h
@@ -1,6 +1,6 @@
#define RUBY_VERSION "2.2.0"
#define RUBY_RELEASE_DATE "2015-02-24"
-#define RUBY_PATCHLEVEL 80
+#define RUBY_PATCHLEVEL 81
#define RUBY_RELEASE_YEAR 2015
#define RUBY_RELEASE_MONTH 2