summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--string.c10
-rw-r--r--test/ruby/test_string.rb7
3 files changed, 20 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index 5c101f95c5..14ae8e5a53 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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"
diff --git a/string.c b/string.c
index 7fd2d94e59..7d865d669a 100644
--- a/string.c
+++ b/string.c
@@ -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