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

ruby-changes:7787

From: akr <ko1@a...>
Date: Sat, 13 Sep 2008 00:40:09 +0900 (JST)
Subject: [ruby-changes:7787] Ruby:r19307 (trunk): * transcode.c (enc_arg): take arg as VALUE * to prevent GC problem.

akr	2008-09-13 00:39:46 +0900 (Sat, 13 Sep 2008)

  New Revision: 19307

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

  Log:
    * transcode.c (enc_arg): take arg as VALUE * to prevent GC problem.

  Modified files:
    trunk/ChangeLog
    trunk/transcode.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 19306)
+++ ChangeLog	(revision 19307)
@@ -1,3 +1,7 @@
+Sat Sep 13 00:38:54 2008  Tanaka Akira  <akr@f...>
+
+	* transcode.c (enc_arg): take arg as VALUE * to prevent GC problem.
+
 Fri Sep 12 23:19:41 2008  Tanaka Akira  <akr@f...>
 
 	* transcode.c (rb_econv_add_transcoder_at): fix loop condition.
Index: transcode.c
===================================================================
--- transcode.c	(revision 19306)
+++ transcode.c	(revision 19307)
@@ -2361,17 +2361,17 @@
 }
 
 static int
-enc_arg(VALUE arg, const char **name_p, rb_encoding **enc_p)
+enc_arg(volatile VALUE *arg, const char **name_p, rb_encoding **enc_p)
 {
     rb_encoding *enc;
     const char *n;
     int encidx;
     VALUE encval;
 
-    if ((encidx = rb_to_encoding_index(encval = arg)) < 0) {
+    if ((encidx = rb_to_encoding_index(encval = *arg)) < 0) {
 	enc = NULL;
 	encidx = 0;
-	n = StringValueCStr(encval);
+	n = StringValueCStr(*arg);
     }
     else {
 	enc = rb_enc_from_index(encidx);
@@ -2385,7 +2385,7 @@
 }
 
 static int
-str_transcode_enc_args(VALUE str, VALUE arg1, VALUE arg2,
+str_transcode_enc_args(VALUE str, volatile VALUE *arg1, volatile VALUE *arg2,
         const char **sname_p, rb_encoding **senc_p,
         const char **dname_p, rb_encoding **denc_p)
 {
@@ -2395,7 +2395,7 @@
 
     dencidx = enc_arg(arg1, &dname, &denc);
 
-    if (NIL_P(arg2)) {
+    if (NIL_P(*arg2)) {
 	sencidx = rb_enc_get_index(str);
 	senc = rb_enc_from_index(sencidx);
 	sname = rb_enc_name(senc);
@@ -2416,6 +2416,7 @@
 {
     VALUE dest;
     VALUE str = *self;
+    volatile VALUE arg1, arg2;
     long blen, slen;
     unsigned char *buf, *bp, *sp;
     const unsigned char *fromp;
@@ -2427,7 +2428,9 @@
 	rb_raise(rb_eArgError, "wrong number of arguments (%d for 1..2)", argc);
     }
 
-    dencidx = str_transcode_enc_args(str, argv[0], argc==1 ? Qnil : argv[1], &sname, &senc, &dname, &denc);
+    arg1 = argv[0];
+    arg2 = argc==1 ? Qnil : argv[1];
+    dencidx = str_transcode_enc_args(str, &arg1, &arg2, &sname, &senc, &dname, &denc);
 
     if ((ecflags & (ECONV_UNIVERSAL_NEWLINE_DECORATOR|
                     ECONV_CRLF_NEWLINE_DECORATOR|
@@ -2637,7 +2640,7 @@
     const char *arg_name, *result_name;
     rb_encoding *arg_enc, *result_enc;
 
-    enc_arg(arg, &arg_name, &arg_enc);
+    enc_arg(&arg, &arg_name, &arg_enc);
 
     result_name = rb_econv_asciicompat_encoding(arg_name);
 

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

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