summaryrefslogtreecommitdiff
path: root/string.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-09-05 08:25:56 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-09-05 08:25:56 +0000
commitdffae9a1f978d5ee5130475f4ea725865ead1730 (patch)
tree748e3695c8326693032cfe4051db154517a86b8d /string.c
parentf0bc5b1c9f9dff22315e70294c663279fbc61daa (diff)
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.c19
1 files changed, 11 insertions, 8 deletions
diff --git a/string.c b/string.c
index 7ee4730930..c1366e834e 100644
--- a/string.c
+++ b/string.c
@@ -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);