diff options
author | Peter Zhu <[email protected]> | 2025-01-24 10:16:27 -0500 |
---|---|---|
committer | Peter Zhu <[email protected]> | 2025-01-27 10:28:36 -0500 |
commit | 98b36f6f3661430a29ee1fe40d28b9abeeb903f5 (patch) | |
tree | 0a8c6901a489131948f58e7a25cb2e3c4f461213 /gc/default/default.c | |
parent | 9e5ff79c5be426c3e6fef80449620075cbca7671 (diff) |
Use rb_gc_vm_weak_table_foreach for reference updating
We can use rb_gc_vm_weak_table_foreach for reference updating of weak tables
in the default GC.
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/12629
Diffstat (limited to 'gc/default/default.c')
-rw-r--r-- | gc/default/default.c | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/gc/default/default.c b/gc/default/default.c index a05a2ca29c..ccfcefaba3 100644 --- a/gc/default/default.c +++ b/gc/default/default.c @@ -7110,6 +7110,20 @@ gc_ref_update(void *vstart, void *vend, size_t stride, rb_objspace_t *objspace, return 0; } +static int +gc_update_references_weak_table_i(VALUE obj, void *data) +{ + return BUILTIN_TYPE(obj) == T_MOVED ? ST_REPLACE : ST_CONTINUE; +} + +static int +gc_update_references_weak_table_replace_i(VALUE *obj, void *data) +{ + *obj = rb_gc_location(*obj); + + return ST_CONTINUE; +} + static void gc_update_references(rb_objspace_t *objspace) { @@ -7140,6 +7154,16 @@ gc_update_references(rb_objspace_t *objspace) rb_gc_update_vm_references((void *)objspace); + for (int table = 0; table < RB_GC_VM_WEAK_TABLE_COUNT; table++) { + rb_gc_vm_weak_table_foreach( + gc_update_references_weak_table_i, + gc_update_references_weak_table_replace_i, + NULL, + false, + table + ); + } + objspace->flags.during_reference_updating = false; } |