ruby-trunk-changes r63724 - r63731

今日は TracePoint のフック内で例外発生時に無限ループに陥る場合があった不具合修正などがありました。

normal: r63724 2018-06-23 12:47:54 +0900

thread_pthread.c の native_sleep() で th->unblock.arg を 0 クリアしていたのをやめています。 th->unblock.func をクリアしたら arg はみないからいらんやろ、ということでクリアしたらまずいというわけではなさそう。ちょっとした最適化。

svn: r63725 2018-06-23 12:47:55 +0900

version.h の日付更新。

ktsj: r63726 2018-06-23 13:45:57 +0900

vm.c の vm_exce_handle_exception() という関数名、よーくみると typo していたので vm_exec_handle_exception() に修正しています。 static 関数でよかった。

ktsj: r63727 2018-06-23 13:52:58 +0900

vm_exec_handle_exception() において TracePoint などのフック実行のため EXEC_EVENT_HOOK() を使ってたのを stack frame を取り除く EXEC_EVENT_HOOK_AND_POP_FRAME() を利用するように修正しています。フック内で再度例外が発生した場合に frame が残ってるとまた同じフックが呼ばれて無限ループ状態に陥ってしまっていたみたいです。 [ruby-dev:50582] [Bug #14865]

ktsj: r63728 2018-06-23 13:56:49 +0900

test/ruby/test_settracefunc.rb の TracePoint のテストで子プロセス内で呼ばれるためフック内で Thread のチェックをする utility メソッドが呼べないのに呼んでたのを削っています。ここでは Thread のチェックは不要だった模様。

ktsj: r63729 2018-06-23 13:57:49 +0900

Array#any? と Hash#any? の rdoc 用コメントの call-seq にブロックなしで引数に pattern を渡す呼びかたを追記しています。え、そんな仕様あったのか…。

k0kubun: r63730 2018-06-23 16:21:12 +0900

MJIT が cygwin でも有効にできるようにしています。 また pthread_attr_setscope() で PTHREAD_SCOPE_PROCESS していたのを削っていますが、これは cygwin では動かないというのと LinuxmacOS でもサポートされていない(なんで入ってたんだろ)らしいので不要みたいです。 cygwin 版はとりあえずビルドはできる、という程度の状態らしいですが、あまり大きな変更はなくて動いててすごいですね。 [ruby-dev:50579] [Misc #14854]

k0kubun: r63731 2018-06-23 17:29:20 +0900

[Bug #14867] で問題提起されているように MJIT では実行時のコンパイルのため gcc/clang などのコンパイラを起動するので、Process.wait が無条件に子プロセスを待つ時にこのコンパイラのプロセスも待ってしまうという問題があり、rubyspec のいくつかのテストが動かないので当面 skip するようにしています。これは難しそうですね。チケットではひとつのアイデアとしてコンパイラプロセスを起動するための孫プロセスを1つ立てて、そこを経由して(pipe を使った通信で)ひ孫プロセスとしてコンパイラを起動するというのが提案されてました。