diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2013-09-05 08:25:56 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2013-09-05 08:25:56 +0000 |
commit | dffae9a1f978d5ee5130475f4ea725865ead1730 (patch) | |
tree | 748e3695c8326693032cfe4051db154517a86b8d /string.c | |
parent | f0bc5b1c9f9dff22315e70294c663279fbc61daa (diff) | |
download | ruby-dffae9a1f978d5ee5130475f4ea725865ead1730.tar.gz |
string.c: reduce objects in rb_fstring
* string.c (rb_fstring, rb_str_free): use st_data_t instead of VALUE.
* string.c (rb_fstring): get rid of duplicating already frozen object.
* parse.y (str_suffix_gen): freeze in advance to reduce objects.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42846 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'string.c')
-rw-r--r-- | string.c | 19 |
1 files changed, 11 insertions, 8 deletions
@@ -141,14 +141,16 @@ static const struct st_hash_type fstring_hash_type = { VALUE rb_fstring(VALUE str) { - VALUE fstr; - if (!st_lookup(frozen_strings, (st_data_t)str, (st_data_t*)&fstr)) { - fstr = rb_str_dup(str); - OBJ_FREEZE(fstr); - RBASIC(fstr)->flags |= RSTRING_FSTR; - st_insert(frozen_strings, fstr, fstr); + st_data_t fstr; + if (st_lookup(frozen_strings, (st_data_t)str, &fstr)) { + str = (VALUE)fstr; } - return fstr; + else { + str = rb_str_new_frozen(str); + RBASIC(str)->flags |= RSTRING_FSTR; + st_insert(frozen_strings, str, str); + } + return str; } static inline int @@ -859,7 +861,8 @@ void rb_str_free(VALUE str) { if (FL_TEST(str, RSTRING_FSTR)) { - st_delete(frozen_strings, (st_data_t*)&str, NULL); + st_data_t fstr = (st_data_t)str; + st_delete(frozen_strings, &fstr, NULL); } if (!STR_EMBED_P(str) && !STR_SHARED_P(str)) { xfree(RSTRING(str)->as.heap.ptr); |