Commit 28b9619b authored by Yukihiro Matsumoto's avatar Yukihiro Matsumoto

should decref shared string body on gc_free

parent 60e8d80f
...@@ -49,6 +49,7 @@ struct RString { ...@@ -49,6 +49,7 @@ struct RString {
#define RSTRING_END(s) (RSTRING(s)->buf + RSTRING(s)->len) #define RSTRING_END(s) (RSTRING(s)->buf + RSTRING(s)->len)
#define MRB_STR_SHARED 256 #define MRB_STR_SHARED 256
void mrb_str_decref(mrb_state*, struct mrb_shared_string*);
mrb_value mrb_str_literal(mrb_state*, mrb_value); mrb_value mrb_str_literal(mrb_state*, mrb_value);
void mrb_str_concat(mrb_state*, mrb_value, mrb_value); void mrb_str_concat(mrb_state*, mrb_value, mrb_value);
mrb_value mrb_obj_to_str(mrb_state*, mrb_value); mrb_value mrb_obj_to_str(mrb_state*, mrb_value);
......
...@@ -460,7 +460,9 @@ obj_free(mrb_state *mrb, struct RBasic *obj) ...@@ -460,7 +460,9 @@ obj_free(mrb_state *mrb, struct RBasic *obj)
break; break;
case MRB_TT_STRING: 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); mrb_free(mrb, ((struct RString*)obj)->buf);
break; break;
......
...@@ -43,6 +43,16 @@ static mrb_value mrb_str_subseq(mrb_state *mrb, mrb_value str, int beg, int len) ...@@ -43,6 +43,16 @@ static mrb_value mrb_str_subseq(mrb_state *mrb, mrb_value str, int beg, int len)
s->aux.capa = capacity;\ s->aux.capa = capacity;\
} while (0) } 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 static void
str_modify(mrb_state *mrb, struct RString *s) str_modify(mrb_state *mrb, struct RString *s)
{ {
...@@ -63,11 +73,7 @@ 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->aux.capa = len;
s->flags &= ~MRB_STR_SHARED; s->flags &= ~MRB_STR_SHARED;
shared->refcnt--; mrb_str_decref(mrb, shared);
if (shared->refcnt == 0) {
mrb_free(mrb, shared->buf);
mrb_free(mrb, shared);
}
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment