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

ruby-changes:12005

From: nobu <ko1@a...>
Date: Fri, 12 Jun 2009 02:42:58 +0900 (JST)
Subject: [ruby-changes:12005] Ruby:r23669 (trunk): * string.c (str_replace_shared): shared target must be frozen.

nobu	2009-06-12 02:41:27 +0900 (Fri, 12 Jun 2009)

  New Revision: 23669

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

  Log:
    * string.c (str_replace_shared): shared target must be frozen.
      [ruby-core:23727]

  Modified files:
    trunk/ChangeLog
    trunk/string.c
    trunk/version.h

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 23668)
+++ ChangeLog	(revision 23669)
@@ -1,3 +1,8 @@
+Fri Jun 12 02:41:21 2009  Nobuyoshi Nakada  <nobu@r...>
+
+	* string.c (str_replace_shared): shared target must be frozen.
+	  [ruby-core:23727]
+
 Thu Jun 11 21:05:09 2009  Tadayoshi Funaba  <tadf@d...>
 
 	* lib/cmath.rb (exp): omitted redundant function call.
Index: string.c
===================================================================
--- string.c	(revision 23668)
+++ string.c	(revision 23669)
@@ -14,6 +14,7 @@
 #include "ruby/ruby.h"
 #include "ruby/re.h"
 #include "ruby/encoding.h"
+#include <assert.h>
 
 #define BEG(no) regs->beg[no]
 #define END(no) regs->end[no]
@@ -599,6 +600,7 @@
     }
     else {
 	FL_SET(str2, STR_NOEMBED);
+	str = rb_str_new_frozen(str);
 	RSTRING(str2)->as.heap.len = RSTRING_LEN(str);
 	RSTRING(str2)->as.heap.ptr = RSTRING_PTR(str);
 	RSTRING(str2)->as.heap.aux.shared = str;
@@ -643,8 +645,10 @@
     RSTRING(str2)->as.heap.len = RSTRING_LEN(str);
     RSTRING(str2)->as.heap.ptr = RSTRING_PTR(str);
     if (STR_SHARED_P(str)) {
+	VALUE shared = RSTRING(str)->as.heap.aux.shared;
+	assert(OBJ_FROZEN(shared));
 	FL_SET(str2, ELTS_SHARED);
-	RSTRING(str2)->as.heap.aux.shared = RSTRING(str)->as.heap.aux.shared;
+	RSTRING(str2)->as.heap.aux.shared = shared;
     }
     else {
 	FL_SET(str, ELTS_SHARED);
@@ -664,6 +668,7 @@
     klass = rb_obj_class(orig);
     if (STR_SHARED_P(orig) && (str = RSTRING(orig)->as.heap.aux.shared)) {
 	long ofs;
+	assert(OBJ_FROZEN(str));
 	ofs = RSTRING_LEN(str) - RSTRING_LEN(orig);
 	if ((ofs > 0) || (klass != RBASIC(str)->klass) ||
 	    (!OBJ_TAINTED(str) && OBJ_TAINTED(orig))) {
@@ -824,12 +829,14 @@
 	str2 = rb_str_new4(str2);
     }
     if (STR_SHARED_P(str2)) {
+	VALUE shared = RSTRING(str2)->as.heap.aux.shared;
+	assert(OBJ_FROZEN(shared));
 	STR_SET_NOEMBED(str);
 	RSTRING(str)->as.heap.len = len;
 	RSTRING(str)->as.heap.ptr = RSTRING_PTR(str2);
 	FL_SET(str, ELTS_SHARED);
 	FL_UNSET(str, STR_ASSOC);
-	RSTRING(str)->as.heap.aux.shared = RSTRING(str2)->as.heap.aux.shared;
+	RSTRING(str)->as.heap.aux.shared = shared;
     }
     else {
 	str_replace_shared(str, str2);
Index: version.h
===================================================================
--- version.h	(revision 23668)
+++ version.h	(revision 23669)
@@ -1,5 +1,5 @@
 #define RUBY_VERSION "1.9.2"
-#define RUBY_RELEASE_DATE "2009-06-11"
+#define RUBY_RELEASE_DATE "2009-06-12"
 #define RUBY_PATCHLEVEL -1
 #define RUBY_BRANCH_NAME "trunk"
 
@@ -8,7 +8,7 @@
 #define RUBY_VERSION_TEENY 1
 #define RUBY_RELEASE_YEAR 2009
 #define RUBY_RELEASE_MONTH 6
-#define RUBY_RELEASE_DAY 11
+#define RUBY_RELEASE_DAY 12
 
 #include "ruby/version.h"
 

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

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