ruby-trunk-changes 2022-12-01

今日は主に String#scan と ObjectSpace.each_object を並用すると異常終了する不具合の修正や SyntaxError#path メソッドの新規追加、Fiber local storage の追加などの変更がありました。

[03f1e6a2aa] Alan Wu 2022-11-29 20:37:29 UTC

YJIT の Rust 実装で IseqPayload::pages をクリアする時に HashSet::clear() を利用していましたがこのメソッドではバッファを切り詰めて解放してくれないので新しい HashSet を生成して再代入するように変更しています。

[b30248f74a] Alan Wu 2022-11-29 20:41:25 UTC

YJIT の Rust 実装で HashMap などの内容を削除した時に空になったら削除する処理を追加しています。TracePoint が有効になった時などにテーブルをクリアした時に微妙に残ってたメモリ領域を解放するようにしているようです。

[a0b0365e90] Alan Wu 2022-11-29 21:14:13 UTC

同じく YJIT の Rust 実装で同様にメモリ管理方針の不具合? で解放されずに残る部分があったのを修正しているようです。

[d752cf7601] Nobuyoshi Nakada 2022-11-25 05:22:37 UTC

sample/ や tool/ などのスクリプトで Kernel#open を使っていたところで引数が必ずファイルの場合は File.open を利用するように変更しています。

[c87b3ee671] Nobuyoshi Nakada 2022-11-30 13:44:04 UTC

標準添付ライブラリ rdoc で一時ファイルの生成に独自のロジックを使ってたのを tempfile を利用するように変更。

[99cad3fccd] Nobuyoshi Nakada 2022-11-30 13:59:15 UTC

標準添付ライブラリ rdoc の rd フォーマットの parser 実装の rdoc のためには不要な部分? をコメントアウトしています。

[f0c9d2a0c8] Nobuyoshi Nakada 2022-11-30 14:04:45 UTC

標準添付ライブラリ rdoc の rd の parser で行頭の "=end" のあとに余計な文字がついていてもマッチしてしまっていたのを修正しています。

[ab4c7077cc] Yusuke Endoh 2022-11-30 16:31:24 UTC

String#scan が内部で生成する MatchData オブジェクトが RMATCH(obj)->str が Qfalse という不正というか不完全な状態になっていて、通常これは ruby スクリプトからは触れないのですが ObjectSpace.each_object で全オブジェクトを検索した時に異常終了(SEGV)してしまっていたので rb_obj_hide() を呼んで klass を 0 にして内部オブジェクトとしてマークして ObjectSpace からも見せないようにしています。 [ruby-core:111054] [Bug #19159]

[d98d84b75d] Maxime Chevalier-Boisvert 2022-11-30 19:09:10 UTC

YJIT の --yjit-stats で表示する統計情報に block_next_count と defer_count という項目を追加しています。 https://github.com/ruby/ruby/pull/6837

[0d3fc08ff4] Takashi Kokubun 2022-11-30 21:16:11 UTC

YJIT の Integer#== と Integer#=== メソッドのコンパイルに専用のコード生成の実装を追加して最適化しています。両辺 Fixnum だった時に即値なので直接機械語での比較をするようにしているようです。 https://github.com/ruby/ruby/pull/6838

[4b9d10b833] Zack Deveau 2022-11-29 19:40:43 UTC

Struct や Data のインスタンス変数参照の実装 struct_ivar_get() で親クラスを辿った時に Qnil がかえってくるケースを許容するように条件を追加しています。 RCLASS_SUPER() マクロではなく rb_class_superclass() という関数を利用するようになっていてこれは Qnil を返すケースがあるみたいです。実際どんな時かなと思ってみてみたんですが BasicObject の時くらいしかわかりませんでいした。実際に発生することあるのかな。GitHub をみると Marshal.load から不正な? オブジェクトがロードされた時みたいですね。 https://github.com/ruby/ruby/pull/6832

[5752d11f1f] Alan Wu 2022-11-30 20:04:31 UTC

4b9d10b8330b5072993f2c32eaf701c5c1aa7e55 の追加修正で superclass が 0(Qfalse) または Qnil というのは RTEST() マクロに置き換えることができるので置換しています。 https://github.com/ruby/ruby/pull/6832

[4e68b59431] Nobuyoshi Nakada 2022-11-20 13:59:52 UTC

例外クラス SyntaxError に SyntaxError#path メソッドを追加して構文エラーが発生したスクリプトのファイル名を返すようにしています。 [ruby-core:110828] [Feature #19138]

[a1d341efaf] Nobuyoshi Nakada 2022-12-01 05:11:50 UTC

60610031009e60bdfe5775b0316df251ee36a973 で標準添付ライブラリ delegate でメソッド再定義の警告を抑制するために同名のメソッドへの alias を作るという hack をしていたのを revert しています。 DelegateClass を誤用した時に警告が出ないので警告が出るのが意図的だということみたいです。 [ruby-core:110483] [Bug #19079] [ruby-core:111105] [Bug #19047]

[9869bd1d61] Nobuyoshi Nakada 2022-11-22 05:25:44 UTC

Array#pack や String#unpack に渡される指示子の文字列は ASCII 互換な Encoding でなかったら Encoding::CompatibilityError 例外を発生させるようにしています。 [ruby-core:110636] [Bug #19108]

[0436f1e15a] Samuel Williams 2022-12-01 10:00:33 UTC

Thread local storage の Fiber 版みたいなのを追加しています。なんか結構昔に追加していたような気がしたけど過去に何度かチケットが作成されて提案はあったもののまだ入ってなかったようです。実装としては rb_execution_context_t のメンバーに VALUE 型の storage メンバが追加されて Fiber ごとの ec からこれに Hash オブジェクトを入れて利用するようです。割とシンプルな方法ですね。 https://github.com/ruby/ruby/pull/6612 [ruby-core:110481] [Feature #19078]