ruby-trunk-changes 2019-09-04

今日は MJIT で JIT コンパイルしたコードでのインスタンス変数代入が freeze フラグを考慮してなかった不具合の修正やキーワード引数回りの調整の続き、C からのメソッド呼び出しで呼び元にキャッシュ保持させる C API rb_funcallv_with_cc() の追加などがありました。

[ecc37ee67b] Takashi Kokubun 2019-09-03 12:38:32 UTC

MJIT の VM 命令を網羅する用のテストで bitblt や answer など SUPPORT_JOKE 有効化時にのみ実装される命令や reput, tracecoverage といった VM 最適化などの設定時のみ使われる命令を除外するようにしています。 RubyVM::INSTRUCTION_NAMES と突きあわせて実際にはそのインタプリタのビルドでは存在しない命令を使おうとしてたら警告を出力するようにしています。

[fb67d4fc77] Takashi Kokubun 2019-09-03 12:49:51 UTC

bootstraptest にある sleep 中の Thread の Thread#backtrace 呼び出しのテストが AppVeyor の mswin 環境で不安定とのことで pending.rb に移動しています。

[e94ac03eb0] Jeremy Evans 2019-08-08 20:09:17 UTC

83498854eb5a824f1f83c31fac18c9279f9ee10d で一度入れて 6724b1f83d2cad57bbcbcdc9756532d825b0c592 で revert された Enumerator::Lazy#with_index が Enumerator::Lazy を返すようにする変更のリトライ。 このコミットは 83498854eb5a824f1f83c31fac18c9279f9ee10d と全く同じ内容ですね。 [ruby-dev:47025] [Bug #7877]

[4a3972c261] Jeremy Evans 2019-09-02 20:20:44 UTC

e94ac03eb0d07af3cbff20194acf479bf8851c39 に追加して rubyspec の Enumerator::Lazy に with_index はじめ each_xxx や cycle などのメソッドが直接定義されていないという assertion があったのを削除しています。 [ruby-dev:47025] [Bug #7877]

[a7d7a0df91] Jeremy Evans 2019-09-02 20:22:26 UTC

Enumerator::Lazy#to_enum や #enum_for などのメソッドにメソッドを示す Symbol を渡した時に、そのメソッドが Enumerator::Lazy で直接定義されてないメソッドの場合うまく動作しないという不具合? があり、どう直していいものかよくわからないので workaround 的に Enumerator::Lazy に Enumerable のメソッド群の alias を作って、内部的にそっちにすりかえて使うという力技な修正をしています。 "it is a band-aid, not a real fix. " と書いてあるとおりとりあえず応急処置的修正みたいですが、本格的にはどう直すのかなぁ。というかなんでこれ動かないんだろ。method entry とかを取ってきてるわけじゃなくて Symbol のまま渡してるのにな。

[f702cd6ace] git 2019-09-03 18:31:11 UTC

version.h の日付更新

[39c3252cd1] Jeremy Evans 2019-09-03 18:32:02 UTC

VM の control stack frame のフラグに VM_FRAME_FLAG_CFRAME_KW というのを追加して、これをみてキーワード引数が渡されたかどうかを判定する rb_keyword_given_p() という C API を追加しています。 keyword splat だけでなく普通の keyword 引数を渡しても真になるようです。 https://github.com/ruby/ruby/pull/2422

[77596fb7a9] Jeremy Evans 2019-09-03 21:02:24 UTC

Struct.new に空の Hash を渡した時に、作られた Class の new メソッドにキーワード引数を受け付ける設定を有効にしないようにしています。ややこしいっていうか言葉で説明するの難しい!!

[c14b67b2a8] Takashi Kokubun 2019-09-04 01:53:20 UTC

VM 命令 setinstancevariable で対象のオブジェクトが freeze されているかどうかのチェックが MJIT で生成されたコードだと省かれてしまっていた不具合を修正しています。 [ruby-core:94767] [Bug #16139]

[b0d0b850bc] Kazuhiro NISHIYAMA 2019-09-04 02:50:37 UTC

GitHub Actions で make test-all に渡すオプションの指定を環境変数で渡す時に TESTOPTS ではなく RUBY_TESTOPTS で渡すようにしています。 make に直接変数で指定する時は TESTOPTS でいけるけど環境変数の時は RUBY_TESTOPTS らしい。

[1e30d0af7d] Kazuhiro NISHIYAMA 2019-09-04 03:03:28 UTC

b0d0b850bc61e158fb7caac4123af824b12938f1 の続きで GitHub Actions でオプションを渡すのに環境変数を使うのをやめて make のコマンドラインで直接変数を指定するようにしています。 $JOBS という変数の展開が環境変数内ではうまくいかなかったとのこと。

[967ef0d4f6] Kazuhiro NISHIYAMA 2019-09-04 03:36:45 UTC

tool/fetch-bundled_gems.rb で現在 master ブランチだったら git pull して現在のブランチも更新するようにしています。

[ccad34f453] Kazuhiro NISHIYAMA 2019-09-04 03:51:39 UTC

GitHub Actions の macOSUbuntu 環境で make test-bundled-gems 実行時に TEST_BUNDLED_GEMS_ALLOW_FAILURES=minitest を渡すようにして minitest のテスト失敗を無視させるようにしています。

[2a6457b5b7] "Urabe, Shyouhei" 2018-10-11 02:47:49 UTC

rb_funcallv_with_cc() というメソッド呼び出し用の C API を追加して、呼び元に ID や rb_callable_method_entry_t を wrap した構造体へのポインタを opaque なポインタとして返してキャッシュさせることができるようにしています。呼び元毎に rb_callable_method_entry() で解決した method entry のキャッシュを持てるようにしています。 ZALLOC() で確保されてるので必要なら解放しないといけないけど、まあこのくらいはプロセス修了まで保持したままにするんでしょうね。

[1d4bd229b8] Akinori MUSHA 2019-06-05 11:39:21 UTC

Enumerator::Lazy#eager メソッドを追加しています。 to_a の alias かと思ったらそうではなくて、Enumerator 返したいけど Lazy ではない Enumerator を返したい、という時に使うものみたいです。どういう時なのかはいまひとつよくわかってないですけど。 [ruby-core:92978] [Feature #15901]

[f6da4a5447] Akinori MUSHA 2019-09-04 07:07:40 UTC

Enumerator::Lazy クラスの rdoc 用コメントに 1d4bd229b898671328c2a942b04f08065c640c28 で追加した Enumerator::Lazy#eager の使用例について追記しています。ちょっとわかった気がする。 Enumerator を期待しているところに Lazy に評価するものを渡したいってことですかね。 Lazy 使わなくてもできそうな気もするけど Lazy だと普通の Enumerable と同様に書けるっていうのがメリットなのでってことでしょうか。