diff options
author | normal <normal@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-01-30 21:54:32 +0000 |
---|---|---|
committer | normal <normal@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-01-30 21:54:32 +0000 |
commit | 5c988df0dd687ad74ef20506f5a57657ccae3014 (patch) | |
tree | 666a866e8cd0ca85162dcbcc841b5998ce91ada4 /string.c | |
parent | fb3313bf2b94e2d42352eab6267bbd8e98972b4e (diff) | |
download | ruby-5c988df0dd687ad74ef20506f5a57657ccae3014.tar.gz |
string.c (rb_str_tmp_frozen_release): release embedded strings
Handle the embedded case first, since we may have an embedded
duplicate and non-embedded original string.
* string.c (rb_str_tmp_frozen_release): handled embedded strings
* test/ruby/test_io.rb (test_write_no_garbage): new test
[ruby-core:78898] [Bug #13085]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@57471 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'string.c')
-rw-r--r-- | string.c | 10 |
1 files changed, 5 insertions, 5 deletions
@@ -1150,7 +1150,11 @@ rb_str_tmp_frozen_release(VALUE orig, VALUE tmp) if (RBASIC_CLASS(tmp) != 0) return; - if (FL_TEST_RAW(orig, STR_SHARED) && + if (STR_EMBED_P(tmp)) { + assert(OBJ_FROZEN_RAW(tmp)); + rb_gc_force_recycle(tmp); + } + else if (FL_TEST_RAW(orig, STR_SHARED) && !FL_TEST_RAW(orig, STR_TMPLOCK|RUBY_FL_FREEZE)) { VALUE shared = RSTRING(orig)->as.heap.aux.shared; @@ -1164,10 +1168,6 @@ rb_str_tmp_frozen_release(VALUE orig, VALUE tmp) rb_gc_force_recycle(tmp); } } - else if (STR_EMBED_P(tmp)) { - assert(OBJ_FROZEN_RAW(tmp)); - rb_gc_force_recycle(tmp); - } } static VALUE |