ruby-trunk-changes r64293 - r64318

今日も rubyspec の socket のテストのプラットフォーム依存の失敗の対応や MJIT の worker thread 用関数から GC を起動させないようにする修正などがありました。

nobu: r64293 2018-08-11 22:18:55 +0900

WindowsVista および Windows Server 2008 以降では環境変数に使える文字数に制限がなくなっているため _WIN32_WINNT でバージョンをチェックして制限をチェックしないようにしています。 [ruby-core:88400] [Bug #14979]

nobu: r64294 2018-08-11 22:28:40 +0900

configure の --with-winnt-version のデフォルト値を 0x501 から 0x600 に更新しています。あれ、でも Windows だと configure.ac は使われないんじゃないのかな。 win32/Makefile.sub に config.h を生成するルールがあるし。なんでここにこんなオプションがあるんだろう。
[追記]mingw 用だったようです。なるほど。[/追記]

k0kubun: r64295 2018-08-11 22:31:10 +0900

r64271 や r64278 で GC.stress = true の状態での RubyVM::InstructionSequence.load のテストのタイムアウトを伸ばしていましたが、環境変数 RUBY_TEST_SUBPROCESS_TIMEOUT_SCALE で一律子プロセスを使うテストのタイムアウトを伸ばすのを使うようにすべきということで、ここでのタイムアウトは 30 に戻しています。

naruse: r64296 2018-08-11 22:31:43 +0900

rubyspec の socket のテストで Solaris で通せないものを platform_is_not の guard に追加しています。

naruse: r64297 2018-08-11 22:43:31 +0900

さらに rubyspec の socket のテストで Solaris 10 で通せないものにも platform_is_not を追加。このプラットフォームの指定に solaris2.10 なんて指定もできるんですね。

k0kubun: r64298 2018-08-11 23:05:34 +0900

MJIT 関係の警告を出力するのに --mjit-verbose などのオプションを考慮するように verbose() 内に分岐を追加してたのを mjit_warning() という専用の関数を追加してこっちを呼ぶように変えています。また各所で mjit_opts をチェックして fprintf(3) していたのもこの mjit_warning() を呼ぶようにリファクタリングしています。

k0kubun: r64299 2018-08-11 23:09:26 +0900

RubyVM::MJIT.pause のテストが mswin の CI で失敗しているそうで、詳細の調査のためエラー時に子プロセスの出力をメッセージに含めるようにしています。

nobu: r64300 2018-08-11 23:15:58 +0900

appveyor.yml で ver コマンドの実行を追加して Windows のバージョンを表示させるようにしています。

k0kubun: r64301 2018-08-11 23:18:55 +0900

mjit_worker.c で ruby/util.h を #include すると strdup() が ruby_strdup() という GC が走る可能性のある関数にすりかえられてしまうので #undef して、戻り値をチェックするように修正しています。mjit_worker.c の中では GC が走る可能性のある関数を呼んではいけないため。

k0kubun: r64302 2018-08-11 23:27:53 +0900

mjit_worker.c で ZALLOC() でメモリ確保していたところも calloc(3) に変更しています。対応して解放に xfree() を呼んでいたところも free(3) に変更しています。

nobu: r64303 2018-08-11 23:32:15 +0900

r64293 のテストで Windows のバージョンチェックの条件を修正しています。Windows 8 ではまだ一部制限が残っているみたいです。

k0kubun: r64304 2018-08-11 23:34:05 +0900

r64302 で mjit_worker.c で calloc(3) を使うようにしましたが、戻り値のチェックがされていなかったので、calloc() を呼んでた create_list_node() の呼び元でチェックするように修正しています。

k0kubun: r64305 2018-08-11 23:36:14 +0900

mjit_worker_c で alloca() や calloc() を呼ぶように変更したため不要になっていたキャストを削除しています。

k0kubun: r64306 2018-08-11 23:44:31 +0900

mjit.c の start_worker() 内に mjit_worker() の extern 宣言がされていましたが、mjit_worker.c が #include で取り込まれるようになって不要になっていたので削除しています。

k0kubun: r64307 2018-08-11 23:48:10 +0900

mjit.c に ruby_strdup() に置換される get_string() というマクロを定義して使っていましたがこれは削除して直接 ruby_strdup() を呼ぶようにしています。これは MJIT の worker ではなく mjit_init() からだけ呼ばれるから OK なのかな。

k0kubun: r64308 2018-08-11 23:50:21 +0900

r64250 で追加した RubyVM::MJIT.pause のテストを MJIT がサポートされてない環境ではスキップするようにしています。

naruse: r64309 2018-08-12 01:25:21 +0900

r64296 で Solaris の時に実行しないようにする rubyspec の Addrinfo.getaddrinfo のテストケースが違ってたみたいで platform_is_not ブロックでくくる位置を変更しています。

svn: r64310 2018-08-12 01:25:22 +0900

version.h の日付更新。

k0kubun: r64311 2018-08-12 08:33:36 +0900

r64276 の appveyor.yml の Slack 通知でアイコンとユーザー名をカスタマイズするようにしています。

k0kubun: r64312 2018-08-12 08:40:12 +0900

vm_insnhelper.c の vm_call_iseq_setup_normal_internal() の宣言に inline 修飾子と ALWAYS_INLINE() マクロ両方使ってて重複していたので修飾子は消しています。

nobu: r64313 2018-08-12 09:28:26 +0900

rubyspec の Socket.getifaddrs のテストで VirtualBox 内だと netmask に不正な(ip? に false を返す) Addrinfo が含まれるみたいなのでそれを除外するようにフィルタを追加しています。

k0kubun: r64314 2018-08-12 09:30:04 +0900

r64280 の MJIT 用関数のリファクタリングを revert しています。理由は不明ながら CI で test-all が失敗するとのこと。

nobu: r64315 2018-08-12 13:50:14 +0900

compile.c の when_vals() およびその呼び元の compile_case() で COMPILE() がエラーを返した時のエラー処理が漏れてたので修正しています。

nobu: r64316 2018-08-12 13:50:48 +0900

compile_case() で type をチェックするのに専用のマクロ EXPECT_NODE() というマクロを利用するようにリファクタリングしています。

k0kubun: r64317 2018-08-12 15:00:31 +0900

r64282 で tool/downloader.rb で HTTP ステータス 502 や 503 はリトライするようにしましたが、リトライ回数も 3回から 6回に増やしています。 CI で GitHub のアクセスが 1分間続けて 502 になったことがあったそうなので、もう少し長くリトライするようにしています。

nobu: r64318 2018-08-12 17:10:53 +0900

case 文の when 節に * で展開する式(splat)が書かれてた時の処理を when_splat() という関数に切り出して再帰的に呼び出して VM 命令で値を分解するようにする最適化。専用の関数で再帰することで不要な中間オブジェクト生成を抑制するのが目的みたいですね。うーん具体的なスクリプトのサンプルとしてベンチマークが欲しいところ。 https://github.com/ruby/ruby/pull/1928 [ruby-core:88451] [Feature #14984]