ruby-trunk-changes 2022-12-03

今日は主に YJIT でインスタンス変数のセット(setinstancevariable 命令)に条件が揃った時に C の関数呼び出しにまかせずに独自の実装をコード生成する最適化や Module#instance_method で UnboundMethod を取得した時に receiver の情報が残ってそのインスタンスの表示や比較に影響してしまっていた問題の修正などがありました。

[eb6785356d] Nobuyoshi Nakada 2022-12-01 04:49:48 UTC

configure に bash でないと動かない変数展開の記法が使われていたので使わないように修正しています。また .github/workflows/check_misc.yml に configure.ac にこの変数展開の記法を使ってないかのチェックを追加しています。

[bb0ec7df32] Nobuyoshi Nakada 2022-12-02 14:44:24 UTC

non-blocking fiber のための Scheduler のインターフェースのテストで Thread の leak があったので終了待ちするようにしています。

[f28e79caaa] Nobuyoshi Nakada 2022-12-02 14:43:53 UTC

C の関数定義のスタイルの修正。

[e558c374b7] Nobuyoshi Nakada 2022-12-02 16:28:34 UTC

tool/downloader.rb でキャッシュディレクトリが Pathname#relative_path_from で相対パス化に失敗した時に expand_path して絶対パス化してから相対パス作成をリトライするようにしています。

[fa77bcf722] Takashi Kokubun 2022-12-02 16:32:49 UTC

YJIT 用のオプション --yjit-call-threshold のデフォルト値を 10 から 30 へ増やしています。 https://github.com/ruby/ruby/pull/6850

[eb2b717a8b] Alan Wu 2022-12-02 16:40:16 UTC

YJIT で switch 文の分岐をいれかえる最適化を === メソッドの再定義がされていたら抑制するようにしています。 https://github.com/ruby/ruby/pull/6846

[c2671fa051] Nobuyoshi Nakada 2022-12-02 16:37:46 UTC

e558c374b7975f9923228cdf325f767eef97a725 の tool/downloader.rb の変更の追加修正で生成した相対パス絶対パスより長かったら絶対パスを使って symbolic link を作るようにしていたところを文字数ではなくて "/" で区切られた要素数で比較するように変更しています。

[a5dde619a4] Nobuyoshi Nakada 2022-12-02 17:01:43 UTC

eb6785356d5c5775f26a49ae1138fdb0214ec509 の configure.ac の bash 固有の変数展開を避ける変更で target_alias 変数の置換のミスを修正。

[6f3c8fdab4] Koichi Sasada 2022-12-02 15:03:37 UTC

gems/bundled_gems の debug のバージョンを 1.7.0 に更新しています。

[ed1e0c2d13] git 2022-12-02 17:23:52 UTC

追随して NEWS の bundled gems のバージョンリストの debug のバージョンも更新しています。

[1015e69d37] Alan Wu 2022-12-02 17:24:17 UTC

