summaryrefslogtreecommitdiff
path: root/gc/default/default.c
diff options
context:
space:
mode:
authorPeter Zhu <[email protected]>2025-01-24 10:16:27 -0500
committerPeter Zhu <[email protected]>2025-01-27 10:28:36 -0500
commit98b36f6f3661430a29ee1fe40d28b9abeeb903f5 (patch)
tree0a8c6901a489131948f58e7a25cb2e3c4f461213 /gc/default/default.c
parent9e5ff79c5be426c3e6fef80449620075cbca7671 (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.c24
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;
}