summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--include/mruby/string.h3
-rw-r--r--src/state.c19
-rw-r--r--src/string.c3
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);