[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]