mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
avoid copying when the original string comes with MRB_STR_NOFREE
This commit is contained in:
+13
-6
@@ -136,7 +136,9 @@ mrb_irep_free(mrb_state *mrb, mrb_irep *irep)
|
||||
mrb_free(mrb, irep->iseq);
|
||||
for (i=0; i<irep->plen; 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);
|
||||
}
|
||||
|
||||
|
||||
@@ -30,9 +30,6 @@ typedef struct mrb_shared_string {
|
||||
mrb_int len;
|
||||
} mrb_shared_string;
|
||||
|
||||
#define MRB_STR_SHARED 1
|
||||
#define MRB_STR_NOFREE 2
|
||||
|
||||
static mrb_value str_replace(mrb_state *mrb, struct RString *s1, struct RString *s2);
|
||||
static mrb_value mrb_str_subseq(mrb_state *mrb, mrb_value str, mrb_int beg, mrb_int len);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user