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

ruby-changes:20980

From: nagachika <ko1@a...>
Date: Tue, 23 Aug 2011 23:09:44 +0900 (JST)
Subject: [ruby-changes:20980] nagachika:r33029 (ruby_1_9_3): * backport r33021 from trunk.

nagachika	2011-08-23 23:09:34 +0900 (Tue, 23 Aug 2011)

  New Revision: 33029

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

  Log:
    * backport r33021 from trunk.
    
    * sprintf.c (rb_str_format): add RB_GC_GUARD to prevent temporary
      strings from GC.

  Modified files:
    branches/ruby_1_9_3/ChangeLog
    branches/ruby_1_9_3/sprintf.c

Index: ruby_1_9_3/ChangeLog
===================================================================
--- ruby_1_9_3/ChangeLog	(revision 33028)
+++ ruby_1_9_3/ChangeLog	(revision 33029)
@@ -14,6 +14,13 @@
 
 	* test/zlib/test_zlib.rb (test_corrupted_header): Test it.
 
+Mon Aug 22 23:43:33 2011  CHIKANAGA Tomoyuki  <nagachika00@g...>
+
+	* backport r33021 from trunk.
+
+	* sprintf.c (rb_str_format): add RB_GC_GUARD to prevent temporary
+	  strings from GC.
+
 Sun Aug 21 17:58:38 2011  Kazuki Tsujimoto  <kazuki@c...>
 
 	* backport r33019 from trunk.
Index: ruby_1_9_3/sprintf.c
===================================================================
--- ruby_1_9_3/sprintf.c	(revision 33028)
+++ ruby_1_9_3/sprintf.c	(revision 33029)
@@ -641,6 +641,7 @@
 			rb_raise(rb_eArgError, "%%c requires a character");
 		    }
 		    c = rb_enc_codepoint_len(RSTRING_PTR(tmp), RSTRING_END(tmp), &n, enc);
+		    RB_GC_GUARD(tmp);
 		}
 		else {
 		    c = NUM2INT(val);
@@ -711,6 +712,7 @@
 			}
 			CHECK(len);
 			memcpy(&buf[blen], RSTRING_PTR(str), len);
+			RB_GC_GUARD(str);
 			blen += len;
 			if (flags&FMINUS) {
 			    CHECK(width);
@@ -723,6 +725,7 @@
 		    }
 		}
 		PUSH(RSTRING_PTR(str), len);
+		RB_GC_GUARD(str);
 		rb_enc_associate(result, enc);
 	    }
 	    break;
@@ -736,7 +739,6 @@
 	  case 'B':
 	  case 'u':
 	    {
-		volatile VALUE tmp1;
 		volatile VALUE val = GETARG();
 		char fbuf[32], nbuf[64], *s;
 		const char *prefix = 0;
@@ -887,7 +889,7 @@
 			    val = rb_big_clone(val);
 			    rb_big_2comp(val);
 			}
-			tmp1 = tmp = rb_big2str0(val, base, RBIGNUM_SIGN(val));
+			tmp = rb_big2str0(val, base, RBIGNUM_SIGN(val));
 			s = RSTRING_PTR(tmp);
 			if (*s == '-') {
 			    dots = 1;
@@ -981,6 +983,7 @@
 		    }
 		}
 		PUSH(s, len);
+		RB_GC_GUARD(tmp);
 		CHECK(width);
 		while (width-- > 0) {
 		    buf[blen++] = ' ';
@@ -1065,6 +1068,7 @@
     }
 
   sprint_exit:
+    RB_GC_GUARD(fmt);
     /* XXX - We cannot validate the number of arguments if (digit)$ style used.
      */
     if (posarg >= 0 && nextarg < argc) {

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

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