[email protected]$G$9!#e(B
At Thu, 20 Sep 2007 14:12:43 +0900,
Tanaka A. wrote in [ruby-dev:31800]:
[ruby-core:1177] e$B$G;w$?;XE&$,$5$l$F$$$^$9!#$=$N%9%l%C%I$K$*e(B
e$B$$$F$^$D$b$H$5$s$Oe(B [ruby-core:1185] e$B$Ge(B 1.8.0 e$B$K$O6uJ8;zNs$Ge(B
e$B$be(B ptr e$B$Oe(B “” e$B$r;X$9$h$&$K$9$k$HH/[email protected]$7$F$$$^$9!#e(B
e$B$=$s$JOC$b$"$j$^$7$?$M$’!#e(B
e$B$^$?!"e(B1.9 e$B$G$Oe(B RSTRING_PTR(str) e$B$Oe(B " ".chop.dup e$B$Oe(B NULL e$B$K$Je(B
e$B$j$^$;$s!#e(B
RSTRING_PTR()e$B$N<BAu<+BN$,Bg$-$/JQ$o$C$F$^$9$+$i!#e(B
e$B$J$*!“e(B[ruby-core:1185] e$B$He(B [ruby-dev:31778] e$B$NH/[email protected]$K$O?)$$0ce(B
e$B$$$,$”$j$^$9$,!"$h$/$"$k$3$H$G$9!#;d$N?dB,$H$7$F$O!“e(BNULL e$B$Ke(B
[email protected]$l$G$”[email protected]$,9b$$$H;W$$$^$9!#e(B
e$B$b$&:G=i$+$ie(BNULLe$B$K$O$7$J$$$H$$$&$3$H$G$b$$$$$H;W$$$^$9$,!"$3$s$Je(B
e$B$H$3$G$I$&$G$7$g$&$+!#e(B
Index: string.c
— string.c (revision 13449)
+++ string.c (working copy)
@@ -60,11 +60,15 @@ str_frozen_check(s)
}
+static VALUE str_alloc0 _((VALUE, int));
static VALUE str_alloc _((VALUE));
+static VALUE str_alloc1 _((VALUE));
+
static VALUE
-str_alloc(klass)
+str_alloc0(klass, flags)
VALUE klass;
- int flags;
{
NEWOBJ(str, struct RString);
- OBJSETUP(str, klass, T_STRING);
-
OBJSETUP(str, klass, flags);
str->ptr = 0;
@@ -75,4 +79,23 @@ str_alloc(klass)
}
+static const char null_str[] = “”;
+#define null_str (char *)null_str
+
+static VALUE
+str_alloc(klass)
- VALUE klass;
+{
- VALUE str = str_alloc0(klass, T_STRING | ELTS_SHARED);
- RSTRING(str)->ptr = null_str;
- return str;
+}
-
+static VALUE
+str_alloc1(klass)
- VALUE klass;
+{
- return str_alloc0(klass, T_STRING);
+}
-
static VALUE
str_new(klass, ptr, len)
@@ -87,5 +110,5 @@ str_new(klass, ptr, len)
}
- str = str_alloc1(klass);
RSTRING(str)->len = len;
RSTRING(str)->aux.capa = len;
@@ -146,5 +169,4 @@ str_new3(klass, str)
RSTRING(str2)->ptr = RSTRING(str)->ptr;
RSTRING(str2)->aux.shared = str;
-
FL_SET(str2, ELTS_SHARED);
return str2;
@@ -165,5 +187,5 @@ str_new4(klass, str)
VALUE klass, str;
{
-
VALUE str2 = str_alloc(klass);
-
VALUE str2 = str_alloc1(klass);
RSTRING(str2)->len = RSTRING(str)->len;
@@ -224,5 +246,5 @@ rb_str_buf_new(capa)
long capa;
{
- VALUE str = str_alloc(rb_cString);
-
VALUE str = str_alloc1(rb_cString);
if (capa < STR_BUF_MIN_SIZE) {
@@ -258,4 +280,6 @@ rb_str_to_str(str)
}
+static int str_independent _((VALUE));
+
static void
rb_str_shared_replace(str, str2)
@@ -263,6 +287,5 @@ rb_str_shared_replace(str, str2)
{
if (str == str2) return;
- rb_str_modify(str);
- if (!FL_TEST(str, ELTS_SHARED)) free(RSTRING(str)->ptr);
- if (str_independent(str)) xfree(RSTRING(str)->ptr);
if (NIL_P(str2)) {
RSTRING(str)->ptr = 0;
@@ -539,6 +570,4 @@ rb_str_associated(str)
}
-static char *null_str = “”;
VALUE
rb_string_value(ptr)
@@ -2266,6 +2295,9 @@ rb_str_replace(str, str2)
RSTRING(str)->aux.shared = RSTRING(str2)->aux.shared;
}
- else if (!RSTRING(str2)->len) {
- FL_SET(str, ELTS_SHARED);
- RSTRING(str)->ptr = null_str;
- }
else {
- rb_str_modify(str);
rb_str_resize(str, RSTRING(str2)->len);
memcpy(RSTRING(str)->ptr, RSTRING(str2)->ptr, RSTRING(str2)->len);