今日は Ruby::Box の初期化まわりの実装変更や潜在的不具合修正などがありました。
[56cd26f835] Peter Zhu 2026-05-08 00:02:55 UTC
GC の mmtk 実装で GC のイベントフック実行時に rb_execution_context_t の取得を GET_EC() のかわりに rb_gc_get_ec() で行なうようにした修正の関連で不要になった rb_gc_worker_thread_set_vm_context() の呼び出しを削除して、かわりに rb_objspace_t に event_hook_mutex という mutex のメンバーを追加してイベントフック実行時にこのロックを取得することで複数の GC thread から並列実行しないようにしています。
[5ed1f93b0e] Satoshi Tagomori 2026-05-08 09:43:15 UTC
インタプリタ起動時に ruby 実装による組み込みメソッドを ISeq にコンパイルしたものをロードする処理で、ロードする順番のミスマッチでバイナリ列からの探索を行う時の不具合でポインタのインクリメントしている箇所が多くてちゃんと探索できていなかった不具合を修正しています。通常はビルド時の feature の順序と実行時の順序が一致しているので fastpath を通るので顕在化していなかったようです。
[276f0d9b3e] Satoshi Tagomori 2026-05-08 13:37:22 UTC
Ruby::Box の作成時の元となる root Box は組み込みメソッドの定義のための事前にコンパイルされた ISeq のバイナリ表現のロードや prelude.rb の実行にも使われているため、Ruby::Box の生成タイミングに依存して事前に定義されているクラスに差が出るなどの問題があったので、コピー元として使う master box というものを固定して、組み込みメソッドのロードなどはそこからコピーした root box というのを生成してこの中で行うようにしています。そうするとユーザーのコードが動く box で root でロードしたメソッドなどがなくなるのでは、と思ったのですが gem_prelude はユーザーの box でもロードさせるようにしているようです。その他 box の構造も少し変更していて大きな変更ですね。 [Bug #21881]
[8351378bf3] Samuel Williams 2026-05-10 07:58:45 UTC
scheduler.c の rb_fiber_scheduler_blocking_operation_wait() に中間オブジェクトの blocking_operation がコンパイラ最適化による参照の喪失で GC の mark されなくなる可能性を防ぐための RB_GC_GUARD() を追加しています。 https://github.com/ruby/ruby/pull/16908