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

ruby-changes:17448

From: naruse <ko1@a...>
Date: Tue, 12 Oct 2010 18:29:16 +0900 (JST)
Subject: [ruby-changes:17448] Ruby:r29453 (trunk): * string.c (rb_str_concat): use unsigned int for GB18030.

naruse	2010-10-12 18:25:33 +0900 (Tue, 12 Oct 2010)

  New Revision: 29453

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

  Log:
    * string.c (rb_str_concat): use unsigned int for GB18030.

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

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 29452)
+++ ChangeLog	(revision 29453)
@@ -1,3 +1,7 @@
+Tue Oct 12 18:25:04 2010  NARUSE, Yui  <naruse@r...>
+
+	* string.c (rb_str_concat): use unsigned int for GB18030.
+
 Tue Oct 12 17:53:49 2010  NARUSE, Yui  <naruse@r...>
 
 	* numeric (check_uint): the mask must refer to VALUE.
Index: string.c
===================================================================
--- string.c	(revision 29452)
+++ string.c	(revision 29453)
@@ -2021,37 +2021,28 @@
 VALUE
 rb_str_concat(VALUE str1, VALUE str2)
 {
-    SIGNED_VALUE lc;
+    unsigned int lc;
 
     if (FIXNUM_P(str2)) {
-	lc = FIX2LONG(str2);
-	if (lc < 0)
-	    rb_raise(rb_eRangeError, "negative argument");
+	lc = FIX2UINT(str2);
     }
     else if (TYPE(str2) == T_BIGNUM) {
-	if (!RBIGNUM_SIGN(str2))
-	    rb_raise(rb_eRangeError, "negative argument");
-	lc = rb_big2ulong(str2);
+	lc = NUM2UINT(str2);
     }
     else {
 	return rb_str_append(str1, str2);
     }
-#if SIZEOF_INT < SIZEOF_VALUE
-    if ((VALUE)lc > UINT_MAX) {
-	rb_raise(rb_eRangeError, "%"PRIuVALUE" out of char range", lc);
-    }
-#endif
     {
 	rb_encoding *enc = STR_ENC_GET(str1);
 	long pos = RSTRING_LEN(str1);
 	int cr = ENC_CODERANGE(str1);
-	int c, len;
+	int len;
 
-	if ((len = rb_enc_codelen(c = (int)lc, enc)) <= 0) {
-	    rb_raise(rb_eRangeError, "%u invalid char", c);
+	if ((len = rb_enc_codelen(lc, enc)) <= 0) {
+	    rb_raise(rb_eRangeError, "%u invalid char", lc);
 	}
 	rb_str_resize(str1, pos+len);
-	rb_enc_mbcput(c, RSTRING_PTR(str1)+pos, enc);
+	rb_enc_mbcput(lc, RSTRING_PTR(str1)+pos, enc);
 	ENC_CODERANGE_SET(str1, cr);
 	return str1;
     }
Index: test/ruby/test_m17n_comb.rb
===================================================================
--- test/ruby/test_m17n_comb.rb	(revision 29452)
+++ test/ruby/test_m17n_comb.rb	(revision 29453)
@@ -346,6 +346,9 @@
         assert_raise(Encoding::CompatibilityError) { s << s2 }
       end
     }
+
+    assert_equal("A\x84\x31\xA4\x39".force_encoding("GB18030"),
+                 "A".force_encoding("GB18030") << 0x8431A439)
   end
 
   def test_str_aref

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

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