ruby-trunk-changes 2022-09-23

今日は主に MJIT の C binding の再実装と YJIT の最適化、また Exception#inspect でメッセージの改行をエスケープする変更(リトライ)などがありました。

[9fb18e6314] Otávio Schwanck dos Santos 2022-09-15 12:19:02 UTC

標準添付ライブラリ reline の Reline::LineEditor#editing_mode でインスタンス変数 @waiting_operator_vi_arg が nil の時の対応を追加しています。

[224a3ea718] Otávio Schwanck dos Santos 2022-09-15 12:19:44 UTC

標準添付ライブラリ reline のバージョン番号を 0.3.2 に更新しています。しかしすぐ次の commit で revert されています。

[696e8914b7] Otávio Schwanck dos Santos 2022-09-20 13:40:48 UTC

標準添付ライブラリ reline の 9fb18e631497fd308b2d1fdd9ad0bef1471de54b の変更に対応したテストの追加と nil チェックのかわりに safe guard 演算子(&.)を利用した書きかたに変更しています。

[4bdd8f2ddf] Otávio Schwanck dos Santos 2022-09-21 14:39:21 UTC

696e8914b74cd10047917ce677b1872ae1f04660 で追加した標準添付ライブラリ reline のテストを assert_nothing_raised を利用するように書きかえています。

[aafbc9068f] HParker 2022-09-21 20:53:10 UTC

compile.c の &&= や ||= のような演算子に対応した命令列を生成する compile_op_log() ですぐに捨てられる値を VM スタックに積むための不要な命令の生成を抑制するちょっとした最適化をしています。

[fbaac837cf] HParker 2022-09-21 21:12:45 UTC

aafbc9068f96e5e1f7f5c2c1fa6cba01ec8422db と同様に代入記号つきメソッドのための命令列の生成時に不要な dup と pop 命令の生成を抑制する最適化。また aafbc9068f96e5e1f7f5c2c1fa6cba01ec8422db のためのベンチマークも追加しています。

[b5c459d57a] Jemma Issroff 2022-09-22 16:20:45 UTC

Object#freeze を大量に呼ぶベンチマークを benchmark/vm_freezeobj.yml に追加しています。

[88bf8ad6e9] Jeremy Evans 2022-09-22 16:35:51 UTC

configure で YJIT のためのチェックをしている時に OpenBSD では LDFLAGS に -lpthread -lc++abi オプションを追加するようにしています。 YJIT で利用する _Unwind_xxx という関数群のために必要とのこと。

[f2bea691cd] Takashi Kokubun 2022-09-18 12:45:58 UTC

MJIT 用の C binding のための定数 RubyVM::MJIT::C を mjit_c.rb という ruby 実装で定義するようにして、このファイルは tool/ruby_vm/views/mjit_c.rb.erb のテンプレートから生成させるようにしています。テンプレートといっても展開する部分はないので mjit_c.rb を直接追加しても良さそうですが、これから拡張する予定なのかも。

[e81a612413] Takashi Kokubun 2022-09-18 13:32:21 UTC

f2bea691cd12150a526ddc4be95c5396f07920ba で追加したテンプレートファイル tool/ruby_vm/views/mjit_c.rb.erb 自体も tool/mjit/bindgen.rb で生成するようにしています。

[00c441ce7a] Takashi Kokubun 2022-09-18 13:44:29 UTC

やはり f2bea691cd12150a526ddc4be95c5396f07920ba で追加した ruby 実装のテンプレート tool/ruby_vm/views/mjit_c.rb.erb に lib/mjit/c_{32,64}.rb のいくつかの定数に対応したメソッド定義を移動して ruby 実装による Primitive.cexpr! を経由した C の定数参照を利用するようにしています。

[334b8bd459] Takashi Kokubun 2022-09-18 14:17:22 UTC

同じく f2bea691cd12150a526ddc4be95c5396f07920ba で追加した ruby 実装のテンプレート tool/ruby_vm/views/mjit_c.rb.erb に mjit_compiler.rb から実装を移動しています。

