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

ruby-changes:18961

From: naruse <ko1@a...>
Date: Tue, 1 Mar 2011 16:11:37 +0900 (JST)
Subject: [ruby-changes:18961] Ruby:r30994 (trunk): * string.c (rb_str_byteslice): the resulted encoding should keep

naruse	2011-03-01 16:02:08 +0900 (Tue, 01 Mar 2011)

  New Revision: 30994

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=30994

  Log:
    * string.c (rb_str_byteslice): the resulted encoding should keep
      original encoding. this also fixes the encoding when the result
      shares internal string. [ruby-core:35376]

  Modified files:
    trunk/ChangeLog
    trunk/string.c
    trunk/test/ruby/test_string.rb

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 30993)
+++ ChangeLog	(revision 30994)
@@ -1,3 +1,9 @@
+Tue Mar  1 15:59:53 2011  NARUSE, Yui  <naruse@r...>
+
+	* string.c (rb_str_byteslice): the resulted encoding should keep
+	  original encoding. this also fixes the encoding when the result
+	  shares internal string. [ruby-core:35376]
+
 Tue Mar  1 13:25:00 2011  Kenta Murata <mrkn@m...>
 
 	* ext/bigdecimal/bigdecimal.c (VpMemAlloc): CVE-2011-0188.
Index: string.c
===================================================================
--- string.c	(revision 30993)
+++ string.c	(revision 30994)
@@ -4014,6 +4014,7 @@
 	}
 	else {
 	    str2 = rb_str_new5(str, p, len);
+	    rb_enc_cr_str_copy_for_substr(str2, str);
 	    OBJ_INFECT(str2, str);
 	}
 
@@ -4030,14 +4031,13 @@
 
       num_index:
 	str = str_byte_substr(str, idx, 1);
-	if (!NIL_P(str) && RSTRING_LEN(str) == 0) return Qnil;
+	if (NIL_P(str) || RSTRING_LEN(str) == 0) return Qnil;
 	return str;
 
       default:
 	/* check if indx is Range */
 	{
 	    long beg, len = RSTRING_LEN(str);
-	    VALUE tmp;
 
 	    switch (rb_range_beg_len(indx, &beg, &len, len, 0)) {
 	      case Qfalse:
@@ -4045,8 +4045,7 @@
 	      case Qnil:
 		return Qnil;
 	      default:
-		tmp = str_byte_substr(str, beg, len);
-		return tmp;
+		return str_byte_substr(str, beg, len);
 	    }
 	}
 	idx = NUM2LONG(indx);
@@ -4069,7 +4068,7 @@
  *  an offset is negative, it is counted from the end of <i>str</i>. Returns
  *  <code>nil</code> if the initial offset falls outside the string, the length
  *  is negative, or the beginning of the range is greater than the end.
- *  The encoding of th3 resulted string is always ASCII-8BIT.
+ *  The encoding of the resulted string keeps original encoding.
  *
  *     "hello".byteslice(1)     #=> "e"
  *     "hello".byteslice(-1)    #=> "o"
Index: test/ruby/test_string.rb
===================================================================
--- test/ruby/test_string.rb	(revision 30993)
+++ test/ruby/test_string.rb	(revision 30994)
@@ -1945,32 +1945,34 @@
     assert_equal(S("hello "), b)
   end
 
-  def b(str)
-    str.force_encoding(Encoding::ASCII_8BIT)
+  def u(str)
+    str.force_encoding(Encoding::UTF_8)
   end
 
   def test_byteslice
-    assert_equal(b("h"), "hello".byteslice(0))
+    assert_equal("h", "hello".byteslice(0))
     assert_equal(nil, "hello".byteslice(5))
-    assert_equal(b("o"), "hello".byteslice(-1))
+    assert_equal("o", "hello".byteslice(-1))
     assert_equal(nil, "hello".byteslice(-6))
 
-    assert_equal(b(""), "hello".byteslice(0, 0))
-    assert_equal(b("hello"), "hello".byteslice(0, 6))
-    assert_equal(b("hello"), "hello".byteslice(0, 6))
-    assert_equal(b(""), "hello".byteslice(5, 1))
-    assert_equal(b("o"), "hello".byteslice(-1, 6))
+    assert_equal("", "hello".byteslice(0, 0))
+    assert_equal("hello", "hello".byteslice(0, 6))
+    assert_equal("hello", "hello".byteslice(0, 6))
+    assert_equal("", "hello".byteslice(5, 1))
+    assert_equal("o", "hello".byteslice(-1, 6))
     assert_equal(nil, "hello".byteslice(-6, 1))
 
-    assert_equal(b("h"), "hello".byteslice(0..0))
-    assert_equal(b(""), "hello".byteslice(5..0))
-    assert_equal(b("o"), "hello".byteslice(4..5))
+    assert_equal("h", "hello".byteslice(0..0))
+    assert_equal("", "hello".byteslice(5..0))
+    assert_equal("o", "hello".byteslice(4..5))
     assert_equal(nil, "hello".byteslice(6..0))
-    assert_equal(b(""), "hello".byteslice(-1..0))
-    assert_equal(b("llo"), "hello".byteslice(-3..5))
+    assert_equal("", "hello".byteslice(-1..0))
+    assert_equal("llo", "hello".byteslice(-3..5))
 
-    assert_equal(b("\x81"), "\u3042".byteslice(1))
-    assert_equal(b("\x81\x82"), "\u3042".byteslice(1, 2))
-    assert_equal(b("\x81\x82"), "\u3042".byteslice(1..2))
+    assert_equal(u("\x81"), "\u3042".byteslice(1))
+    assert_equal(u("\x81\x82"), "\u3042".byteslice(1, 2))
+    assert_equal(u("\x81\x82"), "\u3042".byteslice(1..2))
+
+    assert_equal(u("\x82")+("\u3042"*9), ("\u3042"*10).byteslice(2, 28))
   end
 end

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

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