ruby-trunk-changes r58370 - r58381

今日は Windows 環境でのデッドロックの修正や SystemStackError などの例外処理の実装のリファクタリングなどがありました。

nobu: r58370 2017-04-16 23:27:21 +0900

test_race_closed_stream が Windows 環境でデッドロックに陥いって失敗するという問題の修正みたいです。 Windows の Event のリセット時に GVL を取得するのをやめるようにしています。

nobu: r58371 2017-04-16 23:54:59 +0900

tool/rbinstall.rb で拡張ライブラリの default gem の Makefile の処理でファイルが存在しない時に全体を止めずにスキップして次の gem に行くようにエラー処理を追加しています。

stomar: r58372 2017-04-17 00:54:57 +0900

r58366 で追加した Integer.sqrt のテストのリファクタリング

svn: r58373 2017-04-17 00:54:58 +0900

version.h の日付更新。

nobu: r58374 2017-04-17 09:10:45 +0900

gc.c の stack_check() の引数に rb_thread_t の th を追加して、また sigaltstack() が使えるかどうかチェックして定義していたところは PREVENT_STACK_OVERFLOW というマクロを定義してこれを参照するようにして、強制的にチェックを外したコンパイルができるようにしています。

nobu: r58375 2017-04-17 09:10:47 +0900

r58374 で引数に th を追加した stack_check() を利用して rb_threadptr_stack_check() という関数を定義して ruby_stack_check() のかわりにこちらを呼ぶようにしています。うーんなるほど vm_eval.c の static 関数の stack_check() は引数の th にかかわらず current thread をチェックしていたみたいですね。

nobu: r58376 2017-04-17 09:25:48 +0900

rb_longjmp() の引数に rb_thread_t *th を追加しています。また rb_raise_jump() で大域脱出の処理を独自に書いてたのを rb_longjmp() の呼び出しにおきかえています。

nobu: r58377 2017-04-17 10:23:50 +0900

backtrace_object() を rb_threadptr_backtrace_object() に改名し、rb_vm_backtrace_str_ary() も rb_threadptr_backtrace_str_ary() に改名しています。backtrace を取得する系の関数は引数に rb_thread_t *th がついているので rb_thread_ptr_xxx() に統一しているようです。

nobu: r58378 2017-04-17 10:35:54 +0900

r58362 の rb_funcall() を rb_funcallv() に展開する最適化の絡みかな? 関係ない気もしますが parse.y の WARN_CALL()、 WARNING_CALL() というマクロで可変長引数を展開する時に空っぽの場合に対応するため ## をつけるようにしています。

nobu: r58379 2017-04-17 11:08:41 +0900

SystemStackError 例外を発生させる thread.c の ruby_thread_stack_overflow() を rb_threadptr_stack_overflow() という名前に変更して vm_insnhelper.c に移動しています。

nobu: r58380 2017-04-17 11:31:35 +0900

SystemStackError や NoMemoryError のようにあらかじめ確保しておく例外オブジェクトを判定して setup_exception() で特別扱いするように分岐していたのをやめています。 r58379 の変更でこれらの例外が通らなくなったとかかなぁ。また rb_threadptr_execute_interrupts() で特別な例外オブジェクトを発生前に ruby_vm_special_exception_copy() を呼んでコピーを作るようにしています。

nobu: r58381 2017-04-17 11:41:00 +0900

setup_exception() で freeze された例外オブジェクトを raise しようとした時に backtrace の設定が必要だったらコピーを作るようにしていましたが、cause の設定のためにもコピーを作るようにしています。