Commit 660f64b1 authored by Yukihiro "Matz" Matsumoto's avatar Yukihiro "Matz" Matsumoto

Merge pull request #337 from masamitsu-murase/fix_str_replace

Fix str_replace in string.c
parents cb791565 866f7971
...@@ -1549,10 +1549,17 @@ str_replace(mrb_state *mrb, struct RString *s1, struct RString *s2) ...@@ -1549,10 +1549,17 @@ str_replace(mrb_state *mrb, struct RString *s1, struct RString *s2)
{ {
if (s2->flags & MRB_STR_SHARED) { if (s2->flags & MRB_STR_SHARED) {
L_SHARE: L_SHARE:
if (s1->flags & MRB_STR_SHARED){
mrb_str_decref(mrb, s1->aux.shared);
}
else {
mrb_free(mrb, s1->ptr);
}
s1->ptr = s2->ptr; s1->ptr = s2->ptr;
s1->len = s2->len; s1->len = s2->len;
s1->aux.shared = s2->aux.shared; s1->aux.shared = s2->aux.shared;
s1->flags |= MRB_STR_SHARED; s1->flags |= MRB_STR_SHARED;
s1->aux.shared->refcnt++;
} }
else if (s2->len > STR_REPLACE_SHARED_MIN) { else if (s2->len > STR_REPLACE_SHARED_MIN) {
str_make_shared(mrb, s2); str_make_shared(mrb, s2);
...@@ -1561,6 +1568,7 @@ str_replace(mrb_state *mrb, struct RString *s1, struct RString *s2) ...@@ -1561,6 +1568,7 @@ str_replace(mrb_state *mrb, struct RString *s1, struct RString *s2)
else { else {
if (s1->flags & MRB_STR_SHARED) { if (s1->flags & MRB_STR_SHARED) {
mrb_str_decref(mrb, s1->aux.shared); mrb_str_decref(mrb, s1->aux.shared);
s1->flags &= ~MRB_STR_SHARED;
s1->ptr = mrb_malloc(mrb, s2->len+1); s1->ptr = mrb_malloc(mrb, s2->len+1);
} }
else { else {
...@@ -1569,7 +1577,7 @@ str_replace(mrb_state *mrb, struct RString *s1, struct RString *s2) ...@@ -1569,7 +1577,7 @@ str_replace(mrb_state *mrb, struct RString *s1, struct RString *s2)
memcpy(s1->ptr, s2->ptr, s2->len); memcpy(s1->ptr, s2->ptr, s2->len);
s1->ptr[s2->len] = 0; s1->ptr[s2->len] = 0;
s1->len = s2->len; s1->len = s2->len;
s2->aux.capa = s2->len; s1->aux.capa = s2->len;
} }
return mrb_obj_value(s1); return mrb_obj_value(s1);
} }
......
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