summaryrefslogtreecommitdiff
path: root/string.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-07-06 02:24:29 (GMT)
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-07-06 02:24:29 (GMT)
commit0918c27a40129a34ed5f2468f742b4912c4ae76d (patch)
tree39c4642fbc76849eab9ffc4db7dc5351a441c750 /string.c
parent87954dd8a0951b18efe5a154516807e4d1ba354e (diff)
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.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/string.c b/string.c
index 34c77a5..6ef92eb 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