From bdb36b3404c3af9a202a3a2ed16155a799b7fc0c Mon Sep 17 00:00:00 2001 From: ksss Date: Sat, 13 May 2017 22:44:52 +0900 Subject: Make string embad from shared --- src/string.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/string.c b/src/string.c index ba948b83b..e0b491bfb 100644 --- a/src/string.c +++ b/src/string.c @@ -685,13 +685,20 @@ mrb_str_modify(mrb_state *mrb, struct RString *s) p = RSTR_PTR(s); len = s->as.heap.len; - ptr = (char *)mrb_malloc(mrb, (size_t)len + 1); + if (len < RSTRING_EMBED_LEN_MAX) { + RSTR_SET_EMBED_FLAG(s); + RSTR_SET_EMBED_LEN(s, len); + ptr = RSTR_PTR(s); + } + else { + ptr = (char *)mrb_malloc(mrb, (size_t)len + 1); + s->as.heap.ptr = ptr; + s->as.heap.aux.capa = len; + } if (p) { memcpy(ptr, p, len); } ptr[len] = '\0'; - s->as.heap.ptr = ptr; - s->as.heap.aux.capa = len; str_decref(mrb, shared); } RSTR_UNSET_SHARED_FLAG(s); -- cgit v1.2.3