diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-07-06 02:24:29 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-07-06 02:24:29 +0000 |
commit | dd536e27c250fa78f4773fd9d38ca1373716d6fc (patch) | |
tree | 39c4642fbc76849eab9ffc4db7dc5351a441c750 /string.c | |
parent | d35c659c8df422eda5f978a0ab6a39707f326f33 (diff) | |
download | ruby-dd536e27c250fa78f4773fd9d38ca1373716d6fc.tar.gz |
string.c: register_fstring
* string.c (register_fstring): separate registration from
rb_fstring().
* string.c (rb_fstring_new): skip argument checks in rb_fstring().
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@51157 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'string.c')
-rw-r--r-- | string.c | 13 |
1 files changed, 10 insertions, 3 deletions
@@ -212,6 +212,7 @@ static int fstring_cmp(VALUE a, VALUE b); /* in case we restart MVM development, this needs to be per-VM */ static st_table* frozen_strings; +static VALUE register_fstring(VALUE str); static inline st_table* rb_vm_fstring_table(void) @@ -260,13 +261,19 @@ fstr_update_callback(st_data_t *key, st_data_t *value, st_data_t arg, int existi VALUE rb_fstring(VALUE str) { - VALUE ret; - Check_Type(str, T_STRING); if (FL_TEST(str, RSTRING_FSTR)) return str; + return register_fstring(str); +} + +static VALUE +register_fstring(VALUE str) +{ + VALUE ret; + do { ret = str; st_update(rb_vm_fstring_table(), (st_data_t)str, @@ -301,7 +308,7 @@ VALUE rb_fstring_new(const char *ptr, long len) { struct RString fake_str; - return rb_fstring(setup_fake_str(&fake_str, ptr, len, ENCINDEX_US_ASCII)); + return register_fstring(setup_fake_str(&fake_str, ptr, len, ENCINDEX_US_ASCII)); } VALUE |