From be5450467b9d8cd461e2efd0ea9bd57cf001c05c Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Mon, 26 May 2025 15:05:02 -0400 Subject: [PATCH] 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. --- gc.c | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/gc.c b/gc.c index 2c7d04a2b1..26cf554d82 100644 --- a/gc.c +++ b/gc.c @@ -1848,19 +1848,6 @@ id2ref_tbl_memsize(const void *data) return rb_st_memsize(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) { @@ -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 };