diff --git a/string.c b/string.c index 34c77a5054..6ef92eb9fb 100644 --- a/string.c +++ b/string.c @@ -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