diff options
author | naruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-03-25 09:20:04 +0000 |
---|---|---|
committer | naruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-03-25 09:20:04 +0000 |
commit | 73a184cc3a4ead8a3242a8f04c4e65fa99026eef (patch) | |
tree | 4c8bc8980cda61fe0f90a3630a4fc758bd74c7ec | |
parent | 0c9f66eb400a78ef2e201a30a3904f59033d0439 (diff) | |
download | ruby-73a184cc3a4ead8a3242a8f04c4e65fa99026eef.tar.gz |
* string.c (tr_setup_table): fix multiple non latin argument for
non latin (over 256 characters) tr-like methods.
[ruby-core:43371] [Bug #6167]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@35127 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | string.c | 10 | ||||
-rw-r--r-- | test/ruby/test_string.rb | 7 |
3 files changed, 20 insertions, 3 deletions
@@ -1,3 +1,9 @@ +Sun Mar 25 18:13:14 2012 NARUSE, Yui <naruse@ruby-lang.org> + + * string.c (tr_setup_table): fix multiple non latin argument for + non latin (over 256 characters) tr-like methods. + [ruby-core:43371] [Bug #6167] + Sun Mar 25 00:46:06 2012 Shugo Maeda <shugo@ruby-lang.org> * enumerator (lazy_initialize): set the instance variable "receiver" @@ -5332,18 +5332,19 @@ tr_setup_table(VALUE str, char stable[TR_TABLE_SIZE], int first, else { VALUE key = UINT2NUM(c); - if (!table) { - table = rb_hash_new(); + if (!table && (first || *tablep || stable[256])) { if (cflag) { ptable = *ctablep; + table = ptable ? ptable : rb_hash_new(); *ctablep = table; } else { + table = rb_hash_new(); ptable = *tablep; *tablep = table; } } - if (!ptable || !NIL_P(rb_hash_aref(ptable, key))) { + if (table && (!ptable || (cflag ^ !NIL_P(rb_hash_aref(ptable, key))))) { rb_hash_aset(table, key, Qtrue); } } @@ -5351,6 +5352,9 @@ tr_setup_table(VALUE str, char stable[TR_TABLE_SIZE], int first, for (i=0; i<256; i++) { stable[i] = stable[i] && buf[i]; } + if (!table && !cflag) { + *tablep = 0; + } } diff --git a/test/ruby/test_string.rb b/test/ruby/test_string.rb index f8336679b5..27cb3a2552 100644 --- a/test/ruby/test_string.rb +++ b/test/ruby/test_string.rb @@ -483,8 +483,15 @@ class TestString < Test::Unit::TestCase assert_equal(4, a.count(S("ej-m"))) assert_equal(0, S("y").count(S("a\\-z"))) assert_equal(5, "abc\u{3042 3044 3046}".count("^a")) + assert_equal(1, "abc\u{3042 3044 3046}".count("\u3042")) assert_equal(5, "abc\u{3042 3044 3046}".count("^\u3042")) assert_equal(2, "abc\u{3042 3044 3046}".count("a-z", "^a")) + assert_equal(0, "abc\u{3042 3044 3046}".count("a", "\u3042")) + assert_equal(0, "abc\u{3042 3044 3046}".count("\u3042", "a")) + assert_equal(0, "abc\u{3042 3044 3046}".count("\u3042", "\u3044")) + assert_equal(4, "abc\u{3042 3044 3046}".count("^a", "^\u3044")) + assert_equal(4, "abc\u{3042 3044 3046}".count("^\u3044", "^a")) + assert_equal(4, "abc\u{3042 3044 3046}".count("^\u3042", "^\u3044")) assert_raise(ArgumentError) { "foo".count } end |