ruby-changes:35319
From: usa <ko1@a...>
Date: Fri, 5 Sep 2014 13:50:12 +0900 (JST)
Subject: [ruby-changes:35319] usa:r47401 (ruby_2_0_0): merge revision(s) 46896-46898: [Backport #10078]
usa 2014-09-05 13:50:03 +0900 (Fri, 05 Sep 2014) New Revision: 47401 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=47401 Log: merge revision(s) 46896-46898: [Backport #10078] * string.c (rb_str_count): fix wrong single-byte optimization. 7bit ascii can be a trailing byte in Shift_JIS. [ruby-dev:48442] [Bug #10078] Modified directories: branches/ruby_2_0_0/ Modified files: branches/ruby_2_0_0/ChangeLog branches/ruby_2_0_0/string.c branches/ruby_2_0_0/test/ruby/test_m17n.rb branches/ruby_2_0_0/test/ruby/test_m17n_comb.rb branches/ruby_2_0_0/version.h Index: ruby_2_0_0/ChangeLog =================================================================== --- ruby_2_0_0/ChangeLog (revision 47400) +++ ruby_2_0_0/ChangeLog (revision 47401) @@ -1,3 +1,9 @@ https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/ChangeLog#L1 +Fri Sep 5 13:44:53 2014 Nobuyoshi Nakada <nobu@r...> + + * string.c (rb_str_count): fix wrong single-byte optimization. + 7bit ascii can be a trailing byte in Shift_JIS. + [ruby-dev:48442] [Bug #10078] + Fri Sep 5 13:36:12 2014 NAKAMURA Usaku <usa@r...> merge r46831 partially. these changes are from: Index: ruby_2_0_0/string.c =================================================================== --- ruby_2_0_0/string.c (revision 47400) +++ ruby_2_0_0/string.c (revision 47401) @@ -5794,21 +5794,25 @@ rb_str_count(int argc, VALUE *argv, VALU https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/string.c#L5794 { char table[TR_TABLE_SIZE]; rb_encoding *enc = 0; - VALUE del = 0, nodel = 0; + VALUE del = 0, nodel = 0, tstr; char *s, *send; int i; int ascompat; rb_check_arity(argc, 1, UNLIMITED_ARGUMENTS); - for (i=0; i<argc; i++) { - VALUE tstr = argv[i]; - unsigned char c; - StringValue(tstr); - enc = rb_enc_check(str, tstr); - if (argc == 1 && RSTRING_LEN(tstr) == 1 && rb_enc_asciicompat(enc) && - (c = RSTRING_PTR(tstr)[0]) < 0x80 && !is_broken_string(str)) { + tstr = argv[0]; + StringValue(tstr); + enc = rb_enc_check(str, tstr); + if (argc == 1) { + const char *ptstr; + if (RSTRING_LEN(tstr) == 1 && rb_enc_asciicompat(enc) && + (ptstr = RSTRING_PTR(tstr), + ONIGENC_IS_ALLOWED_REVERSE_MATCH(enc, (const unsigned char *)ptstr, (const unsigned char *)ptstr+1)) && + !is_broken_string(str)) { int n = 0; + int clen; + unsigned char c = rb_enc_codepoint_len(ptstr, ptstr+1, &clen, enc); s = RSTRING_PTR(str); if (!s || RSTRING_LEN(str) == 0) return INT2FIX(0); @@ -5818,7 +5822,14 @@ rb_str_count(int argc, VALUE *argv, VALU https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/string.c#L5822 } return INT2NUM(n); } - tr_setup_table(tstr, table, i==0, &del, &nodel, enc); + } + + tr_setup_table(tstr, table, TRUE, &del, &nodel, enc); + for (i=1; i<argc; i++) { + tstr = argv[i]; + StringValue(tstr); + enc = rb_enc_check(str, tstr); + tr_setup_table(tstr, table, FALSE, &del, &nodel, enc); } s = RSTRING_PTR(str); Index: ruby_2_0_0/version.h =================================================================== --- ruby_2_0_0/version.h (revision 47400) +++ ruby_2_0_0/version.h (revision 47401) @@ -1,6 +1,6 @@ https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/version.h#L1 #define RUBY_VERSION "2.0.0" #define RUBY_RELEASE_DATE "2014-09-05" -#define RUBY_PATCHLEVEL 550 +#define RUBY_PATCHLEVEL 551 #define RUBY_RELEASE_YEAR 2014 #define RUBY_RELEASE_MONTH 9 Index: ruby_2_0_0/test/ruby/test_m17n.rb =================================================================== --- ruby_2_0_0/test/ruby/test_m17n.rb (revision 47400) +++ ruby_2_0_0/test/ruby/test_m17n.rb (revision 47401) @@ -1026,6 +1026,11 @@ class TestM17N < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/test/ruby/test_m17n.rb#L1026 assert_raise(Encoding::CompatibilityError){s.count(a("\xa3\xb0"))} end + def test_count_sjis_trailing_byte + bug10078 = '[ruby-dev:48442] [Bug #10078]' + assert_equal(0, s("\x98\x61").count("a"), bug10078) + end + def test_delete assert_equal(1, e("\xa1\xa2").delete("z").length) s = e("\xa3\xb0\xa3\xb1\xa3\xb2\xa3\xb3\xa3\xb4") Index: ruby_2_0_0/test/ruby/test_m17n_comb.rb =================================================================== --- ruby_2_0_0/test/ruby/test_m17n_comb.rb (revision 47400) +++ ruby_2_0_0/test/ruby/test_m17n_comb.rb (revision 47401) @@ -84,7 +84,7 @@ class TestM17NComb < Test::Unit::TestCas https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/test/ruby/test_m17n_comb.rb#L84 r end - def enccall(recv, meth, *args, &block) + def encdumpcall(recv, meth, *args, &block) desc = '' if String === recv desc << encdump(recv) @@ -107,12 +107,18 @@ class TestM17NComb < Test::Unit::TestCas https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/test/ruby/test_m17n_comb.rb#L107 if block desc << ' {}' end + desc + end + + def assert_enccall(recv, meth, *args, &block) + desc = encdumpcall(recv, meth, *args, &block) result = nil assert_nothing_raised(desc) { result = recv.send(meth, *args, &block) } result end + alias enccall assert_enccall def assert_str_enc_propagation(t, s1, s2) if !s1.ascii_only? @@ -705,12 +711,13 @@ class TestM17NComb < Test::Unit::TestCas https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/test/ruby/test_m17n_comb.rb#L711 def test_str_count combination(STRINGS, STRINGS) {|s1, s2| + desc = proc {encdumpcall(s1, :count, s2)} if !s1.valid_encoding? || !s2.valid_encoding? - assert_raise(ArgumentError, Encoding::CompatibilityError) { s1.count(s2) } + assert_raise(ArgumentError, Encoding::CompatibilityError, desc) { s1.count(s2) } next end if !s1.ascii_only? && !s2.ascii_only? && s1.encoding != s2.encoding - assert_raise(Encoding::CompatibilityError) { s1.count(s2) } + assert_raise(Encoding::CompatibilityError, desc) { s1.count(s2) } next end n = enccall(s1, :count, s2) Property changes on: ruby_2_0_0 ___________________________________________________________________ Modified: svn:mergeinfo Merged /trunk:r46896-46898 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/