ruby-changes:8134
From: akr <ko1@a...>
Date: Thu, 2 Oct 2008 20:47:03 +0900 (JST)
Subject: [ruby-changes:8134] Ruby:r19662 (trunk): * string.c (rb_str_sub_bang): fix coderange.
akr 2008-10-02 20:46:40 +0900 (Thu, 02 Oct 2008) New Revision: 19662 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=19662 Log: * string.c (rb_str_sub_bang): fix coderange. Modified files: trunk/ChangeLog trunk/string.c trunk/test/ruby/test_m17n.rb trunk/test/ruby/test_m17n_comb.rb Index: ChangeLog =================================================================== --- ChangeLog (revision 19661) +++ ChangeLog (revision 19662) @@ -1,3 +1,7 @@ +Thu Oct 2 20:46:17 2008 Tanaka Akira <akr@f...> + + * string.c (rb_str_sub_bang): fix coderange. + Wed Oct 1 22:54:09 2008 Yusuke Endoh <mame@t...> * lib/rexml/parsers/lightparser.rb, lib/debug.rb: remove unused when Index: string.c =================================================================== --- string.c (revision 19661) +++ string.c (revision 19662) @@ -3307,7 +3307,11 @@ if (OBJ_UNTRUSTED(repl)) untrusted = 1; if (ENC_CODERANGE_UNKNOWN < cr && cr < ENC_CODERANGE_BROKEN) { int cr2 = ENC_CODERANGE(repl); - if (cr2 == ENC_CODERANGE_UNKNOWN || cr2 > cr) cr = cr2; + if (cr2 == ENC_CODERANGE_BROKEN || + (cr == ENC_CODERANGE_VALID && cr2 == ENC_CODERANGE_7BIT)) + cr = ENC_CODERANGE_UNKNOWN; + else + cr = cr2; } plen = end0 - beg0; if (RSTRING_LEN(repl) > plen) { Index: test/ruby/test_m17n.rb =================================================================== --- test/ruby/test_m17n.rb (revision 19661) +++ test/ruby/test_m17n.rb (revision 19662) @@ -959,6 +959,21 @@ assert_equal(Encoding::EUC_JP, "\xa4\xa2".force_encoding("euc-jp").gsub(/./, '\&').encoding) end + def test_sub2 + s = "\x80".force_encoding("ASCII-8BIT") + r = Regexp.new("\x80".force_encoding("ASCII-8BIT")) + s2 = s.sub(r, "") + assert(s2.empty?) + assert(s2.ascii_only?) + end + + def test_sub3 + repl = "\x81".force_encoding("sjis") + assert_equal(false, repl.valid_encoding?) + s = "a@".sub(/a/, repl) + assert(s.valid_encoding?) + end + def test_insert s = e("\xa3\xb0\xa3\xb1\xa3\xb2\xa3\xb3\xa3\xb4") assert_equal(e("\xa3\xb0\xa3\xb1\xa3\xb2\xa3\xb3\xa3\xb4a"), s.insert(-1, "a")) Index: test/ruby/test_m17n_comb.rb =================================================================== --- test/ruby/test_m17n_comb.rb (revision 19661) +++ test/ruby/test_m17n_comb.rb (revision 19662) @@ -115,6 +115,7 @@ def combination(*args, &b) AllPairs.each(*args, &b) + #AllPairs.exhaustive_each(*args, &b) end def encdump(str) @@ -1395,21 +1396,25 @@ [ [ "#{encdump s1}.sub(Regexp.new(#{encdump s2}), #{encdump s3})", - lambda { s1.sub(r2, s3) } + lambda { s1.sub(r2, s3) }, + false ], [ "#{encdump s1}.sub(Regexp.new(#{encdump s2}), #{encdump s3})", - lambda { s1.sub(r2) { s3 } } + lambda { s1.sub(r2) { s3 } }, + false ], [ "#{encdump s1}.gsub(Regexp.new(#{encdump s2}), #{encdump s3})", - lambda { s1.gsub(r2, s3) } + lambda { s1.gsub(r2, s3) }, + true ], [ "#{encdump s1}.gsub(Regexp.new(#{encdump s2}), #{encdump s3})", - lambda { s1.gsub(r2) { s3 } } + lambda { s1.gsub(r2) { s3 } }, + true ] - ].each {|desc, doit| + ].each {|desc, doit, g| if !s1.valid_encoding? assert_raise(ArgumentError, desc) { doit.call } next @@ -1422,7 +1427,7 @@ assert_equal(s1, doit.call) next end - if !str_enc_compatible?(s1.gsub(r2, ''), s3) + if !str_enc_compatible?(g ? s1.gsub(r2, '') : s1.sub(r2, ''), s3) assert_raise(Encoding::CompatibilityError, desc) { doit.call } next end @@ -1449,21 +1454,25 @@ [ [ "t=#{encdump s1}.dup;t.sub!(Regexp.new(#{encdump s2}), #{encdump s3})", - lambda { t=s1.dup; [t, t.sub!(r2, s3)] } + lambda { t=s1.dup; [t, t.sub!(r2, s3)] }, + false ], [ "t=#{encdump s1}.dup;t.sub!(Regexp.new(#{encdump s2}), #{encdump s3})", - lambda { t=s1.dup; [t, t.sub!(r2) { s3 }] } + lambda { t=s1.dup; [t, t.sub!(r2) { s3 }] }, + false ], [ "t=#{encdump s1}.dup;t.gsub!(Regexp.new(#{encdump s2}), #{encdump s3})", - lambda { t=s1.dup; [t, t.gsub!(r2, s3)] } + lambda { t=s1.dup; [t, t.gsub!(r2, s3)] }, + true ], [ "t=#{encdump s1}.dup;t.gsub!(Regexp.new(#{encdump s2}), #{encdump s3})", - lambda { t=s1.dup; [t, t.gsub!(r2) { s3 }] } + lambda { t=s1.dup; [t, t.gsub!(r2) { s3 }] }, + true ] - ].each {|desc, doit| + ].each {|desc, doit, g| if !s1.valid_encoding? assert_raise(ArgumentError, desc) { doit.call } next @@ -1476,7 +1485,7 @@ assert_equal([s1, nil], doit.call) next end - if !str_enc_compatible?(s1.gsub(r2, ''), s3) + if !str_enc_compatible?(g ? s1.gsub(r2, '') : s1.sub(r2, ''), s3) assert_raise(Encoding::CompatibilityError, desc) { doit.call } next end -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/