ruby-trunk-changes 2023-04-03

今日は RJIT のサポートするメソッドタイプの拡張や最適化、default gems のバージョン番号を定数として定義するようにする変更などがありました。

[f25791884c] Stan Lo 2023-04-02 14:11:07 UTC

標準添付ライブラリ irb の未使用になってたコードの削除をしているようです。 https://github.com/ruby/irb/pull/554

[cd94bcdc46] Stan Lo 2023-03-30 16:17:17 UTC

標準添付ライブラリ irbRUBY_ENGINE をみて CRuby でのみ対応していたコマンドのチェックをはずして JRuby や TruffleRuby でも動作させるようにしています。

[7778c292c4] Takashi Kokubun 2023-04-02 07:03:24 UTC

RJIT にメソッド呼び出し時にキーワード引数を渡して呼び出されている場合のコンパイルの対応を追加しています。

[62188c8584] Takashi Kokubun 2023-04-02 17:27:17 UTC

RJIT の side exit の理由のカウンタの種類を追加しています。

[6f2535deda] Takashi Kokubun 2023-04-02 17:40:37 UTC

lib/ruby_vm/rjit/insn_compiler.rb で RJIT の C binding 用の定数の参照に "C::" の名前空間を明示するように修正しています。

[cd1cd8030c] Takashi Kokubun 2023-04-02 17:46:27 UTC

RJIT でメソッド呼び出し時に配列を splat して渡す呼びかたをしている時のコンパイル対応を追加しています。

[5cc644b147] Takashi Kokubun 2023-04-02 18:01:23 UTC

RJIT の side exit の理由のカウンタのうちブロック引数に関するものを 1つにまとめています。

[bf7587748d] Takashi Kokubun 2023-04-02 18:07:50 UTC

RJIT のコンパイラ実装で jit_search_super_method メソッドを呼び元に展開するリファクタリング

[3fe134759c] Takashi Kokubun 2023-04-02 19:23:22 UTC

テストで使う assert_linear_performance という assertion メソッドで RJIT が有効な時には計算時間の比較チェックをスキップするようにしています。また RJIT のコンパイラで super の呼び出しの時の処理を削っています。これは意図的に混ざってるのかな?

[284a0ff96c] Takashi Kokubun 2023-04-02 19:28:49 UTC

3fe134759cc4904c74306e0832c22fa518a5bea2 で削除した RJIT のコンパイラで super 呼び出し時の分岐で if 文の内容がなくなってしまっていたので条件分岐自体を消しています。またこれにより不要になった jit_caller_setup_arg_block メソッドの is_super 引数自体を削除しています。どうやら呼び元が 1つだけで常に false を渡す状態になってたので dead code だったようですね。

[66f8efc342] Takashi Kokubun 2023-04-02 19:56:27 UTC

RJIT の C 実装のメソッド呼び出し時のコンパイル処理のリファクタリングのようです。

[57ee627929] Takashi Kokubun 2023-04-02 21:15:23 UTC

RJIT のコンパイラ実装でブロックが未対応なタイプの時にコンパイルを諦める分岐を後ろのほうに移動しています。

[ad2b719fc2] Takashi Kokubun 2023-04-02 21:32:49 UTC

RJIT の C binding のメソッド C::FL_TEST_RAW の結果を 0 と比較していましたが元から真偽値がかえってくる? みたいなので比較を削除しています。

[4fc336127e] Takashi Kokubun 2023-04-02 21:44:40 UTC

RJIT で省略可能な引数を持つように定義されたメソッドのコンパイルの対応を追加しています。

[6002b12611] Takashi Kokubun 2023-04-02 22:26:46 UTC

RJIT がコンパイルするコードで最初に rb_rjit_entry_stub_hit() という関数を呼び出して使いまわせる既存のコンパイル結果がないか探すようにしている? みたいです。

[8968b47ba8] Takashi Kokubun 2023-04-02 23:46:32 UTC

RJIT の VM 命令 getlocal と setlocal のコンパイル処理のメソッドの位置を移動して内容も共通処理を使いまわすようにリファクタリングしているようです。

[2f1586f6f2] Nobuyoshi Nakada 2023-04-02 08:50:22 UTC

テスト時に make leaked-globals も自動で実行するようにして GitHub Actions や CirrusCI で明示的に実行するアクションを追加していたのを削除しています。

[a70653ca7f] Hiroshi SHIBATA 2023-03-30 04:05:45 UTC

標準添付ライブラリ find でバージョン番号を Find::VERSION という定数として定義して gemspec ファイルからそれを切り出して設定するように変更しています。

[6dcd399976] Hiroshi SHIBATA 2023-03-30 05:17:44 UTC

標準添付ライブラリ tsort でもバージョン番号を TSort::VERSION という定数に定義して gemspec ファイルからはそれを切り出して設定するように変更しています。

[ba4f01f0a0] Hiroshi SHIBATA 2023-03-30 05:19:53 UTC

