* 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
This commit is contained in:
akr 2008-10-02 11:46:40 +00:00
Родитель 255f43160b
Коммит bd421aa2d2
4 изменённых файлов: 45 добавлений и 13 удалений

Просмотреть файл

@ -1,3 +1,7 @@
Thu Oct 2 20:46:17 2008 Tanaka Akira <akr@fsij.org>
* string.c (rb_str_sub_bang): fix coderange.
Wed Oct 1 22:54:09 2008 Yusuke Endoh <mame@tsg.ne.jp>
* 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) {

Просмотреть файл

@ -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"))

Просмотреть файл

@ -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