ruby-trunk-changes 2022-10-21

今日は Qnil, Qtrue, Qunef などの即値のビットパターンを変更するという ABI の変更やそれで表出した YJIT の不具合修正、Class#attached_object という特異クラス専用のメソッドの新規追加などがありました。

[1e66d3b853] Nobuyoshi Nakada 2022-10-18 08:05:56 UTC

.appveyor.yml と .cirrus.yml でも GitHub Actions と同様に bundler のドキュメント系のファイルのみの変更を無視する設定を追加しています。

[f55212bce9] Nobuyoshi Nakada 2022-10-20 01:57:40 UTC

Qnil や Qtrue, Qunef などの即値(Qundef はオブジェクトとして不正な値なので即値とはちょっと違いますが)のビットパターンを変更して、RUBY_ABI_VERSION を 2 → 3 に更新しています。 Qnil と Qunef の違いを 1-bit だけにしたかったからとのこと。それを利用した変更をする予定なのかな。

[192bc72529] Nobuyoshi Nakada 2022-10-20 05:42:08 UTC

f55212bce939f736559709a8cd16c409772389c8 の Qnil と Qundef の値を変更したのを利用してビット演算と整数の比較だけで軽量に判定できる RB_NIL_OR_UNDEF_P() という関数を追加しています。とりあえず追加しただけでまだ利用しているところはなさそうですが。

[0378e2f4a8] Ufuk Kayserilioglu 2022-09-26 22:19:22 UTC

Class#attached_object というメソッドを新規追加しています。Class のメソッドになっていますが実際には特異クラスの時だけ使えてその特異クラスが修飾しているインスタンスを返すというメソッドのようです。通常のクラスに対して呼ぶと TypeError が発生するようになっています。ほほー。しかしどうやって使うんでしょうね。デバッグ用途には便利そうですが。 [ruby-core:73878] [Feature #12084]

[6aed5b0c11] Jemma Issroff 2022-10-19 18:56:22 UTC

ちょっとよくわかりませんが Marshal.dump で内部的に採番しているインスタンス変数の ID の対応をテストするための拡張ライブラリでその ID を 0 にしていたのを修正しています。テストのほうも pend でスキップしていたのをやめています。

[245ad2b38a] Nobuyoshi Nakada 2022-10-20 14:19:22 UTC

YJIT で f55212bce939f736559709a8cd16c409772389c8 での Qnil, Qunef, Qtrue のビットパターン変更に追随したついでに? 即値の判定に enum 型の ruby_special_consts を import して利用するようにしています。

[9a0a165a5d] Nobuyoshi Nakada 2022-10-20 15:43:08 UTC

gc.c の rb_gc_writebarrier() で引数が special constant (Qnil, Qfalse や flonum などの即値)の時に rb_bug() で異常終了させるのを RGENGC_CHECK_MODE を真に定義してビルドした時だけにしていたのを常にチェックするようにしています。

[2930302244] Alan Wu 2022-10-20 21:17:00 UTC

YJIT の Rust 実装の不要になってたコメントを削除しています。

[39f7eddec4] Alan Wu 2022-10-20 20:45:24 UTC

YJIT の Rust 実装 gen_expandarray() で変数を VALUE 型で扱っていたところを整数として扱うように修正しています。 VALUE とすると GC の mark 対象になるので不正なアクセスが起きる可能性があったみたいです。不具合自体は元からあったけど Qnil などのビットパターン変更で表面化したとのこと。

[e72c5044ce] Nobuyoshi Nakada 2022-10-21 01:02:16 UTC

9a0a165a5d6d0bc4ed18cb92d05593796f703359 の RGENGC_CHECK_MODE が 0 でも rb_gc_writebarrier() での引数の即値チェックをするようにしていたのをまた RGENGC_CHECK_MODE が 0以外の時だけチェックするように戻しています。どうやらこの変更は 39f7eddec4c55711d56f05b085992a83bf23159e で修正した YJIT の不具合修正のデバッグのために行なってたみたいです。

[e026368061] Yusuke Endoh 2022-10-21 04:39:15 UTC

開始点の省略された beginless range に対して Range#size を呼ぶと常に Float::INFINITY が返されていたのを終点が数値の時だけにしてそれ以外では nil を返すように変更しています。 [ruby-core:109770] [Bug #18983]