Fix missing write barrier through M_TBL

When creating a new origin in ensure_origin, we need to fire a write
barrier after RCLASS_SET_ORIGIN. rb_class_set_super allocates, so GC
could happen there, either incrementally marking or promoting the newly
allocated class, and only after RCLASS_SET_ORIGIN will origin mark
object in the M_TBL.
This commit is contained in:
John Hawthorn 2025-06-09 11:26:49 -07:00 committed by Takashi Kokubun
parent 07f7832cff
commit 5026609f47

View File

@ -1428,6 +1428,11 @@ ensure_origin(VALUE klass)
RCLASS_SET_SUPER(origin, RCLASS_SUPER(klass));
RCLASS_SET_SUPER(klass, origin);
RCLASS_SET_ORIGIN(klass, origin);
// RCLASS_SET_ORIGIN marks origin as an origin, so this is the first
// point that it sees M_TBL and may mark it
rb_gc_writebarrier_remember(origin);
RCLASS_M_TBL_INIT(klass);
rb_id_table_foreach(RCLASS_M_TBL(origin), cache_clear_refined_method, (void *)klass);
rb_id_table_foreach(RCLASS_M_TBL(origin), move_refined_method, (void *)klass);