summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gc.c6
-rw-r--r--internal/string.h1
-rw-r--r--string.c10
3 files changed, 12 insertions, 5 deletions
diff --git a/gc.c b/gc.c
index 12ff1f7922..a01bbe59f8 100644
--- a/gc.c
+++ b/gc.c
@@ -1216,11 +1216,7 @@ rb_gc_obj_free_vm_weak_references(VALUE obj)
switch (BUILTIN_TYPE(obj)) {
case T_STRING:
if (FL_TEST(obj, RSTRING_FSTR)) {
- st_data_t fstr = (st_data_t)obj;
- st_delete(rb_vm_fstring_table(), &fstr, NULL);
- RB_DEBUG_COUNTER_INC(obj_str_fstr);
-
- FL_UNSET(obj, RSTRING_FSTR);
+ rb_gc_free_fstring(obj);
}
break;
case T_SYMBOL:
diff --git a/internal/string.h b/internal/string.h
index 0ff92c3b84..ce4623cb52 100644
--- a/internal/string.h
+++ b/internal/string.h
@@ -83,6 +83,7 @@ VALUE rb_setup_fake_str(struct RString *fake_str, const char *name, long len, rb
RUBY_SYMBOL_EXPORT_END
VALUE rb_fstring_new(const char *ptr, long len);
+void rb_gc_free_fstring(VALUE obj);
VALUE rb_obj_as_string_result(VALUE str, VALUE obj);
VALUE rb_str_opt_plus(VALUE x, VALUE y);
VALUE rb_str_concat_literals(size_t num, const VALUE *strary);
diff --git a/string.c b/string.c
index d7ec684d1b..b278188af4 100644
--- a/string.c
+++ b/string.c
@@ -578,6 +578,16 @@ register_fstring(VALUE str, bool copy, bool force_precompute_hash)
return args.fstr;
}
+void rb_gc_free_fstring(VALUE obj) {
+ ASSERT_vm_locking();
+
+ st_data_t fstr = (st_data_t)obj;
+ st_delete(rb_vm_fstring_table(), &fstr, NULL);
+ RB_DEBUG_COUNTER_INC(obj_str_fstr);
+
+ FL_UNSET(obj, RSTRING_FSTR);
+}
+
static VALUE
setup_fake_str(struct RString *fake_str, const char *name, long len, int encidx)
{