Commit 3be1c889 authored by Yukihiro Matsumoto's avatar Yukihiro Matsumoto

str_modify() revives string buffer kept in shared structure if refcnt == 1

parent e6658743
......@@ -57,23 +57,29 @@ static void
str_modify(mrb_state *mrb, struct RString *s)
{
if (s->flags & MRB_STR_SHARED) {
char *ptr, *p;
long len;
struct mrb_shared_string *shared = s->aux.shared;
p = s->buf;
len = s->len;
ptr = mrb_malloc(mrb, sizeof(char)*(len+1));
if (p) {
memcpy(ptr, p, len);
if (shared->refcnt == 1 && s->buf == shared->buf) {
s->buf = shared->buf;
s->aux.capa = shared->len;
mrb_free(mrb, shared);
}
else {
char *ptr, *p;
long len;
p = s->buf;
len = s->len;
ptr = mrb_malloc(mrb, len+1);
if (p) {
memcpy(ptr, p, len);
}
ptr[len] = 0;
s->buf = ptr;
s->aux.capa = len;
mrb_str_decref(mrb, shared);
}
ptr[len] = 0;
s->buf = ptr;
s->len = len;
s->aux.capa = len;
s->flags &= ~MRB_STR_SHARED;
mrb_str_decref(mrb, shared);
}
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment