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

ruby-changes:8751

From: nobu <ko1@a...>
Date: Wed, 19 Nov 2008 17:53:21 +0900 (JST)
Subject: [ruby-changes:8751] Ruby:r20287 (ruby_1_8): * string.c (rb_str_s_alloc, rb_str_replace): use null_str as well as

nobu	2008-11-19 17:52:41 +0900 (Wed, 19 Nov 2008)

  New Revision: 20287

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

  Log:
    * string.c (rb_str_s_alloc, rb_str_replace): use null_str as well as
      rb_string_value so that extension libraries do not segfault.
      [ruby-core:19971]
    * string.c (rb_str_replace): reduced unnecessary malloc and copy.

  Modified files:
    branches/ruby_1_8/ChangeLog
    branches/ruby_1_8/string.c

Index: ruby_1_8/ChangeLog
===================================================================
--- ruby_1_8/ChangeLog	(revision 20286)
+++ ruby_1_8/ChangeLog	(revision 20287)
@@ -1,3 +1,11 @@
+Wed Nov 19 17:52:35 2008  Nobuyoshi Nakada  <nobu@r...>
+
+	* string.c (rb_str_s_alloc, rb_str_replace): use null_str as well as
+	  rb_string_value so that extension libraries do not segfault.
+	  [ruby-core:19971]
+
+	* string.c (rb_str_replace): reduced unnecessary malloc and copy.
+
 Wed Nov 19 03:13:36 2008  Masatoshi SEKI  <m_seki@m...>
 
 	* test/rinda/test_rinda.rb: fixed fails occasionally [ruby-dev:37119].
Index: ruby_1_8/string.c
===================================================================
--- ruby_1_8/string.c	(revision 20286)
+++ ruby_1_8/string.c	(revision 20287)
@@ -313,6 +313,7 @@
     return str;
 }
 
+static VALUE rb_str_s_alloc _((VALUE));
 static VALUE rb_str_replace _((VALUE, VALUE));
 
 VALUE
@@ -539,8 +540,21 @@
 }
 
 static const char null_str[] = "";
-#define null_str ((char *)null_str)
+#define make_null_str(s) do { \
+	FL_SET(s, ELTS_SHARED); \
+	RSTRING(s)->ptr = (char *)null_str; \
+	RSTRING(s)->aux.shared = 0; \
+    } while (0)
 
+static VALUE
+rb_str_s_alloc(klass)
+    VALUE klass;
+{
+    VALUE str = str_alloc(klass);
+    make_null_str(str);
+    return str;
+}
+
 VALUE
 rb_string_value(ptr)
     volatile VALUE *ptr;
@@ -551,8 +565,7 @@
 	*ptr = s;
     }
     if (!RSTRING(s)->ptr) {
-	FL_SET(s, ELTS_SHARED);
-	RSTRING(s)->ptr = null_str;
+	make_null_str(s);
     }
     return s;
 }
@@ -583,8 +596,7 @@
 {
     str = rb_check_convert_type(str, T_STRING, "String", "to_str");
     if (!NIL_P(str) && !RSTRING(str)->ptr) {
-	FL_SET(str, ELTS_SHARED);
-	RSTRING(str)->ptr = null_str;
+	make_null_str(str);
     }
     return str;
 }
@@ -2308,9 +2320,18 @@
 	RSTRING(str)->aux.shared = RSTRING(str2)->aux.shared;
     }
     else {
-	rb_str_modify(str);
-	rb_str_resize(str, RSTRING(str2)->len);
-	memcpy(RSTRING(str)->ptr, RSTRING(str2)->ptr, RSTRING(str2)->len);
+	if (str_independent(str)) {
+	    rb_str_resize(str, RSTRING(str2)->len);
+	    memcpy(RSTRING(str)->ptr, RSTRING(str2)->ptr, RSTRING(str2)->len);
+	    if (!RSTRING(str)->ptr) {
+		make_null_str(str);
+	    }
+	}
+	else {
+	    RSTRING(str)->ptr = RSTRING(str2)->ptr;
+	    RSTRING(str)->len = RSTRING(str2)->len;
+	    str_make_independent(str);
+	}
 	if (FL_TEST(str2, STR_ASSOC)) {
 	    FL_SET(str, STR_ASSOC);
 	    RSTRING(str)->aux.shared = RSTRING(str2)->aux.shared;
@@ -4908,7 +4929,7 @@
     rb_cString  = rb_define_class("String", rb_cObject);
     rb_include_module(rb_cString, rb_mComparable);
     rb_include_module(rb_cString, rb_mEnumerable);
-    rb_define_alloc_func(rb_cString, str_alloc);
+    rb_define_alloc_func(rb_cString, rb_str_s_alloc);
     rb_define_method(rb_cString, "initialize", rb_str_init, -1);
     rb_define_method(rb_cString, "initialize_copy", rb_str_replace, 1);
     rb_define_method(rb_cString, "<=>", rb_str_cmp_m, 1);

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

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