summaryrefslogtreecommitdiff
path: root/string.c
diff options
context:
space:
mode:
Diffstat (limited to 'string.c')
-rw-r--r--string.c22
1 files changed, 13 insertions, 9 deletions
diff --git a/string.c b/string.c
index b9863b8e25..9084c457d2 100644
--- a/string.c
+++ b/string.c
@@ -17,6 +17,7 @@
#include "internal.h"
#include "probes.h"
#include "gc.h"
+#include "vm_core.h"
#include <assert.h>
#define BEG(no) (regs->beg[(no)])
@@ -176,8 +177,6 @@ mustnot_broken(VALUE str)
static int fstring_cmp(VALUE a, VALUE b);
-static st_table* frozen_strings;
-
static const struct st_hash_type fstring_hash_type = {
fstring_cmp,
rb_str_hash,
@@ -223,15 +222,13 @@ rb_fstring(VALUE str)
Check_Type(str, T_STRING);
- if (!frozen_strings)
- frozen_strings = st_init_table(&fstring_hash_type);
-
if (FL_TEST(str, RSTRING_FSTR))
return str;
do {
ret = str;
- st_update(frozen_strings, (st_data_t)str, fstr_update_callback, (st_data_t)&ret);
+ st_update(GET_VM()->frozen_strings, (st_data_t)str,
+ fstr_update_callback, (st_data_t)&ret);
} while (ret == Qundef);
return ret;
@@ -952,7 +949,7 @@ rb_str_free(VALUE str)
{
if (FL_TEST(str, RSTRING_FSTR)) {
st_data_t fstr = (st_data_t)str;
- st_delete(frozen_strings, &fstr, NULL);
+ st_delete(GET_VM()->frozen_strings, &fstr, NULL);
}
if (!STR_EMBED_P(str) && !FL_TEST(str, STR_SHARED)) {
@@ -8950,6 +8947,13 @@ Init_String(void)
rb_define_method(rb_cSymbol, "encoding", sym_encoding, 0);
- if (frozen_strings)
- st_foreach(frozen_strings, fstring_set_class_i, rb_cString);
+ assert(GET_VM()->frozen_strings);
+ st_foreach(GET_VM()->frozen_strings, fstring_set_class_i, rb_cString);
+}
+
+void
+Init_frozen_strings(void)
+{
+ assert(!GET_VM()->frozen_strings);
+ GET_VM()->frozen_strings = st_init_table(&fstring_hash_type);
}