summaryrefslogtreecommitdiffhomepage
path: root/src/string.c
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/string.c
parent60e8d80fa722008fc1a2adcc258087702f9e58c6 (diff)
downloadmruby-28b9619bb4c1a560392e0f958a5a5d9cedf12bc7.tar.gz
mruby-28b9619bb4c1a560392e0f958a5a5d9cedf12bc7.zip
should decref shared string body on gc_free
Diffstat (limited to 'src/string.c')
-rw-r--r--src/string.c16
1 files changed, 11 insertions, 5 deletions
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);
}
}