summaryrefslogtreecommitdiff
path: root/string.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-08-04 05:08:57 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-08-04 05:08:57 +0000
commit3916eb783c3154f62b4c2d7d6a7b88c656281822 (patch)
tree33ec01d96fdcc5aeeb118d06ff6c3c0e084c054d /string.c
parente231d67ee1e9fefaf51ccebb10164b184f32440f (diff)
* marshal.c (dump_ensure), process.c (run_exec_dup2),
string.c (rb_str_replace), transcode.c (transcode_dispatch): fixed memory leaks. based on patches from shinichiro.h <shinichiro.hamaji AT gmail.com> at [ruby-dev:35751]. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@18341 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'string.c')
-rw-r--r--string.c7
1 files changed, 3 insertions, 4 deletions
diff --git a/string.c b/string.c
index 0231109f6e..e14f298cc8 100644
--- a/string.c
+++ b/string.c
@@ -3424,10 +3424,10 @@ rb_str_replace(VALUE str, VALUE str2)
if (STR_ASSOC_P(str2)) {
str2 = rb_str_new4(str2);
}
+ if (str_independent(str) && !STR_EMBED_P(str)) {
+ xfree(RSTRING_PTR(str));
+ }
if (STR_SHARED_P(str2)) {
- if (str_independent(str) && !STR_EMBED_P(str)) {
- xfree(RSTRING_PTR(str));
- }
STR_SET_NOEMBED(str);
RSTRING(str)->as.heap.len = len;
RSTRING(str)->as.heap.ptr = RSTRING_PTR(str2);
@@ -3436,7 +3436,6 @@ rb_str_replace(VALUE str, VALUE str2)
RSTRING(str)->as.heap.aux.shared = RSTRING(str2)->as.heap.aux.shared;
}
else {
- rb_str_modify(str);
str_replace_shared(str, rb_str_new4(str2));
}