summaryrefslogtreecommitdiffhomepage
path: root/src/state.c
diff options
context:
space:
mode:
authorksss <[email protected]>2014-03-23 16:03:32 +0900
committerksss <[email protected]>2014-03-23 08:04:54 +0000
commitb0f10b5c3db289275e127e3979f84fd567158b21 (patch)
tree5557865f9e47ec375dd5c1ba6682924c6cdcb9e4 /src/state.c
parent81e0c30cc5f7b8b8ed392c47d19ca203ed6e3e65 (diff)
downloadmruby-b0f10b5c3db289275e127e3979f84fd567158b21.tar.gz
mruby-b0f10b5c3db289275e127e3979f84fd567158b21.zip
mrb_str_pool use embed-string
Diffstat (limited to 'src/state.c')
-rw-r--r--src/state.c41
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);
}