summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorYukihiro Matsumoto <[email protected]>2012-06-03 15:45:06 +0900
committerYukihiro Matsumoto <[email protected]>2012-06-03 15:45:06 +0900
commit28b9619bb4c1a560392e0f958a5a5d9cedf12bc7 (patch)
tree9169cc5e780d8b9ee1fad74c2d656512f5fcac6c /src
parent60e8d80fa722008fc1a2adcc258087702f9e58c6 (diff)
downloadmruby-28b9619bb4c1a560392e0f958a5a5d9cedf12bc7.tar.gz
mruby-28b9619bb4c1a560392e0f958a5a5d9cedf12bc7.zip
should decref shared string body on gc_free
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);
}
}