From: Kazuhiro NISHIYAMA Date: 2004-11-18T18:55:53+09:00 Subject: [ruby-dev:24915] String#upcase bug 西山和広です。 String#upcaseが元の文字列を変更してしまうようです。 % ruby18 -ve 's="hoge";s.upcase;p s' ruby 1.8.2 (2004-11-18) [i686-linux] "HOGE" % ruby18 -ve 's="hoge";s.freeze.upcase;p s' ruby 1.8.2 (2004-11-18) [i686-linux] "HOGE" % ruby18 -ve 's="hoge";s.freeze.upcase!;p s' ruby 1.8.2 (2004-11-18) [i686-linux] "HOGE" % Index: ChangeLog =================================================================== RCS file: /src/ruby/ChangeLog,v retrieving revision 1.2673.2.619 diff -u -p -r1.2673.2.619 ChangeLog --- ChangeLog 18 Nov 2004 03:47:14 -0000 1.2673.2.619 +++ ChangeLog 18 Nov 2004 09:47:25 -0000 @@ -1,3 +1,10 @@ +Thu Nov 18 18:41:08 2004 Kazuhiro NISHIYAMA + + * test/ruby/test_stringchar.rb (test_bang): added. + + * string.c (rb_str_upcase_bang, rb_str_capitalize_bang) + (rb_str_swapcase_bang): missing rb_str_modify(). + Thu Nov 18 00:21:15 2004 Yukihiro Matsumoto * process.c (proc_getpgrp): prohibit for $SAFE=2. Index: string.c =================================================================== RCS file: /src/ruby/string.c,v retrieving revision 1.182.2.29 diff -u -p -r1.182.2.29 string.c --- string.c 18 Nov 2004 03:47:13 -0000 1.182.2.29 +++ string.c 18 Nov 2004 09:47:25 -0000 @@ -2725,6 +2725,7 @@ rb_str_upcase_bang(str) char *s, *send; int modify = 0; + rb_str_modify(str); s = RSTRING(str)->ptr; send = s + RSTRING(str)->len; while (s < send) { if (ismbchar(*s)) { @@ -2838,6 +2839,7 @@ rb_str_capitalize_bang(str) char *s, *send; int modify = 0; + rb_str_modify(str); if (RSTRING(str)->len == 0 || !RSTRING(str)->ptr) return Qnil; s = RSTRING(str)->ptr; send = s + RSTRING(str)->len; if (ISLOWER(*s)) { @@ -2895,6 +2897,7 @@ rb_str_swapcase_bang(str) char *s, *send; int modify = 0; + rb_str_modify(str); s = RSTRING(str)->ptr; send = s + RSTRING(str)->len; while (s < send) { if (ismbchar(*s)) { Index: test/ruby/test_stringchar.rb =================================================================== RCS file: /src/ruby/test/ruby/test_stringchar.rb,v retrieving revision 1.4.2.1 diff -u -p -r1.4.2.1 test_stringchar.rb --- test/ruby/test_stringchar.rb 18 Feb 2004 13:21:10 -0000 1.4.2.1 +++ test/ruby/test_stringchar.rb 18 Nov 2004 09:47:36 -0000 @@ -113,4 +113,54 @@ EOS } assert_equal(0, a.size) end + + def test_bang + s = "aBc" + s.upcase + assert_equal("aBc", s) + s.upcase! + assert_equal("ABC", s) + + s = "aBc" + s.downcase + assert_equal("aBc", s) + s.downcase! + assert_equal("abc", s) + + s = "aBc" + s.swapcase + assert_equal("aBc", s) + s.swapcase! + assert_equal("AbC", s) + + s = "aBc" + s.capitalize + assert_equal("aBc", s) + s.capitalize! + assert_equal("Abc", s) + + s = "aBc" + s.tr("a-z", "A-Z") + assert_equal("aBc", s) + s.tr!("a-z", "A-Z") + assert_equal("ABC", s) + + s = "aaBBcc" + s.tr_s("a-z", "A-Z") + assert_equal("aaBBcc", s) + s.tr_s!("a-z", "A-Z") + assert_equal("ABBC", s) + + s = "aaBBcc" + s.squeeze("a-z") + assert_equal("aaBBcc", s) + s.squeeze!("a-z") + assert_equal("aBBc", s) + + s = "aaBBcc" + s.delete("a-z") + assert_equal("aaBBcc", s) + s.delete!("a-z") + assert_equal("BB", s) + end end -- |ZnZ(ゼット エヌ ゼット) |西山和広(Kazuhiro NISHIYAMA)