ruby-trunk-changes r67332 - r67337

今日は昨日に続いてメソッド呼び出しの引数のパターンに応じて positional な引数とキーワード引数のみの時の最適化などがありました。

shirosaki: r67332 2019-03-21 22:32:03 +0900

なにが起きてたのかちょっとよくわかってないのですが Windows で Dir.glob の引数に {} ではじまるパターンが指定された時に結果からドライブレターの部分が消えてしまう? という不具合があったのを修正しています。 [ruby-core:91728] [Bug #15649]

ko1: r67333 2019-03-22 09:21:41 +0900

昨日の r67315 と同様に、メソッド呼び出しの引数準備でメソッド定義の仮引数が lead と keyword 引数だけだった時に専用の vm_call_iseq_setup_kwparm_kwarg() および vm_call_iseq_setup_kwparm_nokwarg() という関数を用意して setup_parameters_complex() の呼び出しを避けるという最適化です。2つの関数は実際に呼び出し時にキーワード引数が渡されたか省略されたかという違いです。

svn: r67334 2019-03-22 09:21:43 +0900

r67333 のインデントのタブを空白に展開。

svn: r67335 2019-03-22 09:21:44 +0900

version.h の日付更新。

ko1: r67336 2019-03-22 16:57:26 +0900

debug counters にメソッド呼び出したのめの関数群(vm_call_xxx() めっちゃいっぱいある)ごとのカウンターを追加しています。どれが実際のアプリで頻繁に使われるのかというのを調べて最適化の優先度をつけようってことだと思われます。

nobu: r67337 2019-03-22 20:04:59 +0900

組み込みクラス全体的に rdoc 用コメントのモジュール名/クラス名の明示的なマークアップを消して cross reference を有効にしたり引数名はアンダースコアで囲むなどマークアップまわりの修正をしています。

ruby-trunk-changes r67315 - r67331

今日は引数がシンプルなメソッドの呼び出しの最適化やその変更の MJIT 対応などがありました。

ko1: r67315 2019-03-21 04:57:39 +0900

メソッド呼び出しの処理で、メソッドの引数が lead と optional だけだった時向けの最適化を導入しています。 lead parameters って耳慣れないなと思ったのですが(必須の引数のことはよく positional と言うので)、そういえば ruby のメソッド引数はちょっと前から `def meth(a1, a2, *middle, b1, b2)` みたいに rest 引数の後にも positional 引数を置けるようになってたんでした。すっかり忘れてた。なので lead と optional だけということは `def meth(a, b=nil)` のような感じで省略可能な引数はあるけど rest 引数やキーワード引数はないっていうものですね。実装はメソッド呼び出しの引数準備をしてる vm_callee_setup_arg() で仮引数の種類をチェックして lead と optional だけかチェックし、その時に専用の簡易化した vm_call_iseq_setup_normal_opt_start() という関数を利用するようにしています。コミットログにあるベンチマークによると面白いのは、vm_call_iseq_setup_normal_opt_start() を導入しなくても lead と optional だけかチェックして setup_parameters_complex() の呼び出しを抑制するだけでも効果がある(というかむしろこちらのほうが効果が高そう)ということでした。

svn: r67316 2019-03-21 04:57:43 +0900

r67315 のインデントのタブを空白に展開。

svn: r67317 2019-03-21 04:57:44 +0900

version.h の日付更新。

ko1: r67318 2019-03-21 05:26:21 +0900

r67315 の変更で警告除去のため明示的なキャストを追加しています。

ko1: r67319 2019-03-21 05:37:03 +0900

r67315 の lead と optional の引数のみかチェックしてるところでキーワード引数の展開の有無のチェックは外の分岐でチェック済みなので削っています。

hsbt: r67320 2019-03-21 08:32:11 +0900

Enumerator::Lazy の rdoc 用コメントを全体的に追加しています。 [ruby-core:91046] [Misc #15529]

kazu: r67321 2019-03-21 12:24:59 +0900

.editorconfig を整理して重複してた設定を削除したりしています。

k0kubun: r67322 2019-03-21 13:47:59 +0900

MJIT のテストで mswin 向けに調査のためのメッセージ出力を追加しています。

k0kubun: r67323 2019-03-21 13:49:45 +0900

r67322 で追加した MJIT のテストでのデバッグメッセージを作ってるところにコメントを追加しています。

k0kubun: r67324 2019-03-21 14:30:27 +0900

azure-pipelines.yml の vs2017 のビルド時に vcpkg で openssl, readline, zlib などの依存パッケージをインストールする時に何度かリトライするようにしています。

k0kubun: r67325 2019-03-21 14:44:26 +0900

r67322 の MJIT のテストのデバッグメッセージで JIT コンパイルのためにコンパイラを起動した時の標準エラー出力では情報が足りなかったので標準出力も取得するようにしています。

mame: r67326 2019-03-21 14:59:14 +0900

backtrace 内で to_enum で Enumerator 化されたメソッドの行番号がずれていたのを修正しています。 int のところに INT2FIX() で変換したものを入れてましたね。 [ruby-core:91911] [Bug #15719]

svn: r67327 2019-03-21 14:59:16 +0900

r67326 のインデントのタブを空白に展開。

k0kubun: r67328 2019-03-21 14:59:57 +0900

r67315 の最適化で導入した lead と optional の引数だけか確認する関数 rb_iseq_only_optparam_p() を static 関数として宣言するように修正しています。 mswin での MJIT のビルドに影響があったみたいです。

k0kubun: r67329 2019-03-21 15:25:09 +0900

mjit_compile.c と vm_insnhelper.c で引数の実引数の情報をチェックする部分を vm_call_iseq_optimizable_p() という関数に切り出して vm_insnhelper.h に定義しています。

k0kubun: r67330 2019-03-21 15:48:00 +0900

mjit_compile.c の inlinable_iseq_p() という関数で仮引数の lead parameter 数と実引数の数のチェックを追加しています。

nobu: r67331 2019-03-21 21:01:36 +0900

r67311 と同様に Array#max と Array#min の rdoc 用コメントでもモジュール名を <code> タグでマークアップしてたのをやめて cross reference が有効になるようにしています。

ruby-trunk-changes r67308 - r67314

今日は主にドキュメントの追加修正などがありました。

nobu: r67308 2019-03-20 09:31:02 +0900

parse.y のトークン tNUMPARAM の型(っていうのか?)を整数から ID に変更しています。アクション部での numparam_id() の呼び出しを不要にして、parser_numbered_param() で事前に ID 化しておくようにしています。

svn: r67309 2019-03-20 09:31:13 +0900

version.h の日付更新。

nobu: r67310 2019-03-20 10:17:16 +0900

String#crypt の rdoc 用コメントのインデントの修正。rdoc でフォーマットした時に引用みたいなやつになってしまってたみたいです。

nobu: r67311 2019-03-20 10:31:44 +0900

string.c の rdoc 用コメントでクラス名などを <code> タグで明示的にマークアップしていたのをやめています。クラス名は cross references としてリンクはられるのでマークアップは不要なばかりかリンクが抑制されてしまってむしろ有害だということみたいです。

nobu: r67312 2019-03-20 10:35:27 +0900

String#% メソッドの Kernel#sprintf の参照の記法を Kernel::sprintf から修正しています。

hsbt: r67313 2019-03-20 11:08:34 +0900

TracePoint#enable の rdoc 用コメントを vm_trace.c から prelude.rb のメソッド定義の前に移動して、内容も target と target_line キーワード引数についての説明も追記しています。 [ruby-core:90801]
[Bug #15484]

nobu: r67314 2019-03-20 13:24:42 +0900

r67313 の続きで、rdoc にメソッドのドキュメントとして認識させるために #if 0 でコメントアウトされた状態で書かれてた TracePoint#enable のメソッド定義にみせかけた rb_define_method() は不要になったので削除しています。

ruby-trunk-changes r67295 - r67307

今日は MJIT の inline cache コピー処理のリファクタリングのリベンジや Numbered parameter 導入に関連して ripper の対応の追加などがありました。

nobu: r67295 2019-03-18 21:48:18 +0900

lambda の ->() 記法による定義で numbered parameter による参照がある時に引数を渡すと、引数の数の不一致による ArgumentError が発生する不具合を修正しています。 [ruby-core:91859] [Bug #15672]

k0kubun: r67296 2019-03-18 23:01:52 +0900

r67287 の MJIT worker に main thread から inline cache 情報をコピーする処理のリファクタリング(mjit_worker から関連するコードを copy_cache_from_main_thread() に集める)のやりなおし。コミットログによると mswin ではなぜか ポインタのポインタを関数に渡してそこに書き戻すのがうまくいかないとのことで、mjit_copy_job_result_t という構造体を定義して copy_cache_from_main_thread() の戻り値をこの構造体にして返り値として複数の値を直接返すようにしています。

k0kubun: r67297 2019-03-19 01:14:57 +0900

が r67296 もやっぱり CI でエラーになってしまったそうで revert しています。

svn: r67298 2019-03-19 01:14:59 +0900

version.h の日付更新。

k0kubun: r67299 2019-03-19 01:32:48 +0900

r67291 で revert した r67287 と r67288 のリトライ。関数から戻す値に alloca() で確保した領域を使ってしまっていたため、関数から抜けるとその領域へのアクセスは不正になってしまっていました。 malloc(3) でメモリ確保して mjit_compile() (r67288 の変更も同時に再適用されてるので呼び元が mjit_worker() から mjit_compile() に変更になってる)で free() するようにしています。

k0kubun: r67300 2019-03-19 02:20:21 +0900

で r67299 の続きで呼び元の mjit_compile() で alloca() でメモリ領域を確保して、copy_cache_from_main_thread() で外からそのポインタを引数に渡すように変更して malloc() をやめています。 r67299 は deadlock に陥る可能性があったみたいです。

k0kubun: r67301 2019-03-19 02:28:23 +0900

r67299 および r67300 のさらに続きで stack_size_for_pos というメンバーのメモリ領域にも malloc() のかわりに alloca() を使うようにしています。

k0kubun: r67302 2019-03-19 02:45:10 +0900

mjit_compile() の構造体 struct compile_status の変数の初期化に、各メンバーに代入する記法のかわりに メンバー名を指定した初期化子を使う記法を使うように変更しています。これも C99 なのか。

nobu: r67304 2019-03-19 11:25:15 +0900

拡張ライブラリ ripper に ripper#debug_output および ripper#debug_output= というメソッドを追加して、デバッグメッセージの出力先を変更できるようにしています。デフォルトは stdout みたいです。 IO オブジェクトを期待しているようですね。 StringIO とかも大丈夫なのかな。ざっとチェックしてみた限りだと write メソッドと flush メソッドに反応できればよさそうなので大丈夫そうですね。

nobu: r67305 2019-03-19 11:35:50 +0900

拡張ライブラリ ripper でデバッグメッセージに含める変数名などの変換で SEGV することがあったのを修正しています。このテストを書くために Ripper#debug_output を設定できるようにしたんですね。

nobu: r67306 2019-03-19 15:01:21 +0900

拡張ライブラリ ripper で numbered parameter を含む文法がうまく parse できていなかった不具合を修正しています。 numparam_id() の呼び出しがアクション部の本体側のところでだけ行なわれていたので、共通部分で呼び出して ripper 用の部分での処理も適宜追加しています。 [ruby-core:91867] [Bug #15673]

nobu: r67307 2019-03-19 15:23:36 +0900

r67306 の再修正。 parse.y で ripper で numbered parameter を処理した時のイベントから冗長な(?) number_arg を削っています。

ruby-trunk-changes r67282 - r67294

今日は $ や @ ではじまる変数名の不正な名前のエラー処理の修正や MJIT が worker に inline cache をコピーする処理のリファクタリングなどがありました。

kazu: r67282 2019-03-17 22:51:30 +0900

r67279 の NEWS 追記の typo 修正。

kazu: r67283 2019-03-18 01:32:49 +0900

mjit.c のコメントの typo 修正。

svn: r67284 2019-03-18 01:32:51 +0900

version.h の日付更新。

kazu: r67285 2019-03-18 01:35:20 +0900

mjit_worker.c のコメントの typo 修正。

k0kubun: r67286 2019-03-18 02:12:47 +0900

MJIT の JIT コンパイル時に inline cache 情報を mjit worker にコピーするための機構の構造体 mjit_copy_job_t から struct rb_mjit_unit を削除しかわりに rb_iseq_t を直接格納するようにしています。また C99 を利用可能になったので mjit.c や mjit_worker.c で変数の宣言をブロックの途中でするようにリファクタリングしています。

k0kubun: r67287 2019-03-18 03:07:06 +0900

MJIT の inline cache のコピーの処理の一部を mjit_worker() から copy_cache_from_main_thread() に移動して関連処理を copy_cache_from_main_thread() の中にかためておくように? リファクタリングしています。

k0kubun: r67288 2019-03-18 03:29:30 +0900

r67286 および r67287 のリファクタリングを経て copy_cache_from_main_thread() を mjit_copy_cache_from_main_thread() に改名して呼ぶのを mjit_worker() から mjit_compile() に移動し、JIT Compile 時に inline cache を取得するように遅延しています。

nobu: r67289 2019-03-18 10:18:25 +0900

r67278 の Numbered parameter 実装で parse_atmark() に追加したチェックを parser_numbered_param() という関数に切り出すリファクタリング

nobu: r67290 2019-03-18 10:42:20 +0900

構造体 struct rb_iseq_constant_body のメンバーの順序を入れ換えてサイズ縮小を図っています。 https://github.com/ruby/ruby/pull/2099

k0kubun: r67291 2019-03-18 10:52:45 +0900

r67287 と r67288 を revert しています。 CI が失敗したとのこと。

nobu: r67292 2019-03-18 15:42:19 +0900

parse.y のグローバル変数($ ではじまる変数)や @ ではじまる変数を parse する関数で不正な名前だった時に return 0 してたのを、yylval.id に keyword_nil をセットしておいてトークンは返すようにしています。よくわかりませんが、コミットログもあわせて読むと、実際には終端ではないのに "unexpected end-of-file" というエラーメッセージが出るのを修正していると思われます。

k0kubun: r67293 2019-03-18 20:46:21 +0900

rubygems のテストで通信エラー類を skip 扱いにするところで捕捉する例外に SocketError も追加しています。 CI でたまにこの例外でエラーになるとのこと。 https://github.com/rubygems/rubygems/pull/2684

k0kubun: r67294 2019-03-18 21:07:21 +0900

r67281 の .travis.yml で ~/.download-cache や ~/config_2nd を削除するようにしたのを revert しています。 CI のエラー回避に効果がなかったとのこと。

ruby-trunk-changes r67273 - r67281

今日はブロックパラメーターを名前でなく番号を指定して @1, @2 などの記法で参照する Numbered parameters という新文法の追加などがありました。

k0kubun: r67273 2019-03-17 01:26:44 +0900

azure-pipelines.yml に pr: none という設定を追加して pull request に対するビルドを抑制するようにしています。

svn: r67274 2019-03-17 01:26:46 +0900

version.h の日付更新。

k0kubun: r67275 2019-03-17 01:53:55 +0900

azure-pipelines.yml で make test-bundled-gems が一時的にエラーになる状態(power_assert.gem の更新待ち?)なので、continueOnError: true を追加してエラーを許容するようにしています。

k0kubun: r67276 2019-03-17 13:13:13 +0900

appveyor.yml の JSON で Hash (JSON だから object か) の最後の要素の後にカンマがあったので削っています。

k0kubun: r67277 2019-03-17 14:13:38 +0900

MJIT の動作を指定するオプション --jit-max-cache と --jit-min-calls のデフォルト値を変更して、JIT コンパイルした状態を保持するメソッド数を減らし(1000 -> 100)、JIT 対象にするまでの呼び出し回数を引き上げています(5 -> 10000)。メモリ使用量の抑制と、特に後者はヘビーに呼ばれるメソッドだけ JIT コンパイル対象にしてあまり呼ばれないメソッドの JIT コンパイルを抑制してパフォーマンスへの影響を抑えるためだと思われます。これによりプロセス起動直後の高負荷がすこし解消されるのではないでしょうか。

nobu: r67278 2019-03-17 14:21:18 +0900

Numbered parameters という名前でブロックパラメーターに明示的に do |a, b| ... end のように名前が付けられてなくても @1, @2 という番号による参照ができる新機能が追加されています。配列は自動的に splat されて分解した各要素が参照されるようです。つまり `:x, :y.map{ @1 }` は [:x, :y] ではなくて [:x] を返します。 ここはちょっと注意ですね。 [ruby-core:91470] [Feature #4475]

k0kubun: r67279 2019-03-17 14:28:54 +0900

NEWS ファイルに r67277 での --jit-max-cache と --jit-min-calls のデフォルト値の変更について追記しています。

k0kubun: r67280 2019-03-17 14:32:53 +0900

azure-pipelines.yml の checkout 時のオプション fetchDepth を 1 から 10 に増やしています。 depth が 1 だとたまに checkout がエラーになるため。エラーメッセージみた感じだと commit が連続してたりして checkout しようとした commit hash よりも trunk が進んでたりすると depth が 1 だと狙った commit が参照できないとかそういうことみたいですね。

k0kubun: r67281 2019-03-17 15:20:01 +0900

.travis.yml に環境変数 DISABLE_CACHE の定義を追加して、この環境変数が新だったらビルド前に .downloaded-cache および config_2nd を削除しておくようにしています。よくわからないけどこのへんのファイルで権限エラーになることがあるみたいです。

ruby-trunk-changes r67269 - r67272

今日は主に AppVeyor のビルド設定の修正と ripper が dynamic symbol に対して返すノードの種類の変更などがありました。

k0kubun: r67269 2019-03-15 22:25:06 +0900

appveeyor.yml で zlib のライブラリをダウンロードするための curl のリトライ回数を 5 から 10 に増やしています。 5 でも失敗したことがあったとのこと。

ktsj: r67270 2019-03-16 13:00:14 +0900

拡張ライブラリ ripper で :"sym" のようなクオートつきの Symbol リテラル(なのかな)を parse すると :xstring_contents というノードとして処理していましたが string_contents に変更しています。Hash リテラルの { "sym": value } みたいな時のキーが string なのでそれに合わせたとのこと。 [ruby-core:91852] [Bug #15670]

svn: r67271 2019-03-16 13:00:30 +0900

version.h の日付更新。

k0kubun: r67272 2019-03-16 13:11:54 +0900

appveyor.yml の通知に関するセクションを slack の複数のチャンネルに送信するように設定を追加しています。