Extract rb_gc_free_fstring to string.c

This allows more flexibility in how we deal with the fstring table
This commit is contained in:
John Hawthorn 2025-03-10 23:49:59 -07:00
parent 6f6d07272e
commit 89199a47db
Notes: git 2025-04-18 04:04:11 +00:00
3 changed files with 12 additions and 5 deletions

6
gc.c
View File

@ -1216,11 +1216,7 @@ rb_gc_obj_free_vm_weak_references(VALUE obj)
switch (BUILTIN_TYPE(obj)) { switch (BUILTIN_TYPE(obj)) {
case T_STRING: case T_STRING:
if (FL_TEST(obj, RSTRING_FSTR)) { if (FL_TEST(obj, RSTRING_FSTR)) {
st_data_t fstr = (st_data_t)obj; rb_gc_free_fstring(obj);
st_delete(rb_vm_fstring_table(), &fstr, NULL);
RB_DEBUG_COUNTER_INC(obj_str_fstr);
FL_UNSET(obj, RSTRING_FSTR);
} }
break; break;
case T_SYMBOL: case T_SYMBOL:

View File

@ -83,6 +83,7 @@ VALUE rb_setup_fake_str(struct RString *fake_str, const char *name, long len, rb
RUBY_SYMBOL_EXPORT_END RUBY_SYMBOL_EXPORT_END
VALUE rb_fstring_new(const char *ptr, long len); 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_obj_as_string_result(VALUE str, VALUE obj);
VALUE rb_str_opt_plus(VALUE x, VALUE y); VALUE rb_str_opt_plus(VALUE x, VALUE y);
VALUE rb_str_concat_literals(size_t num, const VALUE *strary); VALUE rb_str_concat_literals(size_t num, const VALUE *strary);

View File

@ -578,6 +578,16 @@ register_fstring(VALUE str, bool copy, bool force_precompute_hash)
return args.fstr; 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 static VALUE
setup_fake_str(struct RString *fake_str, const char *name, long len, int encidx) setup_fake_str(struct RString *fake_str, const char *name, long len, int encidx)
{ {