diff options
author | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-10-02 11:46:40 +0000 |
---|---|---|
committer | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-10-02 11:46:40 +0000 |
commit | bd421aa2d25aa73c83642a8f5af8fa16b794a3b6 (patch) | |
tree | d4e528d553256bdef37711ce58dba2705ad3df80 | |
parent | 255f43160bf165df350454bdf4dcf72275029704 (diff) |
* string.c (rb_str_sub_bang): fix coderange.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@19662 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | string.c | 6 | ||||
-rw-r--r-- | test/ruby/test_m17n.rb | 15 | ||||
-rw-r--r-- | test/ruby/test_m17n_comb.rb | 33 |
4 files changed, 45 insertions, 13 deletions
@@ -1,3 +1,7 @@ +Thu Oct 2 20:46:17 2008 Tanaka Akira <[email protected]> + + * string.c (rb_str_sub_bang): fix coderange. + Wed Oct 1 22:54:09 2008 Yusuke Endoh <[email protected]> * lib/rexml/parsers/lightparser.rb, lib/debug.rb: remove unused when @@ -3307,7 +3307,11 @@ rb_str_sub_bang(int argc, VALUE *argv, VALUE str) 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) { diff --git a/test/ruby/test_m17n.rb b/test/ruby/test_m17n.rb index a1772f6408..416d8e190c 100644 --- a/test/ruby/test_m17n.rb +++ b/test/ruby/test_m17n.rb @@ -959,6 +959,21 @@ class TestM17N < Test::Unit::TestCase 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")) diff --git a/test/ruby/test_m17n_comb.rb b/test/ruby/test_m17n_comb.rb index 1ce151d665..05e45d23cf 100644 --- a/test/ruby/test_m17n_comb.rb +++ b/test/ruby/test_m17n_comb.rb @@ -115,6 +115,7 @@ class TestM17NComb < Test::Unit::TestCase def combination(*args, &b) AllPairs.each(*args, &b) + #AllPairs.exhaustive_each(*args, &b) end def encdump(str) @@ -1395,21 +1396,25 @@ class TestM17NComb < Test::Unit::TestCase [ [ "#{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 @@ class TestM17NComb < Test::Unit::TestCase 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 @@ class TestM17NComb < Test::Unit::TestCase [ [ "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 @@ class TestM17NComb < Test::Unit::TestCase 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 |