標準添付ライブラリ yaml でもバージョン番号を YAML::VERSION という定数で定義して gemspec ファイルからはそれを切り出して設定するように変更しています。

[14f442a958] Hiroshi SHIBATA 2023-03-30 04:06:08 UTC

標準添付ライブラリ base64 でもバージョン番号を Base64::VERSION という定数で定義して gemspec ファイルからはそれを切り出して設定するように変更しています。

[b5c8c73f66] Hiroshi SHIBATA 2023-04-03 03:00:59 UTC

a70653ca7facbb2004562e5718fa51e7ade6b1576dcd39997679914dad1c23f95adb3f7d84ec594214f442a9584989805be8e40caa0de7758bf07532 でバージョン番号を定数として定義するようにした変更で gemspec で version.rb から文字列操作で切り出す処理で version.rb を探すためのファイルパスの決定で親ディレクトリを辿るようになっていたのをやめています。けどこれだと "../../.." みたいになるかわりに "//" になるけどこれでいいのかな? まあいずれにせよみつかるはずですが。

[27f709aa3c] Hiroshi SHIBATA 2023-04-03 03:43:11 UTC

標準添付ライブラリ yamlYAML::VERSION については YAML は Psych の別名なので Psych::VERSION と衝突してしまうため YAML::LOADER_VERSION と改名して gemspec で切り出す定数名も変更しています。

[6fb6d85aee] Hiroshi SHIBATA 2023-04-03 05:18:22 UTC

標準添付ライブラリ fileutils のバージョンを 1.7.1 に更新しています。

[09ad7e20d3] git 2023-04-03 05:20:16 UTC

NEWS ファイルの default gems のバージョンリストに fileutils を追加しています。

[d546f8c518] Takashi Kokubun 2023-04-02 23:59:07 UTC

RJIT で VM スタックの内容の型情報を RubyVM::RJIT::Context というクラスのインスタンスで保持するようにしています。

[50285d2864] Takashi Kokubun 2023-04-03 06:05:55 UTC

d546f8c5183d583b2455ef005b9276a22bab3b65 の続きで RubyVM::RJIT::Context#stack_swap で型情報も入れ替えるよう対応を追加しています。

[be4e16bc1a] Takashi Kokubun 2023-04-03 06:07:58 UTC

RJIT の VM 命令 setn で VM スタックの型情報も変更するように対応を追加しています。

[eb51248c4c] Takashi Kokubun 2023-04-03 05:52:13 UTC

RJIT で型情報として具体的な型はわからないけど即値かそうでないかは判定できるというのに対応しています。即値と分かっていたら GC 関連の処理を省略したりできるからそういう最適化のためかな。

[3bacc3877a] Takashi Kokubun 2023-04-03 06:22:53 UTC

RJIT で 6002b12611c3cee921fc8aef76b55db4b2d0fbcd で追加したコンパイル済みのコードの再利用のために検索する処理で RubyVM::RJIT::Context の内容の差分をみてできるだけ同じ条件のものを探すという処理を追加しているようです。完全に一致してないといけない部分もあるけど型情報など少し違っていてもいいものは極力似てるものを選ぶということをするみたいです。

[d876c008ec] Takashi Kokubun 2023-04-03 06:34:57 UTC

RJIT で ISeq ごとにコンパイル結果のコードを保持する上限を 4に定めています。それを越えたら型情報を持たない Context を作ってそれを使うようにしています。

[f0b69eb14f] Takashi Kokubun 2023-04-03 06:48:09 UTC

RJIT で VM スタックの型情報で T_ARRAY 型であることを宣言する guard_object_is_array で同時に即値でないオブジェクトであるという情報も保持させるようにしています。また Array クラスのオブジェクトなのか Array を継承した子クラスのオブジェクトなのかの情報も設定するようにしています。

[0abe9d8b32] Takashi Kokubun 2023-04-03 06:53:15 UTC

同じく RJIT で VM スタックの値が T_STRING 型オブジェクトであることを宣言する guard_object_is_string メソッドで同時に即値でないという情報も含めるようにしています。また String クラスのオブジェクトか、それを継承した子クラスのオブジェクトかの情報も判定しておくようにしています。

[1d452c2cf8] Takashi Kokubun 2023-04-03 07:02:45 UTC

同じく RJIT の guard_two_fixnums メソッドでもより詳しい VM スタックの型情報のチェックを追加しています。

[ca8102355a] Takashi Kokubun 2023-04-03 07:09:28 UTC

同じく RJIT の VM スタックの型情報を更新する jit_guard_known_klass で可能なら型情報を絞り込むようにしています。またデバッグのため? の assert メソッドを埋め込んでいます。

[46e93ef53d] Takashi Kokubun 2023-04-03 07:49:10 UTC

RJIT でメソッド呼び出し時の receiver の型情報を利用可能にするようにしています。