From 1986d775cdae6a0ab40a2528e2ec9b50e06eba70 Mon Sep 17 00:00:00 2001 From: Jean Boussier Date: Thu, 7 Aug 2025 14:47:37 +0200 Subject: [PATCH] symbol.c: use `rb_gc_mark_and_move` over `rb_gc_location` The `p->field = rb_gc_location(p->field)` isn't ideal because it means all references are rewritten on compaction, regardless of whether the referenced object has moved. This isn't good for caches nor for Copy-on-Write. `rb_gc_mark_and_move` avoid needless writes, and most of the time allow to have a single function for both marking and updating references. --- gc.c | 4 ++-- internal/symbol.h | 3 +-- symbol.c | 15 +++------------ 3 files changed, 6 insertions(+), 16 deletions(-) diff --git a/gc.c b/gc.c index 64a22cd1b7..90f2b29bfa 100644 --- a/gc.c +++ b/gc.c @@ -3028,7 +3028,7 @@ rb_gc_mark_roots(void *objspace, const char **categoryp) mark_current_machine_context(ec); MARK_CHECKPOINT("global_symbols"); - rb_sym_global_symbols_mark(); + rb_sym_global_symbols_mark_and_move(); MARK_CHECKPOINT("finish"); @@ -4045,7 +4045,7 @@ rb_gc_update_vm_references(void *objspace) rb_vm_update_references(vm); rb_gc_update_global_tbl(); - rb_sym_global_symbols_update_references(); + rb_sym_global_symbols_mark_and_move(); #if USE_YJIT void rb_yjit_root_update_references(void); // in Rust diff --git a/internal/symbol.h b/internal/symbol.h index 8571c00289..b9109b1347 100644 --- a/internal/symbol.h +++ b/internal/symbol.h @@ -17,8 +17,7 @@ #endif /* symbol.c */ -void rb_sym_global_symbols_mark(void); -void rb_sym_global_symbols_update_references(void); +void rb_sym_global_symbols_mark_and_move(void); VALUE rb_to_symbol_type(VALUE obj); VALUE rb_sym_intern(const char *ptr, long len, rb_encoding *enc); VALUE rb_sym_intern_ascii(const char *ptr, long len); diff --git a/symbol.c b/symbol.c index c337cc288e..ddb0f1556b 100644 --- a/symbol.c +++ b/symbol.c @@ -371,21 +371,12 @@ Init_sym(void) } void -rb_sym_global_symbols_mark(void) +rb_sym_global_symbols_mark_and_move(void) { rb_symbols_t *symbols = &ruby_global_symbols; - rb_gc_mark_movable(symbols->sym_set); - rb_gc_mark_movable(symbols->ids); -} - -void -rb_sym_global_symbols_update_references(void) -{ - rb_symbols_t *symbols = &ruby_global_symbols; - - symbols->sym_set = rb_gc_location(symbols->sym_set); - symbols->ids = rb_gc_location(symbols->ids); + rb_gc_mark_and_move(&symbols->sym_set); + rb_gc_mark_and_move(&symbols->ids); } static int