From: Michal Rokos Date: 2002-09-12T19:08:11+09:00 Subject: [Add-to-fix] String.c Hello, matz, thanks for reworking my patch. I'm really sad that you've been forced to work it on yourself. Sorry. I'm OK with your changes. I have just small addon to it. Michal Index: string.c =================================================================== RCS file: /src/ruby/string.c,v retrieving revision 1.119 diff -u -p -r1.119 string.c --- string.c 2002/09/12 06:27:13 1.119 +++ string.c 2002/09/12 10:02:03 @@ -68,11 +68,11 @@ str_new(klass, ptr, len) RSTRING(str)->ptr = ALLOC_N(char,len+1); if (ptr) { memcpy(RSTRING(str)->ptr, ptr, len); + RSTRING(str)->ptr[len] = '\0'; } else { - MEMZERO(RSTRING(str)->ptr, char, len); + MEMZERO(RSTRING(str)->ptr, char, len+1); } - RSTRING(str)->ptr[len] = '\0'; return str; } Nothing important here. =================================================================== @@ -222,6 +222,7 @@ rb_str_shared_replace(str, str2) RSTRING(str)->ptr = 0; RSTRING(str)->len = 0; RSTRING(str)->aux.capa = 0; + FL_UNSET(str, ELTS_SHARED|STR_ASSOC); return; } RSTRING(str)->ptr = RSTRING(str2)->ptr; @@ -231,6 +232,7 @@ rb_str_shared_replace(str, str2) RSTRING(str)->aux.shared = RSTRING(str2)->aux.shared; } else { + FL_UNSET(str, ELTS_SHARED|STR_ASSOC); RSTRING(str)->aux.capa = RSTRING(str2)->aux.capa; } RSTRING(str2)->ptr = 0; /* abandon str2 */ I think that unsetting some flags could be handy. =================================================================== @@ -489,10 +491,18 @@ VALUE rb_str_dup_frozen(str) VALUE str; { +#if 0 + /* + * Question: + * What is the str is subseq of share + * (str->len < str->aux.shared->len) + * ? + */ if (FL_TEST(str, ELTS_SHARED)) { OBJ_FREEZE(RSTRING(str)->aux.shared); return RSTRING(str)->aux.shared; } +#endif if (OBJ_FROZEN(str)) return str; str = rb_str_dup(str); OBJ_FREEZE(str); Please, see the question... =================================================================== @@ -632,13 +642,11 @@ VALUE rb_str_append(str, str2) VALUE str, str2; { - long len; - - StringValue(str2); rb_str_modify(str); + StringValue(str2); if (RSTRING(str2)->len > 0) { if (FL_TEST(str, STR_ASSOC)) { - len = RSTRING(str)->len+RSTRING(str2)->len; + long len = RSTRING(str)->len+RSTRING(str2)->len; REALLOC_N(RSTRING(str)->ptr, char, len+1); memcpy(RSTRING(str)->ptr + RSTRING(str)->len, RSTRING(str2)->ptr, RSTRING(str2)->len); (1) I think that we could check first whether we can modify str, before we will start to do something. =================================================================== @@ -1636,7 +1644,7 @@ rb_str_replace(str, str2) } RSTRING(str)->len = RSTRING(str2)->len; RSTRING(str)->ptr = RSTRING(str2)->ptr; - FL_SET(str, RBASIC(str2)->flags & (ELTS_SHARED|STR_ASSOC)); + FL_SET(str, ELTS_SHARED); RSTRING(str)->aux.shared = RSTRING(str2)->aux.shared; } else { (2) To get glags from str2 is not needed. We tested them already. =================================================================== @@ -1644,7 +1652,7 @@ rb_str_replace(str, str2) rb_str_resize(str, RSTRING(str2)->len); memcpy(RSTRING(str)->ptr, RSTRING(str2)->ptr, RSTRING(str2)->len); if (FL_TEST(str2, STR_ASSOC)) { - FL_SET(str, RBASIC(str2)->flags & (ELTS_SHARED|STR_ASSOC)); + FL_SET(str, STR_ASSOC); RSTRING(str)->aux.shared = RSTRING(str2)->aux.shared; } } ditto (2) =================================================================== @@ -2305,6 +2313,7 @@ rb_str_delete_bang(argc, argv, str) if (argc < 1) { rb_raise(rb_eArgError, "wrong number of arguments"); } + rb_str_modify(str); for (i=0; iptr; if (!s || RSTRING(str)->len == 0) return Qnil; send = s + RSTRING(str)->len; ditto (1) =================================================================== @@ -2354,6 +2362,7 @@ rb_str_squeeze_bang(argc, argv, str) int init = 1; int i; + rb_str_modify(str); if (argc == 0) { for (i=0; i<256; i++) { squeez[i] = 1; ditto (1) =================================================================== @@ -2369,7 +2378,6 @@ rb_str_squeeze_bang(argc, argv, str) } } - rb_str_modify(str); s = t = RSTRING(str)->ptr; if (!s || RSTRING(str)->len == 0) return Qnil; send = s + RSTRING(str)->len; ditto (1) =================================================================== -- -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- Michal Rokos Czech Technical University, Prague e-mail: m.rokos@sh.cvut.cz icq: 36118339 jabber: majkl@jabber.cz -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-