diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2013-12-25 10:30:48 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2013-12-25 10:30:48 +0900 |
| commit | 673d9183cf7ea96cb695187ccbfac18b3fd16ec2 (patch) | |
| tree | e99328d50c6d020984d962e5d0c9557e2387dee6 | |
| parent | 9b7b18aaf4e02601eb86303b3ce25daf9565892f (diff) | |
| download | mruby-673d9183cf7ea96cb695187ccbfac18b3fd16ec2.tar.gz mruby-673d9183cf7ea96cb695187ccbfac18b3fd16ec2.zip | |
avoid copying when the original string comes with MRB_STR_NOFREE
| -rw-r--r-- | include/mruby/string.h | 3 | ||||
| -rw-r--r-- | src/state.c | 19 | ||||
| -rw-r--r-- | src/string.c | 3 |
3 files changed, 16 insertions, 9 deletions
diff --git a/include/mruby/string.h b/include/mruby/string.h index 594965134..c6d2e0e70 100644 --- a/include/mruby/string.h +++ b/include/mruby/string.h @@ -32,6 +32,9 @@ struct RString { #define RSTRING_CAPA(s) (RSTRING(s)->aux.capa) #define RSTRING_END(s) (RSTRING(s)->ptr + RSTRING(s)->len) +#define MRB_STR_SHARED 1 +#define MRB_STR_NOFREE 2 + void mrb_gc_free_str(mrb_state*, struct RString*); void mrb_str_modify(mrb_state*, struct RString*); mrb_value mrb_str_literal(mrb_state*, mrb_value); 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; 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); } diff --git a/src/string.c b/src/string.c index ade601db2..1c577188e 100644 --- a/src/string.c +++ b/src/string.c @@ -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); |
