ruby-trunk-changes 2023-01-13

今日は RGenGC 用の Write Barrier 漏れの不具合修正や、大量の引数を配列から展開して渡す時に VM スタックを消費しないようにする変更などがありました。

[207f8d0027] Stan Lo 2023-01-12 11:49:12 UTC

標準添付ライブラリ irb で eval で動的に定義するメソッド内で require_relative を receiver なしで起動していたのを Kernel.require_relative と Kernel モジュールの特異メソッドとして呼ぶようにしています。またクラスメソッドの呼び出しのための ExtendCommand モジュールを ::IRB::ExtendCommand とフルパスで参照するようにしています。main が freeze されていた時にうまく動かなかったのでその対策だそうです。

[bfc887f391] Peter Zhu 2023-01-11 19:25:34 UTC

string.c に str_enc_copy_direct() という static 関数を追加して各種メソッドの実装の関数から str_enc_copy() のかわりにこちらを利用するようにしています。高速化のため Encoding の index が flags に埋め込み可能な範囲なら ENCODING_SET_INLINED() だけ呼んで flags へのセットだけ行うようにして不要なチェックを省くようにしているようです。

[8d3ff66389] Ian Ker-Seymer 2023-01-12 15:14:17 UTC

GitHub Actions と Cirrus の YJIT のテスト用の workflow で Rust 実装の linter clippy というのを実施するステップを追加しています。でおそらくこれで指摘された部分の修正も同時に含んでいるようです。 https://github.com/ruby/ruby/pull/7093

[da7e5c7b77] Takashi Kokubun 2023-01-12 20:09:32 UTC

yjit.rb の RubyVM::YJIT.insns_compiled メソッドの定義で RubyVM::YJIT.enabled? でチェックするのをメソッドの先頭に移動して無効化時に不要な処理をスキップするようにしています。 https://github.com/ruby/ruby/pull/7112

[537183cd2a] Alan Wu 2023-01-12 18:30:06 UTC

vm_insnhelper.c の vm_ccs_create() という関数で RGenGC のための Write Barrier が不足していたのを追加しています。このために callcache のテーブル cc_tbl と mid を引数に追加して呼び元であとで呼んでいた rb_id_table_insert() の呼び出しをこの関数内に移動しています。

[2e7bceb34e] Koichi Sasada 2023-01-12 14:56:29 UTC

Hash.[] メソッドにとても大きな配列を * で引数に展開して渡すとエラーになるという問題の対策のため配列サイズが 128 を越えてたら内容を VM スタック上に展開しないで配列オブジェクトに詰めてそのバッファをメソッド呼び出し時の argv として使うようにしています。 [ruby-core:33132] [Bug #4040]

[eab7f4623f] Aaron Patterson 2023-01-12 23:54:05 UTC

vm_backtrace.c の rb_profile_frames() の先頭で引数の cfp の NULL チェックを追加しています。 Thread 作成直後でまだ cfp が用意されていないタイミングで呼ばれる可能性があるのでその場合異常終了していたのでその修正みたいです。

[7e8802fa5b] Koichi Sasada 2023-01-13 00:47:59 UTC

537183cd2ac0163851277b46a2f21ea5914c11c0 の RGenGC 用の WriteBarrier 追加の変更で VM_CHECK_MODE が 0 の時に未使用変数の警告が出るようになっていたので、preprocessor 分岐を追加して必要な箇所でのみ変数宣言するようにしています。

[5b36fefc4e] Nobuyoshi Nakada 2023-01-13 03:26:16 UTC

File.atime, mtime, ctime などのメソッドのテストで File.stat で chardev? が新の時だけ呼ぶようにしています。 /dev/null について呼ぶとエラーになる場合があったみたいです。

[94d6d6d93f] Yusuke Endoh 2023-01-13 08:02:24 UTC

679ef34586e7a43151865cb7f33a3253d815f7cf で定数の inline cache の解決を最適化するために専用の VM 命令 opt_getconstant_path を導入した結果、名前空間のネストした定数参照で定数が見つからない時にエラーの発生箇所がどの段階のものかがわからなくなって標準添付ライブラリ error_highlight でエラー箇所を指示できなくなったとのことで、error_highlight のほうで NameError#name で例外に格納されているエラーになった定数名をみて AST の対応するノードを探す特別処理を追加して対応しています。