ruby-trunk-changes r47948 - r47978

今日は Fiber まわりのコードの効率化やリファクタリングで大きく書き換えがあったのと、Ripper の不具合修正などがありました。

kazu: r47948 2014-10-15 23:12:57 +0900

r47923 の ChangeLog エントリの typo 修正。

nobu: r47950 2014-10-15 23:37:51 +0900

バックトレース出力時のメソッド名の表示で名前のないメソッド(ってなんだろ…)を "unknown method" と表示するようにしています。

nobu: r47951 2014-10-15 23:37:54 +0900

vm_backtrace.c で rb_id2str() が 0 を返した時に Qnil を返すようにおきかえるラッパ関数を追加しています。 r47950 とも関連しているっぽいですね。

normal: r47959 2014-10-16 07:34:30 +0900

Fiber の構造体 rb_fiber_t が prev_fiber/next_fiber で二重リスト構造を作るようにしていたのをやめています。既にこの構造で辿ることはしていなかったようです。 [ruby-core:65518] [Feature #10341]

svn: r47960 2014-10-16 07:34:41 +0900

version.h の日付更新。

normal: r47961 2014-10-16 07:34:43 +0900

fiber の実装のリファクタリング。不要なコードの削除や処理の順序の入れ替えなど。 [ruby-core:65518] [Feature #10341]

normal: r47962 2014-10-16 07:34:53 +0900

さらに cont.c のちょっとしたリファクタリング。ショートカットとしてのローカル変数の利用を削っています。 [ruby-core:65518] [Feature #10341]

normal: r47963 2014-10-16 07:35:01 +0900

Fiber の切り替え時に rb_thread_t の情報を退避領域にコピーする時に全体ではなくて必要なところだけバックアップするようにしています。またスタックサイズや jmpbuf に保存しておいたスレッドの情報じゃなくてカレントスレッド情報を使うように変更しているのですがこれはいいのかな? [ruby-core:65518] [Feature #10341]

normal: r47964 2014-10-16 07:35:08 +0900

Fiber の実装でさらに VALUE を使っていたところを rb_fiber_t 構造体をそのまま使うようにしたり、関数を inline 宣言を追加してできるだけインライン展開されるようにしています。 [ruby-core:65518] [Feature #10341]

akr: r47965 2014-10-16 08:12:21 +0900

拡張ライブラリ etc の Etc.nprocessors の rdoc 用コメントに affinity 設定を意識する実装は Linux 専用なのを少し強調するようにしています。

normal: r47966 2014-10-16 08:27:01 +0900

r47961 から r47964 あたりの変更で FIBER_USE_NATIVE が 0 の時に cont.c がコンパイルできなくなっていたので修正しています。

normal: r47967 2014-10-16 08:40:33 +0900

と思ったら r47966 の変更は間違っていたようで FIBER_USE_NATIVE が 0 の時のための再修正。変数の参照をしないようにコードを削っていましたが "&" 演算子漏れだったようです。

normal: r47968 2014-10-16 09:06:09 +0900

test/ruby/test_process.rb で fork した子プロセスから親プロセスに対してシグナルを送信するテストで、Process.ppid で親プロセスの pid を取得していたのを、親プロセスで $$ を保存しておいてそれを使うように変更しています。 子プロセスができてから Process.ppid が呼ばれる前に親プロセスが死んでいたら、ppid が別のプロセス(init とか?)になるので本来送信するべきでない pid にシグナルを送信してしまう可能性があるため。よく気がつきましたね、というか、実際にこのわずかな瞬間に親プロセスが死ぬ現象に遭遇したんですかね。一般的に ppid にシグナル送信というのがよくないというのが目にとまったのかも。

nobu: r47969 2014-10-16 09:17:44 +0900

r47964 で cont.c がコンパイルできなくなっていたのを修正しています。 [ruby-core:65518] [Feature #10341]

nobu: r47970 2014-10-16 09:19:22 +0900

cont.c さらに再修正。 不要な typedef 予約語が書かれていたのを削除しています。 rb_fiber_t の typedef は vm_core.h に移動されたのですね。 [ruby-core:65518] [Feature #10341]

normal: r47971 2014-10-16 10:10:53 +0900

test/ruby/test_rubyoptions.rb の test_segv_test で自分自身に SIGSEGV を送信した後に sleep するようにしています。 シグナルの送信は非同期なので配送前にプロセスが終了してしまう可能性もあるので待つようにしています。

normal: r47972 2014-10-16 11:01:51 +0900

r47971 と同様に test/-ext-/bug_reporter/test_bug_reporter.rb でも自分自身に SIGSEGV を送信してから sleep で待つようにしています。

nobu: r47973 2014-10-16 15:05:03 +0900

拡張ライブラリ ripper でヒアドキュメントのパースエラー時に string_dispose() で強制的に回収した文字列オブジェクトを利用してしまって SEGV する場合があったのを修正しています。 [ruby-dev:48647] [Bug #10392]

normal: r47975 2014-10-16 16:27:26 +0900

cont.c のリファクタリングで WIN32 の時に必要なコードが #ifndef WIN32 の中に入ってしまっていたので外に出すように修正しています。 [ruby-core:65745] [ruby-core:65758] [Feature #10341]

nobu: r47977 2014-10-16 17:15:46 +0900

SIGSEGV は SIGSEGV のハンドラ内でさらに SIGSEGV を受信した時の処置がありましたが、SIGBUS, SIGILL も同様のチェックを追加しています。またそもそも SIGILL のシグナルハンドラ([BUG] を出して異常終了する)を新規追加しています。

akr: r47978 2014-10-16 20:18:06 +0900

r47925 や r47938 で EnvUtil の assertion メソッドとして追加した assert_pattern_list で、エラー時に何番目のパターンで失敗したか、どのへんまでマッチしていたかも表示するようにしています。