ruby-trunk-changes 2020-12-16

今日は拡張ライブラリ ripper の不具合修正、Enumerable#grep, #grep_v の最適化、インスタンス変数のセットの最適化、MJIT の不具合修正、Ractor#receive_if の追加など多くの変更がありました。

[e0bdd54348] Nobuyoshi Nakada 2020-12-15 05:14:13 UTC

拡張ライブラリ ripper で予約語への代入という文法エラーのあるスクリプトを parse させても raise_errors キーワード引数を真に指定してても例外が発生しないという不具合を修正しています。 [ruby-core:101089] [Bug #17345]

[4d43ac2fb9] Zoltán Mizsei 2020-10-29 21:49:17 UTC

configure の Fiber 実装のための coroutine の実装を選択する部分で Haiku という BSD 系の OS で copy 版の実装を選択するようにしています。

[9542321584] Zoltán Mizsei 2020-10-29 21:49:45 UTC

同じく configure でコンパイラオプション -fstack-protector の有無を指定するのに Haiku では付けないようにする指定を追加(復活?)しています。

[8f6cb5b70b] Zoltán Mizsei 2020-10-29 21:47:24 UTC

拡張ライブラリ fiddle のテストで Haiku 向けの libc/libm のファイルパスを指定する処理を追加しています。

[289d42c932] Nobuyoshi Nakada 2020-12-15 14:43:08 UTC

make_io_zombie() で make_zombie() の引数に渡す関数ポインタのキャストが不要として削って、また関数名も rb_io_fptr_finalize はマクロで rb_io_fptr_finalize_internal() の別名として定義されてるものだったので展開後の rb_io_fptr_finalize_internal のほうを使うようにしています。

[efc6a4e580] git 2020-12-15 15:04:59 UTC

version.h の日付更新

[a039dc018c] Nobuyoshi Nakada 2020-12-15 15:07:37 UTC

Kernel#Integer() が前後に空白を含む文字列でもエラーにしないことについて rdoc 用コメントに追記しています。 [ruby-core:101464] [Bug #17395]

[d5f0d338c7] Marc-Andre Lafortune 2020-12-09 02:20:37 UTC

Enumerable#grep と Enumerable#grep_v で引数に正規表現(Regexp オブジェクト)が渡されてブロックが渡されてない場合には内部でのメソッド呼び出しは行なわず rb_reg_match_p() を直接呼ぶように最適化しています。 [ruby-core:99156] [Bug #17030]

[8558d5e480] Marc-Andre Lafortune 2020-12-15 22:05:35 UTC

Hash#transform_keys および Hash#transform_keys! の rdoc 用コメントに引数に Hash を渡した場合の仕様について追記しています。

[ccc828f499] 卜部昌平 2020-12-15 07:57:28 UTC

configure での CXX の指定の検出について、ruby 本体のビルド時に C++ 用のコンパイラがないと CXX が設定されなくなっているため、C++ を使う拡張ライブラリのビルドもできなくなる(C++ コンパイラがある環境でも?)という問題があるらしく、autoconf はもともとそういう時に CXX=g++ をセットするみたいなのですが 50b18e81295ad2d45975e4d8ea1e0c7e85140b97 でその挙動をやめさせてたのがそういう場合の問題になるそうなので元の挙動に戻しているようです。そのかわり C++ 用ヘッダのテストをやめさせるために専用の変数を使うようにしています。 [ruby-core:100971] [Bug #17337]

[dff67c809f] Koichi Sasada 2020-12-16 01:29:48 UTC

d7581370fd7cef8743c317a1a119215cf064bb73 で追加された benchmark の名称の重複を修正。

[171f0431e7] Koichi Sasada 2020-12-16 01:36:23 UTC

72a73691bd069c20f07a42bbd2740ada319ee001 で追加というか分離した関数 vm_search_method_swlopath0() の typo を修正して vm_search_method_slowpath0() に改名しています。

[0b678cc9e5] Koichi Sasada 2020-12-16 01:10:05 UTC

debug counters に vm_sync_xxxx という項目群を追加しています。 Ractor 間の同期のための排他処理関連のカウンタのようです。

[cfefd1e524] Hiroshi SHIBATA 2020-12-16 02:26:26 UTC

NEWS に webrick が標準添付ライブラリからはずれたことについて追記しています。

[ad8e82f708] Nobuyoshi Nakada 2020-12-16 03:31:40 UTC

Process::Status が最近の変更で T_OBJECT から T_TYPEDDATA に変化してインスタンス変数を使わなくなったために Marshal.dump した時のバイナリに互換性がなくなってたそうなので、互換性のために Marshal 用の dump/load 関数を追加しています。あれ、なんで T_OBJECT やめる必要があったんだろう。

[5499651ee7] Koichi Sasada 2020-12-16 03:03:36 UTC

インスタンス変数へのセットで inline cache を活用してテーブルの index を特定するショートカットを追加して最適化しています。従来の実装は vm_setivar_slowpath() という関数に括り出されています。

[1e11c12a06] Koichi Sasada 2020-12-16 04:30:34 UTC

5499651ee75538a4d8a3bb4a7442f5f59f36acd8 で追加したけど使ってない rb_vm_setivar() という関数を削除しています。

[1bafb3cb47] Kenta Murata 2020-12-16 04:43:56 UTC

MemoryView の実装の各所に RB_VM_LOCK_ENTER()/RB_VM_LOCK_LEAVE() を追加して複数 Ractor から利用可能なようにしています。 https://github.com/ruby/ruby/pull/3911

[98dca85573] Koichi Sasada 2020-12-16 05:13:32 UTC

5499651ee75538a4d8a3bb4a7442f5f59f36acd8 で分離した vm_setivar_slowpath() をさらに is_attr の有無で vm_setivar_slowpath_ivar() と vm_setivar_slowpath_attr() という wrapper 関数を導入しています。vm_setivar_slowpath() は inline 化されるようにして wrapper 関数のほうは常に inline 化させないような指定をしているので、コンパイラになんらかの最適化を促してるのかなぁ。

[19157a3c00] David CARLIER 2020-12-16 06:32:11 UTC

rb_bug() などでダンプするレジスタの情報などに ARM のサポートを追加しています。 https://github.com/ruby/ruby/pull/3900

[c668772b14] Yusuke Endoh 2020-12-16 07:17:54 UTC

d5f0d338c7b5d3d64929b51d29061d369550e8c4 で追加した Enumerable#grep のテストで用意した ML 番号の参照のメッセージ用の変数が使われてなくて警告が出てたので、assertion のメッセージに使うように修正しています。

[0a52161872] Koichi Sasada 2020-12-16 08:18:07 UTC

Ractor#receive で引数に渡す Ractor の取得に RACTOR_PTR() を使ってたのを rb_ec_ractor_ptr() で呼び元の Ractor を渡すように修正しています。

[5d8f227d0e] Takashi Kokubun 2020-12-16 07:14:02 UTC

MJIT の JIT unit のリストからの削除を mjit.c の mjit_recompile() で行なっていた部分が mjit_worker の thread との競合があったみたいで、この場で削除はせずに struct rb_mjit_unit::stale_p というメンバーを新設してこのフラグを立てておくようにして、実際の削除は mjit_worker() でフラグをみて実施させるようにしています。compile_compact_jit_code() で JIT unit のリストの操作の排他処理をしてたところと関連した SEGV の修正みたいです。

[4fe7f270ce] Nobuyoshi Nakada 2020-12-16 08:39:23 UTC

GitHub Actions の MJIT 用の workflow で 6e84af2fa9c5986d9717bfdfe70c88f402742f5c で shell 毎に効く ulimit の呼び出しを 1つのステップごとに呼ぶようにしたので step 名がどれも ulimit になっちゃったみたいで、明示的に名前をつけるように設定ファイルを修正しています。

[8b32191a31] Nobuyoshi Nakada 2020-12-15 14:17:23 UTC

open_load_file() で fd の O_NONBLOCK フラグを落とすための fcntl(2) が ENOTSUP を返した場合にはエラーを無視させるようにしています。サポートされてないってことは呼ぶ必要もなかったってことかな。

[5193fbb6d0] Nobuyoshi Nakada 2020-12-16 08:00:04 UTC

既に存在していない rb_w32_pipe_exec() の prototype 宣言を include/ruby/win32.h から削除しています。

[ddb93c3d64] Nobuyoshi Nakada 2020-12-16 08:05:39 UTC

LARGEFILE_SUPPORT というマクロでファイルサイズを返す型を 64bit で表現できるかどうかを制御してたのはもう不要で常に 1 にしていたのでマクロとその分岐を削除しています。

[a9a7f4d8b8] Koichi Sasada 2020-12-08 05:04:18 UTC

Ractor#receive_if というメソッドを追加して条件にマッチするオブジェクトのみ受信キューから取り出すことができるようにしています。条件のマッチはブロックを渡してそのブロックが真値を返したかどうかで判定するようです。 [ruby-core:101317] [Feature #17378]