diff options
author | Peter Zhu <[email protected]> | 2025-05-26 15:05:02 -0400 |
---|---|---|
committer | Jean Boussier <[email protected]> | 2025-05-27 08:22:26 +0200 |
commit | be5450467b9d8cd461e2efd0ea9bd57cf001c05c (patch) | |
tree | 68f2d2e0138828b9728a39680176bc5bf4977517 /gc.c | |
parent | 061d36476fbeec9aebaf2e9058b0ac01be3d0dd0 (diff) |
Fix reference updating for id2ref table
The id2ref table could contain dead entries which should not be passed
into rb_gc_location. Also, we already update references in gc_update_references
using rb_gc_vm_weak_table_foreach so we do not need to update it again.
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/13444
Diffstat (limited to 'gc.c')
-rw-r--r-- | gc.c | 16 |
1 files changed, 2 insertions, 14 deletions
@@ -1849,19 +1849,6 @@ id2ref_tbl_memsize(const void *data) } static void -id2ref_tbl_compact(void *data) -{ - st_table *table = (st_table *)data; - if (LIKELY(RB_POSFIXABLE(LAST_OBJECT_ID()))) { - // We know keys are all FIXNUM, so no need to update them. - gc_ref_update_table_values_only(table); - } - else { - gc_update_table_refs(table); - } -} - -static void id2ref_tbl_free(void *data) { id2ref_tbl = NULL; // clear global ref @@ -1875,7 +1862,8 @@ static const rb_data_type_t id2ref_tbl_type = { .dmark = id2ref_tbl_mark, .dfree = id2ref_tbl_free, .dsize = id2ref_tbl_memsize, - .dcompact = id2ref_tbl_compact, + // dcompact function not required because the table is reference updated + // in rb_gc_vm_weak_table_foreach }, .flags = RUBY_TYPED_WB_PROTECTED | RUBY_TYPED_FREE_IMMEDIATELY }; |