summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog4
-rw-r--r--string.c6
-rw-r--r--test/ruby/test_m17n.rb15
-rw-r--r--test/ruby/test_m17n_comb.rb33
4 files changed, 45 insertions, 13 deletions
diff --git a/ChangeLog b/ChangeLog
index a97871343b..eb7465f0b1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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
diff --git a/string.c b/string.c
index 06bb26caa3..d1fe9db70e 100644
--- a/string.c
+++ b/string.c
@@ -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