mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
should decref shared string body on gc_free
This commit is contained in:
@@ -49,6 +49,7 @@ struct RString {
|
||||
#define RSTRING_END(s) (RSTRING(s)->buf + RSTRING(s)->len)
|
||||
#define MRB_STR_SHARED 256
|
||||
|
||||
void mrb_str_decref(mrb_state*, struct mrb_shared_string*);
|
||||
mrb_value mrb_str_literal(mrb_state*, mrb_value);
|
||||
void mrb_str_concat(mrb_state*, mrb_value, mrb_value);
|
||||
mrb_value mrb_obj_to_str(mrb_state*, mrb_value);
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
+11
-5
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user