[4e0db2f753] Takashi Kokubun 2022-09-18 14:20:44 UTC

tool/ruby_vm/views/mjit_c.rb.erb はやっぱりテンプレートである必要なかったとのことで mjit_c.rb を直接生成するようにしてリポジトリに追加しています。

[591c3c7a1a] Takashi Kokubun 2022-09-18 14:25:20 UTC

tool/mjit/bindgen.rb で環境変数 BUNDLE_GEMFILE の設定をして require 'bundler/setup' することで常に bundler の影響下でこのツールを動かすようにしています。

[2f5b37533e] Takashi Kokubun 2022-09-18 14:32:59 UTC

00c441ce7ac76dedd272acf9a9daec59d9d5d908 の MJIT 用の C Binding で定数に対応したメソッド定義を ruby 実装の mjit_c.rb に移動した時に 1行メソッド定義の構文を使っていたのを普通の def ... end 文による定義に変更しています。BASERUBY で動く必要があるからとのこと。

[5cda5938f8] Takashi Kokubun 2022-09-18 14:43:24 UTC

さらに MJIT 用の C Binding の一部を mjit_c.rb による実装に移動しています。

[280ff1707e] Takashi Kokubun 2022-09-19 00:25:04 UTC

ついに lib/mjit/c_{32,64}.rb を削除して全て mjit_c.rb での実装に移動しています。

[4c6e1556b1] Takashi Kokubun 2022-09-20 14:23:50 UTC

tool/mjit/bindgen.rb で生成する MJIT 用 C binding で基本的な C の型に対応したメソッド群を生成するようにしています。

[2ce1460c65] Takashi Kokubun 2022-09-21 13:32:28 UTC

tool/mjit/bindgen.rb で生成する構造体型に対応したメソッドでサイズをマジックナンバーで mjit_c.rb に埋め込むのをやめて Primitive.cexpr!() で取得するようにしています。

[dc5b536468] Takashi Kokubun 2022-09-22 12:39:54 UTC

mjit_c.rb で他にもオフセット? などがマジックナンバーになっていたのを Primitive.cexpr!() を使って取得するように生成するよう tool/mjit/bindgen.rb を修正しています。

[dfc311c0b3] Takashi Kokubun 2022-09-22 13:25:33 UTC

MJIT 用の C Binding で構造体型のメンバーの情報としてオフセットと型の配列を持ってたところを順番を入れ替えて[型, オフセット] の順にするようにしています。

[0c9dc01a2a] Takashi Kokubun 2022-09-22 13:32:49 UTC

MJIT 用の C Binding 生成時にいくつかの構造体メンバーは環境によって型が違ったり存在しなかったりするものは含めないようにしています。

[4b97f1e525] John Hawthorn 2022-09-22 21:47:26 UTC

YJIT の Rust 実装で control frame を push する処理を専用の型を導入してメソッド定義して共有するようにリファクタリングしています。 https://github.com/ruby/ruby/pull/6412

[4e40fdbcee] Maxime Chevalier-Boisvert 2022-09-22 21:47:54 UTC

YJIT の Rust 実装の guard_two_fixnums() という関数でチェックが失敗した時に JIT コード実行をあきらめるのを jit_chain_guard() という関数呼び出しに変更しています。この関数はどうも一定回数まで再度コンパイルを試みる処理へジャンプする機械語命令を生成するものみたいです。 https://github.com/ruby/ruby/pull/6422

[6e46bf1e54] Nobuyoshi Nakada 2022-09-22 23:52:15 UTC

include/ruby/internal/scan_args.h のコメントのスタイル(?)修正。

[a78c733cc3] Yusuke Endoh 2022-09-23 07:40:59 UTC

b9f030954a8a1572032f3548b39c5b8ac35792ce で Exception#inspect の改行をエスケープするようにしたのを revert していたのを revert しています。つまり再度改行をエスケープするようにしています。チケットをみると debug.gem のテストが失敗したので revert したけどそちらは直ってそうなので再度適用するとのこと。 [ruby-core:110037] [Bug #18170]