summaryrefslogtreecommitdiff
path: root/string.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2001-08-06 15:05:50 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2001-08-06 15:05:50 +0000
commitf141f2e543ec02c8e43e7617bce9ac988ba22b46 (patch)
tree15776a8c73c6544e48a7e51d3ffed80c69635267 /string.c
parentd94dbed46deaa325a43b92c5005585b3fbb20766 (diff)
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
Diffstat (limited to 'string.c')
-rw-r--r--string.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/string.c b/string.c
index 326b9626b1..ec1a31362d 100644
--- a/string.c
+++ b/string.c
@@ -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