summaryrefslogtreecommitdiffhomepage
path: root/src/string.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2012-06-30 13:50:54 -0700
committerYukihiro "Matz" Matsumoto <[email protected]>2012-06-30 13:50:54 -0700
commit660f64b1d03a2eb5cf09c3ab580f2e254d9fe253 (patch)
tree6a3538cc77764bd8d09fe52c6def9553a76882d9 /src/string.c
parentcb791565c350dff1c4b9f64d2a424ade3fc98aa8 (diff)
parent866f797125093cca9563c753716e3cede1cc5a3f (diff)
downloadmruby-660f64b1d03a2eb5cf09c3ab580f2e254d9fe253.tar.gz
mruby-660f64b1d03a2eb5cf09c3ab580f2e254d9fe253.zip
Merge pull request #337 from masamitsu-murase/fix_str_replace
Fix str_replace in string.c
Diffstat (limited to 'src/string.c')
-rw-r--r--src/string.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/src/string.c b/src/string.c
index 8e61e6bb9..02f71ef96 100644
--- a/src/string.c
+++ b/src/string.c
@@ -1549,10 +1549,17 @@ str_replace(mrb_state *mrb, struct RString *s1, struct RString *s2)
{
if (s2->flags & MRB_STR_SHARED) {
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->len = s2->len;
s1->aux.shared = s2->aux.shared;
s1->flags |= MRB_STR_SHARED;
+ s1->aux.shared->refcnt++;
}
else if (s2->len > STR_REPLACE_SHARED_MIN) {
str_make_shared(mrb, s2);
@@ -1561,6 +1568,7 @@ str_replace(mrb_state *mrb, struct RString *s1, struct RString *s2)
else {
if (s1->flags & MRB_STR_SHARED) {
mrb_str_decref(mrb, s1->aux.shared);
+ s1->flags &= ~MRB_STR_SHARED;
s1->ptr = mrb_malloc(mrb, s2->len+1);
}
else {
@@ -1569,7 +1577,7 @@ str_replace(mrb_state *mrb, struct RString *s1, struct RString *s2)
memcpy(s1->ptr, s2->ptr, s2->len);
s1->ptr[s2->len] = 0;
s1->len = s2->len;
- s2->aux.capa = s2->len;
+ s1->aux.capa = s2->len;
}
return mrb_obj_value(s1);
}