ruby-trunk-changes 2022-07-21

今日は ObjectSpace::WeakMap の不具合修正や配列リテラルのための内部的なオブジェクトの最適化などがありました。

[86d061294d] Peter Zhu 2022-07-19 19:51:39 UTC

ObjectSpace::WeakMap の実装で使われる wmap_live_p() という関数内で引数に与えられた VALUE の値が is_pointer_to_heap() で偽だった(オブジェクトの slot を指してるポインタじゃなかった)時に TRUE を返してしまっていたため異常終了する可能性があったのを修正しています。 [ruby-core:109251] [Bug #18928]

[6140edb5df] Noah Gibbs 2022-07-20 14:48:58 UTC

異常終了時の rb_bug() の出力内容のテストで子プロセスを起動して SIGSEGV を送信する場合に YJIT が有効なら子プロセスでも有効にするため --yjit オプションを渡すようにしています。 https://github.com/ruby/ruby/pull/6141

[660b1e973c] John Hawthorn 2022-07-20 16:31:40 UTC

YJIT でローカル変数へのセットのコード生成時に即値の代入の場合には RGenGC 用の Write Barrier が不要なので省略するようにしているようです。 https://github.com/ruby/ruby/pull/6122

[b25ee69e38] git 2022-07-20 16:32:04 UTC

version.h の日付更新

[5871ecf956] Peter Zhu 2022-07-19 15:15:05 UTC

struct RBasic::flags のビットフラグの定数に RARRAY_LITERAL_FLAG を追加して T_ARRAY 型オブジェクトで配列リテラルの元になっている ISeq に埋め込まれるものにフラグをつけるようにしています。この配列オブジェクトは ISeq の評価時にそのまま利用されるわけではなく(そうすると変更した時に評価するたびに内容が変わってしまう)コピーされて利用されるのでバッファ共有の参照カウンタの管理が不要なのでその処理をスキップするようにしています。またリテラル用の配列を作る rb_ary_literal_new() という関数を追加してバイナリフォーマットからの load 時にもこれを利用するようにしています。最適化のためかなと思いますが、そんなに効果あるのかな。

[32e406d6d3] Daniel Colson 2022-07-03 00:28:39 UTC

ObjectSpace._id2ref に Symbol の object_id を元にして調節した整数を渡すことで不正な Symbol の参照を作れてしまっていたのを修正しています。即値の Symbol を得る時に static な(文字列から to_sym などで作ったのではない、主にリテラルの) Symbol の ID でない数値の範囲だと例外にするようにしています。

[1341dea771] Aaron Patterson 2022-07-12 23:42:14 UTC

Thread オブジェクトの mark 処理で現在実行中の Fiber の保持している rb_execution_context_t を mark していましたが Fiber オブジェクト経由でも mark されるはずなので不要ということで削って、かわりに RUBY_ASSERT() で rb_thread_t::ec とその ec->fiber_ptr が保持している saved_ec が同じであることをチェックするようにしています。

[4a7ecc1bd9] Nobuyoshi Nakada 2022-07-21 00:57:53 UTC

拡張ライブラリ digest のテストで Digest::SHA1 を固定で利用していたところを利用可能なハッシュアルゴリズムを調べて使うようにしています。

[86b29ef877] Nobuyoshi Nakada 2022-07-21 02:45:22 UTC

拡張ライブラリ digest の複数 Ractor でのテストを Ractor が使えないバージョンでは setup メソッドで skip してたのをテストクラス全体の定義を後置 if で除外するようにしています。