configure の rustc コマンドのバージョンチェックをするために生成するソースコードに改行を入れるために echo に "\n" を渡していましたが \n はうまく置換あれないそうなので削っています。 [ruby-core:111157] [Bug #19174]

[85f041c0c5] Takashi Kokubun 2022-12-02 18:18:49 UTC

bootstraptest の Ractor のテストで Travis-CI の arm64 でのみ実行除外していたテストを常に実行除外するようにしています。

[7b38853bc3] Takashi Kokubun 2022-12-02 18:26:54 UTC

もうひとつ bootstraptest の Ractor のテストを YJIT が有効な時には実行除外するようにしています。

[5fafff15c6] Takashi Kokubun 2022-12-02 18:48:50 UTC

標準添付ライブラリ drb の SSL を使ったテストは Windows 環境では skip するようにしています。

[82b86b4c97] Ellen Marie Dash 2022-07-01 00:28:33 UTC

rubygems の Gem.write_binary というユーティリティメソッドで disk full により Errno::ENOSPC が発生した場合中途半端なファイルが残るのを防ぐために File.delete で削除するようにしています。

[e9e624b76e] Maxime Chevalier-Boisvert 2022-12-02 20:33:47 UTC

GitHub Actions の YJIT のテスト用の workflow で rustc が利用可能なら自動的に YJIT 有効になったので configure に --enable-yjit オプションを渡すのをやめています。 https://github.com/ruby/ruby/pull/6854

[69fd673b1a] Stan Lo 2022-12-02 20:43:55 UTC

irb の debug コマンドのテストを ruby 本体でのテストで skip するのに GitHub Actions の環境変数をみていたのを irb.gemspec のファイルの位置によるチェックに変更しています。また truffleruby でのテストの skip を setup に移動してまとめて skip するようにしています。

[17f9bcd7d7] Aaron Patterson 2022-11-16 23:37:57 UTC

YJIT の VM 命令 setinstancevariable のコンパイル時に T_OBJECT 型のオブジェクトの場合に rb_vm_setinstancevariable() の呼び出しにまかせずに独自に機械語を生成してインスタンス変数をセットする実装を追加しています。

[7b5ee9a8a6] Aaron Patterson 2022-11-17 00:15:43 UTC

17f9bcd7d77c0d9fdd4be605f0791f3f03fd6caf の続きで YJIT の setinstancevariable 命令のコンパイル時にセットする値が即値の場合に RGenGC のための Write Barrier の呼び出しをスキップするようにしています。最適化のため、というか即値を渡すと rb_bug() で異常終了するみたいですね。

[744b0527ea] Aaron Patterson 2022-11-17 00:31:14 UTC

17f9bcd7d77c0d9fdd4be605f0791f3f03fd6caf からの続きで YJIT での setinstancevariable 命令のコンパイル時に receiver が freeze されていたら例外発生するはずなので JIT コンパイルをキャンセルするようにしています。

[07fe3d37c5] Aaron Patterson 2022-11-17 23:17:01 UTC

17f9bcd7d77c0d9fdd4be605f0791f3f03fd6caf からの続きで setinstancevariable 命令のコンパイル時にコンパイル時点で設定する値が絶対に即値だと解析できていたら RGenGC のための Write Barrier の処理のコードをそもそも生成しないようにしているみたいです。

[be40af284a] Aaron Patterson 2022-11-18 21:13:32 UTC

17f9bcd7d77c0d9fdd4be605f0791f3f03fd6caf からの続きで setinstawncevariable 命令のコンパイルの実装でビットフラグのクリアのための機械語の生成を命令数を減らす最適化。

[606653e43a] Maxime Chevalier-Boisvert 2022-12-02 16:37:02 UTC

17f9bcd7d77c0d9fdd4be605f0791f3f03fd6caf からの YJIT の setinstancevariable 命令の実装の続きで be40af284a03d09e0197daed1c26f098c92d7d2d で shape_id の更新のための命令に余計なのがあった? のを削除しています。

[4c5e89791b] Jemma Issroff 2022-12-02 17:33:20 UTC

これもおそらく 17f9bcd7d77c0d9fdd4be605f0791f3f03fd6caf からの YJIT の setinstancevariable 命令のコンパイルの変更の続きで flags に埋め込まれている shape_id のオフセットの bit 数を得る処理を関数に括り出すリファクタリング

[ebd4c7bb01] Jemma Issroff 2022-12-02 17:45:25 UTC

これもたぶん 17f9bcd7d77c0d9fdd4be605f0791f3f03fd6caf からの YJIT の setinstancevariable 命令のコンパイル変更の続きで Rust 実装から rb_gc_writebarrier() を呼ぶための binding の宣言を追加しています。

[41bacd9b0d] Jemma Issroff 2022-12-02 18:41:06 UTC

17f9bcd7d77c0d9fdd4be605f0791f3f03fd6caf で YJIT の setinstancevariable のコンパイルのために一度追加された shape.c の rb_shape_flag_shift() と rb_shape_flag_mask() という関数が be40af284a03d09e0197daed1c26f098c92d7d2d の変更により不要になったので関数定義自体削除しています。

[7161bf34e1] Stan Lo 2022-12-02 22:00:39 UTC

標準添付ライブラリ irb のテストの helper.rb に require "pathname" を追加しています。

[59e389af28] Koichi Sasada 2022-12-02 20:55:33 UTC

Module#instance_method で UnboundMethod を取得した場合それはどの receiver の Module/Class から取得されたかは関係なくメソッドが定義されている Class/Module のメソッドとして取り出されますが、不要に receiver の情報も保存されていて inspect メソッドで文字列化した時や "==" で比較した時に receiver に依存していたという不具合を修正しています。 [ruby-core:108659] [Feature #18798]

[7b2306a3ab] Nobuyoshi Nakada 2022-12-03 02:17:26 UTC

rubyspec に macOS (darwin) の時に RUBY_PLATFORM に -darwin## とバージョンの数値を含む文字列が末尾にあるということをチェックしているテストがあったのを削除しています。configure 時のオプションで変更できるし、そもそもここの文字列は自分達で決めているわけではなくてツールチェイン? から得られたものなので仕様としてテストすべきことではないということで。