diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/gc.c | 4 | ||||
| -rw-r--r-- | src/string.c | 16 |
2 files changed, 14 insertions, 6 deletions
@@ -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); } } |
