summaryrefslogtreecommitdiff
path: root/gc.c
diff options
context:
space:
mode:
authorPeter Zhu <[email protected]>2025-05-26 15:05:02 -0400
committerJean Boussier <[email protected]>2025-05-27 08:22:26 +0200
commitbe5450467b9d8cd461e2efd0ea9bd57cf001c05c (patch)
tree68f2d2e0138828b9728a39680176bc5bf4977517 /gc.c
parent061d36476fbeec9aebaf2e9058b0ac01be3d0dd0 (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.c16
1 files changed, 2 insertions, 14 deletions
diff --git a/gc.c b/gc.c
index 2c7d04a2b1..26cf554d82 100644
--- a/gc.c
+++ b/gc.c
@@ -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
};