diff options
| author | ksss <[email protected]> | 2014-03-23 16:03:32 +0900 |
|---|---|---|
| committer | ksss <[email protected]> | 2014-03-23 08:04:54 +0000 |
| commit | b0f10b5c3db289275e127e3979f84fd567158b21 (patch) | |
| tree | 5557865f9e47ec375dd5c1ba6682924c6cdcb9e4 /src/state.c | |
| parent | 81e0c30cc5f7b8b8ed392c47d19ca203ed6e3e65 (diff) | |
| download | mruby-b0f10b5c3db289275e127e3979f84fd567158b21.tar.gz mruby-b0f10b5c3db289275e127e3979f84fd567158b21.zip | |
mrb_str_pool use embed-string
Diffstat (limited to 'src/state.c')
| -rw-r--r-- | src/state.c | 41 |
1 files changed, 29 insertions, 12 deletions
diff --git a/src/state.c b/src/state.c index f05dbda34..612e1ac6e 100644 --- a/src/state.c +++ b/src/state.c @@ -170,23 +170,40 @@ mrb_str_pool(mrb_state *mrb, mrb_value str) ns->tt = MRB_TT_STRING; ns->c = mrb->string_class; - if (s->flags & MRB_STR_EMBED) - len = (mrb_int)((s->flags & MRB_STR_EMBED_LEN_MASK) >> MRB_STR_EMBED_LEN_SHIFT); - else - len = s->as.heap.len; - ns->as.heap.len = len; if (s->flags & MRB_STR_NOFREE) { - ns->as.heap.ptr = s->as.heap.ptr; ns->flags = MRB_STR_NOFREE; + ns->as.heap.ptr = s->as.heap.ptr; + ns->as.heap.len = s->as.heap.len; + ns->as.heap.aux.capa = 0; } else { - ns->flags = 0; - ns->as.heap.ptr = (char *)mrb_malloc(mrb, (size_t)len+1); - ptr = (s->flags & MRB_STR_EMBED) ? s->as.ary : s->as.heap.ptr; - if (ptr) { - memcpy(ns->as.heap.ptr, ptr, len); + if (s->flags & MRB_STR_EMBED) { + ptr = s->as.ary; + len = (mrb_int)((s->flags & MRB_STR_EMBED_LEN_MASK) >> MRB_STR_EMBED_LEN_SHIFT); + } + else { + ptr = s->as.heap.ptr; + len = s->as.heap.len; + } + + if (len < RSTRING_EMBED_LEN_MAX) { + ns->flags |= MRB_STR_EMBED; + ns->flags &= ~MRB_STR_EMBED_LEN_MASK; + ns->flags |= (size_t)len << MRB_STR_EMBED_LEN_SHIFT; + if (ptr) { + memcpy(ns->as.ary, ptr, len); + } + ns->as.ary[len] = '\0'; + } + else { + ns->flags = 0; + ns->as.heap.ptr = (char *)mrb_malloc(mrb, (size_t)len+1); + ns->as.heap.len = len; + if (ptr) { + memcpy(ns->as.heap.ptr, ptr, len); + } + ns->as.heap.ptr[len] = '\0'; } - ns->as.heap.ptr[len] = '\0'; } return mrb_obj_value(ns); } |
