mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
merge revision(s) r46896,r46897,r46898: [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] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_1@47255 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
ff089f50a1
commit
b4893fc3d1
5 changed files with 43 additions and 15 deletions
|
@ -1,3 +1,9 @@
|
|||
Sat Aug 23 02:22:02 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||
|
||||
* 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]
|
||||
|
||||
Thu Aug 21 01:44:46 2014 Tanaka Akira <akr@fsij.org>
|
||||
|
||||
* gc.c (mark_current_machine_context): Call SET_STACK_END.
|
||||
|
|
29
string.c
29
string.c
|
@ -6059,21 +6059,25 @@ rb_str_count(int argc, VALUE *argv, VALUE str)
|
|||
{
|
||||
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);
|
||||
|
@ -6083,7 +6087,14 @@ rb_str_count(int argc, VALUE *argv, VALUE str)
|
|||
}
|
||||
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);
|
||||
|
|
|
@ -1037,6 +1037,11 @@ class TestM17N < Test::Unit::TestCase
|
|||
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")
|
||||
|
|
|
@ -87,7 +87,7 @@ class TestM17NComb < Test::Unit::TestCase
|
|||
r
|
||||
end
|
||||
|
||||
def assert_enccall(recv, meth, *args, &block)
|
||||
def encdumpcall(recv, meth, *args, &block)
|
||||
desc = ''
|
||||
if String === recv
|
||||
desc << encdump(recv)
|
||||
|
@ -110,6 +110,11 @@ class TestM17NComb < Test::Unit::TestCase
|
|||
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)
|
||||
|
@ -709,12 +714,13 @@ class TestM17NComb < Test::Unit::TestCase
|
|||
|
||||
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)
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
#define RUBY_VERSION "2.1.2"
|
||||
#define RUBY_RELEASE_DATE "2014-08-21"
|
||||
#define RUBY_PATCHLEVEL 205
|
||||
#define RUBY_RELEASE_DATE "2014-08-23"
|
||||
#define RUBY_PATCHLEVEL 206
|
||||
|
||||
#define RUBY_RELEASE_YEAR 2014
|
||||
#define RUBY_RELEASE_MONTH 8
|
||||
#define RUBY_RELEASE_DAY 21
|
||||
#define RUBY_RELEASE_DAY 23
|
||||
|
||||
#include "ruby/version.h"
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue