今日は Object#class の最適化などがありました。
[df1334421f] Takashi Kokubun 2025-08-29 14:22:40 UTC
ZJIT に未対応の VM 命令で JIT コンパイルをキャンセルした時の統計情報カウンタを追加しています。 https://github.com/ruby/ruby/pull/14392
[7f4a6afab8] Max Bernstein 2025-08-29 16:32:38 UTC
ZJIT の defined? についての不具合が修正されて不要になった side-exit を削除しています。 https://github.com/Shopify/ruby/issues/703 https://github.com/ruby/ruby/pull/14308 https://github.com/ruby/ruby/pull/14401
[fc4f8c879a] Takashi Kokubun 2025-08-29 16:40:15 UTC
GitHub Actions の YJIT 用 workflow から make yjit-bench を実行するジョブを削除しています。 https://github.com/ruby/ruby/pull/14394
[b6f4b5399d] Max Bernstein 2025-08-29 16:46:08 UTC
ZJIT でインスタンス変数参照の HIR の GetIvar 命令で型プロファイル情報を元に既知の Object Shapes の shape の時のインライン化最適化を実装しています。 https://github.com/ruby/ruby/pull/14388
[710c5c8ea1] Max Bernstein 2025-08-29 11:51:21 UTC
ZJIT の send 命令のコンパイル時に ZJIT の統計情報カウンタの dynamic_send_count のインクリメントを行うようにしています。
[99bf47ab8c] Max Bernstein 2025-08-29 12:00:29 UTC
ZJIT の統計情報カウンタにメソッド呼び出しの引数渡しの方法による JIT コンパイルキャンセルを理由ごとのカウンタを追加しています。
[39f3cab80d] Takashi Kokubun 2025-08-29 18:43:33 UTC
vm_insnhelper.c に rb_vm_sendforward() という関数を追加して rb_vm_send() の中で分岐していた委譲用引数の時の処理を関数として別に分けるようにしています。 https://github.com/ruby/ruby/pull/14393
[cc07159fba] Alan Wu 2025-08-29 19:32:57 UTC
rb_str_resurrect() の Doxygen 用コメントを修正。使われてないはずと書かれてましたが zlib で利用されているとのことでその記述は削除しています。
[2f6a9c5167] Stan Lo 2025-08-29 18:03:53 UTC
YJIT と ZJIT からそれぞれ複数 Ractor モードかどうか判定する関数の名称を rb_{yjit,zjit}_multi_ractor_p() -> rb_jit_multi_ractor_p() と改名して統合しています。
[561050496c] Stan Lo 2025-08-29 18:13:42 UTC
2f6a9c51670dd6dcc1cae52e4a793143fb148eb6 と同様に rb_jit_vm_lock_then_barrier() という関数を追加して YJIT/ZJIT 双方から呼ぶように統合しています。
[3f3a54efff] Stan Lo 2025-08-29 18:16:43 UTC
2f6a9c51670dd6dcc1cae52e4a793143fb148eb6 と同様に rb_jit_vm_unlock() という関数を追加して YJIT/ZJIT 双方から呼ぶように統合しています。
[d4d510da18] Alan Wu 2025-08-29 22:05:48 UTC
tool/enc-unicode.rb のコメントに make update-unicode というターゲットから呼ばれることを追記しています。
[96c8938535] Alan Wu 2025-08-29 22:34:11 UTC
rubyspec で正規表現の不具合修正がバックポートされたのに追随してバージョンでの分岐を修正しています。
[d94e0a7bca] Nobuyoshi Nakada 2025-01-22 03:44:45 UTC
GitHub Actions の bundled gems の更新チェックの workflow で更新時の自動コミットのステップを commit と push で分けています。
[01a57bd6cd] Nobuyoshi Nakada 2025-01-22 05:58:35 UTC
GitHub Actions の bundled gems の更新用 workflow で gems/bundled_gems にテスト用 commit hash の指定がしばらく更新されないままだとメッセージを出力するようにしています。
[fd0c772db7] Jean Boussier 2025-08-30 08:51:03 UTC
Object#class の実装で T_ICLASS をスキップするためのループの部分をインライン化して struct RBasic::flags のフラグチェックだけで判定するように軽量化しています。
[01b89528cb] Jean Boussier 2025-08-30 10:15:11 UTC
fd0c772db7e5098c2b8e03559317a3592074dfe7 からの続きでさらに T_MODULE も同様の判定方法を使えるように fake_class_p() を拡張しています。このために T_MODULE の時の struct RBasic::flags のビットフラグ RMODULE_IS_REFINEMENT を下位 2 bit 目から 6 bit 目に移動しています。これは T_CLASS の時の RUBY_FL_SINGLETON と同じ位置のビットを避けるためみたいですね。
[f5da6395bd] Jean Boussier 2025-08-30 11:04:11 UTC
さらに Object#class の実装で ruby 実装から C の関数を呼ぶ時に self が NULL になることはありえないので NULL チェックも省いた関数 rb_obj_class_must() を追加して、ruby 実装からはこちらを呼ぶようにしています。なんですが、RCLASS_SUPER() で親を辿った時に NULL というのもチェックを省いているけどこれはいいのかな。
[d89e73471d] Jean Boussier 2025-08-30 11:32:44 UTC
fd0c772db7e5098c2b8e03559317a3592074dfe7 からの一連の変更の続きで通常の T_CLASS/T_MODULE がくるまで辿るループ部分を class_real() という関数に切り出して共有化するリファクタリング。
[395bda2fa1] Jean Boussier 2025-08-30 12:17:14 UTC
Object#class の ruby 実装から呼び出す f5da6395bd3fdf4b76a480f174cd304823ddc57f で追加した関数 rb_obj_class_must() を static inline 関数にしています。ruby 実装から呼ぶ関数を inline 関数にしちゃってもいいんだっけ? と思ったけど Primitive.cexpr! で埋め込んでるから展開後にコンパイル時にインライン化されるからいいのかな。ヘッダファイルじゃなくて object.c で定義しているけど……。