summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/gc.c4
-rw-r--r--src/string.c16
2 files changed, 14 insertions, 6 deletions
diff --git a/src/gc.c b/src/gc.c
index 03428765c..cce35efa4 100644
--- a/src/gc.c
+++ b/src/gc.c
@@ -460,7 +460,9 @@ obj_free(mrb_state *mrb, struct RBasic *obj)
break;
case MRB_TT_STRING:
- if (!(obj->flags & MRB_STR_SHARED))
+ if (obj->flags & MRB_STR_SHARED)
+ mrb_str_decref(mrb, ((struct RString*)obj)->aux.shared);
+ else
mrb_free(mrb, ((struct RString*)obj)->buf);
break;
diff --git a/src/string.c b/src/string.c
index 8bc299987..6eba9cb20 100644
--- a/src/string.c
+++ b/src/string.c
@@ -43,6 +43,16 @@ static mrb_value mrb_str_subseq(mrb_state *mrb, mrb_value str, int beg, int len)
s->aux.capa = capacity;\
} while (0)
+void
+mrb_str_decref(mrb_state *mrb, struct mrb_shared_string *shared)
+{
+ shared->refcnt--;
+ if (shared->refcnt == 0) {
+ mrb_free(mrb, shared->buf);
+ mrb_free(mrb, shared);
+ }
+}
+
static void
str_modify(mrb_state *mrb, struct RString *s)
{
@@ -63,11 +73,7 @@ str_modify(mrb_state *mrb, struct RString *s)
s->aux.capa = len;
s->flags &= ~MRB_STR_SHARED;
- shared->refcnt--;
- if (shared->refcnt == 0) {
- mrb_free(mrb, shared->buf);
- mrb_free(mrb, shared);
- }
+ mrb_str_decref(mrb, shared);
}
}