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 を削っています。