From 673d9183cf7ea96cb695187ccbfac18b3fd16ec2 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Wed, 25 Dec 2013 10:30:48 +0900 Subject: avoid copying when the original string comes with MRB_STR_NOFREE --- src/state.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) (limited to 'src/state.c') diff --git a/src/state.c b/src/state.c index ab6070b7a..813b89aa7 100644 --- a/src/state.c +++ b/src/state.c @@ -136,7 +136,9 @@ mrb_irep_free(mrb_state *mrb, mrb_irep *irep) mrb_free(mrb, irep->iseq); for (i=0; iplen; i++) { if (mrb_type(irep->pool[i]) == MRB_TT_STRING) { - mrb_free(mrb, mrb_str_ptr(irep->pool[i])->ptr); + if (mrb_str_ptr(irep->pool[i])->flags & MRB_STR_NOFREE == 0) { + mrb_free(mrb, mrb_str_ptr(irep->pool[i])->ptr); + } mrb_free(mrb, mrb_obj_ptr(irep->pool[i])); } #ifdef MRB_WORD_BOXING @@ -170,12 +172,17 @@ mrb_str_pool(mrb_state *mrb, mrb_value str) len = s->len; ns->len = len; - ns->ptr = (char *)mrb_malloc(mrb, (size_t)len+1); - if (s->ptr) { - memcpy(ns->ptr, s->ptr, len); + if (s->flags & MRB_STR_NOFREE) { + ns->ptr = s->ptr; + ns->flags = MRB_STR_NOFREE; + } + else { + ns->ptr = (char *)mrb_malloc(mrb, (size_t)len+1); + if (s->ptr) { + memcpy(ns->ptr, s->ptr, len); + } + ns->ptr[len] = '\0'; } - ns->ptr[len] = '\0'; - return mrb_obj_value(ns); } -- cgit v1.2.3