diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2001-08-06 15:05:50 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2001-08-06 15:05:50 +0000 |
commit | f141f2e543ec02c8e43e7617bce9ac988ba22b46 (patch) | |
tree | 15776a8c73c6544e48a7e51d3ffed80c69635267 | |
parent | d94dbed46deaa325a43b92c5005585b3fbb20766 (diff) | |
download | ruby-f141f2e543ec02c8e43e7617bce9ac988ba22b46.tar.gz |
a problem about `associated' String and `str_buf'.
* pack.c (pack_unpack): associates p/P strings once at
last(reverted to 1.26).
* string.c (rb_str_associate): associates an Array at once, not
but a String. realloc's when str_buf.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@1672 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | pack.c | 11 | ||||
-rw-r--r-- | string.c | 15 |
3 files changed, 29 insertions, 5 deletions
@@ -1,3 +1,11 @@ +Mon Aug 6 23:47:46 2001 Nobuyoshi Nakada <nobu.nakada@nifty.ne.jp> + + * pack.c (pack_unpack): associates p/P strings once at + last(reverted to 1.26). + + * string.c (rb_str_associate): associates an Array at once, not + but a String. realloc's when str_buf. + Mon Aug 6 14:31:37 2001 Usaku Nakamura <usa@ruby-lang.org> * numeric.c (num_divmod): fix typo. @@ -331,7 +331,7 @@ pack_pack(ary, fmt) static char *nul10 = "\0\0\0\0\0\0\0\0\0\0"; static char *spc10 = " "; char *p, *pend; - VALUE res, from; + VALUE res, from, associates = 0; char type; int items, len, idx; char *ptr; @@ -872,7 +872,10 @@ pack_pack(ary, fmt) StringValue(from); t = RSTRING(from)->ptr; } - rb_str_associate(res, from); + if (!associates) { + associates = rb_ary_new(); + } + rb_ary_push(associates, from); rb_str_buf_cat(res, (char*)&t, sizeof(char*)); } break; @@ -927,6 +930,10 @@ pack_pack(ary, fmt) break; } } + + if (associates) { + rb_str_associate(res, associates); + } return res; } @@ -203,13 +203,22 @@ rb_str_associate(str, add) VALUE str, add; { if (FL_TEST(str, STR_NO_ORIG|STR_ASSOC) != (STR_NO_ORIG|STR_ASSOC)) { - if (RSTRING(str)->orig) { + if (FL_TEST(str, STR_NO_ORIG)) { + /* str_buf */ + if (FIX2LONG(RSTRING(str)->orig) != RSTRING(str)->len) { + REALLOC_N(RSTRING(str)->ptr, char, RSTRING(str)->len + 1); + } + } + else if (RSTRING(str)->orig) { rb_str_modify(str); } - RSTRING(str)->orig = rb_ary_new(); + RSTRING(str)->orig = add; FL_SET(str, STR_NO_ORIG|STR_ASSOC); } - rb_ary_push(RSTRING(str)->orig, add); + else { + /* already associated */ + rb_ary_concat(RSTRING(str)->orig, add); + } } VALUE |