ruby-trunk-changes 2020-12-17

今日は Ractor のための排他処理の追加や MJIT での inline 化する VM 命令の追加などの最適化、reline/irb の更新などがありました。

[359ad4423e] Nobuyoshi Nakada 2020-12-16 11:33:31 UTC

bootstraptest/test_ractor.rb の行末の空白除去。

[47328ad217] Nobuyoshi Nakada 2020-12-16 12:01:45 UTC

f5ca3ff4dbcf5c140a77d1de5ff3fe3eed2d558d の続きで alias でグローバル変数の $1 などの数字の引数への別名を作ろうとした時の alias_error! への引数の間違いを修正。 [ruby-core:101089] [Bug #17345]

[9c859f4b3c] Nobuyoshi Nakada 2020-12-16 13:53:43 UTC

f5ca3ff4dbcf5c140a77d1de5ff3fe3eed2d558d47328ad217ecaf240f0faedac89723dcd6a917ac のさらに続きで alias_error! に渡す token を get_cval() で子ノードを辿ったのを渡してましたが、そのまま渡すようにしています。渡した先で辿ってるのかな。 [ruby-core:101089] [Bug #17345]

[53babf35ef] Takashi Kokubun 2020-12-16 14:24:07 UTC

VM 命令の getconstant を MJIT で JIT コンパイル時に inline 展開をサポートするようにしています。このため inline cache の更新時に mjit worker との間で排他処理するためのロック取得するようにしています。 https://github.com/ruby/ruby/pull/3906

[b29c0fadec] Koichi Sasada 2020-12-16 15:28:48 UTC

include/ruby/internal/intern/load.h に HAVE_RB_EXT_RACTOR_SAFE というマクロ定義を追加しています。特に利用はされてないので、拡張ライブラリで rb_ext_ractor_safe() を使っていいかどうか判定するために使うために追加したみたいです。既に RB_EXT_RACTOR_SAFE() という wrapper マクロがあるから、これが defined かどうかで判定しても良さそうですけどね。

[84c9ebd65f] git 2020-12-16 15:31:09 UTC

version.h の日付更新

[24f018972b] Koichi Sasada 2020-12-16 15:31:14 UTC

ractor_sleep() で割り込みを受けると rb_ractor_t::sync::wait::status がリセットされないので戻して、さらに rb_thread_check_ints() の呼び出しを追加しています。

[d5929b39a9] Marc-Andre Lafortune 2020-12-16 14:57:35 UTC

a9a7f4d8b8ec30abc7a47ce700edc7209ae12279 で追加した Ractor#receive_if を private メソッドにしています。

[c58142134c] Koichi Sasada 2020-12-16 16:29:15 UTC

debug counters のインクリメントが複数の Ractor 間で呼ばれると正しく更新されない可能性があったので、atomic 版の rb_debug_counter_add_atomic() という関数を追加して複数 Ractor 使用時にはこれを呼ぶようにしています。

[2a3324fcd2] Koichi Sasada 2020-12-16 16:56:30 UTC

rb_enc_from_index() に ASCII-8BIT と US-ASCII, UTF-8 のインデックスの時のテーブル参照をスキップするショートカットを追加しています。テーブルの参照にはロック取得が必要になったのでよく使う Encoding でそのオーバーヘッドを避けるためみたいです。

[93ba3ac036] Koichi Sasada 2020-12-16 18:46:44 UTC

gc.c の RGENGC_PROFILE というマクロのデフォルト値を 0 にしています。 79df14c04b452411b9d17e26a398e491bca1a811 の Ractor 導入時に誤って(たぶんデバッグのために?) 1 にしたままになってたみたいです。

[d07183ec85] Takashi Kokubun 2020-12-17 03:43:17 UTC

mjit_recompile() で struct rb_iseq_body::jit_unit が NULL の時に参照してしまってたのでチェックして処理をスキップするようにしています。

[ccf9da079f] d-m-u 2020-12-17 04:20:49 UTC

標準添付ライブラリ uriURI.regexp の rdoc 用コメントの文法修正。

[46ea74297e] Hiroshi SHIBATA 2020-12-17 05:20:42 UTC

拡張ライブラリ json でバージョンを ext/json/VERSION というファイルに記述するようにして gemspec ファイルからこれを読み込むようにしています。またバージョンを 2.4.1 に更新しています。tool/sync_default_gems.rb の同期処理も VERSION ファイルの追加に対応しています。

[a09c3c6fe1] Hiroshi SHIBATA 2020-12-17 05:37:45 UTC

46ea74297eb3e46e19fb692a8d8eef817b93a49b の続きで拡張ライブラリ json の gemspec ファイルで VERSION ファイルを読み込むためのファイルパスの解決方法を __FILE__ を基準にするように修正しています。

[3b4d698e0b] Takashi Kokubun 2020-12-17 06:12:50 UTC

tool/ruby_vm/views/_mjit_compile_pc_and_sp.erb で MJIT の JIT 用の C コード生成する時に pc の変更を出力するかどうかの判定に body->catch_except_p も条件に入れてたのを不要として削っています。C のソースコードを出力する C のソースコードを生成するための ERB のテンプレートなのでややこしいですがこの catch_except_p の判定は ruby プロセス実行時の iseq の情報ですね。

[5d74894f2b] Takashi Kokubun 2020-12-17 06:08:04 UTC

VM 命令の属性の leaf の false という指定に leafness_of_check_ints というのも対応するようにして、この実装の場合は MJIT で命令の実装 で RUBY_VM_CHECK_INTS() マクロを呼ぶ時までに pc の移動を遅延するような C のコードを生成するようにしています。

[9213771817] Koichi Sasada 2020-12-17 06:46:36 UTC

vm_sendish() の最後の引数に関数ポインタを受け取ってたのをやめて enum による定数を渡すようにしています。これにより vm_search_invokeblock() や vm_search_method_wrap() という関数は不要になったので削除して vm_sendish() 内に処理を展開しています。最適化のためかなぁ。

[c42948d784] Koichi Sasada 2020-12-17 08:03:05 UTC

debug counters に GC の各ステップの処理のタウンタを追加しています。

[44fba194a5] Hiroshi SHIBATA 2020-12-17 08:24:51 UTC

tool/sync_default_gems.rb の pathname の同期処理に lib/ のコピーを追加しています。

[99b9145380] Koichi Sasada 2020-12-16 19:06:04 UTC

RGenGC のための write barrier で rgengc_remember() を呼ぶ前後に RB_VM_LOCK_ENTER_NO_BARRIER()/RB_VM_LOCK_LEAVE_NO_BARRIER() での Ractor 間の排他を行なうようにして、かわりに呼び元の rb_gc_writebarrier() でもっと広い範囲でロック取得していたのをやめています。ついでに(?) is_incremental_marking() が真の時のリトライの処理を消しています。こっちは Ractor は関係ないのかな。

[7f11c8086a] Koichi Sasada 2020-12-17 08:20:29 UTC

gc_enter() で起動理由を示す event が gc_enter_event_start または gc_enter_event_mark_continue の時(mark 処理する時)だけ rb_vm_barrier() で全 Ractor を停止させるようにしています。

[da3438a504] Koichi Sasada 2020-12-17 08:29:05 UTC

91793b8967e0531bd1159a8ff0cc7e50739c7620GC.compact 追加時に導入された object_id を解決する cached_object_id() が Ractor 間で競合があるようなので RB_VM_LOCK_ENTER()/RB_VM_LOCK_LEAVE() による排他処理を追加しています。

[d597d7a8b6] Yale Kozinski 2020-11-23 09:17:06 UTC

標準添付ライブラリ reline の Reline::LineEditor#reset_variables で kill_ring を常にリセットしてたのをやめています。リセットしなくていいのかなって感じですが https://github.com/ruby/irb/issues/85 の issue の修正のために必要だったようです。

[9908177857] Nobuyoshi Nakada 2020-12-17 11:06:18 UTC

make test-all のテストで setup で全体的に $VERBOSE をセットして警告抑制していたものを、実際に警告が出てるところで assert_warning で警告そのものをテスト対象にして結果として抑制するようにしています。

[2b8fa78176] aycabta 2020-12-13 02:30:05 UTC

標準添付ライブラリ reline で端末の行数を超える複数行のバッファに対応するようにしているようです。

[0158ba7e51] aycabta 2020-12-16 07:28:51 UTC

標準添付ライブラリ reline でテスト用の(?) 環境変数 RELINE_STDERR_TTY で $stderr を上書きするのに IO#reopen を使っていたのが Windows ではうまくいかないということで Windows 環境では $stderr 変数そのものを新しく open した IO オブジェクトで上書きするようにしています。

[cdf2790aa0] aycabta 2020-12-17 10:57:44 UTC

2b8fa7817643a9ac7632b66ffed7cb5fd3753966 の端末の行数を超える複数行対応の Windows 版での対応漏れを修正しているようです。

[422e2c7274] Robert Schulze 2020-05-05 07:24:52 UTC

標準添付ライブラリ reline で freeze されてない文字列を作るのに String.new を使ってたのを String#@+ を使って +"" のようなリテラルに + をつけたのを使うようにしています。

[cbf6a7f906] Nobuhiro IMAI 2020-11-20 23:40:31 UTC

標準添付ライブラリ irbIRB::RubyLex#ripper_lex_without_warning で Ripper::Lexer#lex が空配列を返すまで繰り返し呼ぶようにしています。といっても通常1回で最後までの token をまとめて返すので、実際にはエラーになって欲しいのにエラーにならないケースで irb のブロックのネストが解除されない不具合修正のため空配列が返ってきたら抜けるようにするためみたいです。 [Feature #17276] の修正で Ripper::Lex が SyntaxError になるスクリプトでも最後まで token を返すようになったのに関係してるみたいですが、たぶんそっちが直ればこの変更は不要だったのでしょう(けど独立した gem としてもリリースされるので古い ruby のために必要)。 https://github.com/ruby/irb/issues/38

[b5effe07bd] Nobuyoshi Nakada 2020-11-22 13:03:09 UTC

lib/irb/ruby-lex.rb のコメントの typo 修正。

[336fe648b0] Benoit Daloze 2020-11-05 17:13:56 UTC

irb のテストで TruffleRuby で動かないものを RUBY_ENGINE をチェックして skip するようにしています。

[753222d72c] Jeremy Evans 2020-12-08 16:56:01 UTC

irb の -W/-w オプションの指定時に $VERBOSE だけでなく Warning[:deprecated] のカテゴリの警告有無も同時に変更するようにしています。 ruby のオプションと同様の挙動をさせるようにするためですね。 [ruby-core:101315] [Bug #17377]

[980f994b3b] Marc-Andre Lafortune 2020-11-20 21:58:02 UTC

標準添付ライブラリ irbIRB::CONF[:CONTEXT_MODE] に 4 というモードを新設してスクリプトを評価するのに使う Binding に TOPLEVEL_BINDING そのもののではなく dup したものを使うようにしています。 irb コマンドで sub-irb を起動するたびに Binding を分けるためみたいです。てことはローカル変数は sub irb には引き継がれなくなるのか……と思ったけど元から引き継がれてなかった。