ruby-trunk-changes r51265 - r51283

今日は spawn/exec 時の fd 関連のオプションで timer thread 用の fd が変更されてしまうのを防ぐ修正や、VM 関係のマクロの最適化やリファクタリングなどがありました。

ngoto: r51265 2015-07-16 21:08:56 +0900

r51209 で全てのプラットフォームで execve(2) 前に timer thread を止めるようにしたのを revert しています。 signal の喪失により deadlock することがあるという問題があったのでした。 ああー、なるほど test_deadlock_by_signal_at_forking が OS X でたまに失敗するというのは、OS X では timer thread を止めてるからかもしれないですね。

nobu: r51266 2015-07-16 21:29:23 +0900

r51248 と同様に rb_str_enumerate_lines() で RETURN_ENUMERATOR() を使っていたため rb_block_given_p() のチェックが重複していたのを修正しています。ついでに SIZE_ENUMERATOR() を使うようにして size を取得できる Enumerator を返すようにしています。

ko1: r51267 2015-07-16 21:50:25 +0900

rb_iseq_disasm() と rb_iseq_disasm_insn() の変数名を改名しているだけです。

ngoto: r51268 2015-07-16 22:06:13 +0900

spawn/exec 時の内部的に利用している fd の扱いについての一連の変更で、rb_divert_reserved_fd() という関数を追加して dup2(2) で newfd に指定された fd が内部的に timer thread の通知用に使っている pipe の fd と一致していたら、pipe の fd を dup(2) で別の fd に変更するようにしています。 [ruby-core:69886] [Bug #11336] [ruby-core:69961] [Bug #11350]

ko1: r51269 2015-07-16 22:13:50 +0900

rb_iseq_t * 型の関数の引数や変数に const をつける修正。

kazu: r51270 2015-07-16 22:29:20 +0900

r51268 と r51269 の ChangeLog エントリの typo 修正。

normal: r51271 2015-07-17 05:26:32 +0900

thread.c の mutex_alloc() の引数 obj についていた volatile 修飾子を削っています。

svn: r51272 2015-07-17 05:26:48 +0900

version.h の日付更新。

normal: r51273 2015-07-17 05:42:43 +0900

iseq.c, thread.c, process.c, thread.c などで重複した GET_THREAD() の呼び出しをローカル変数におきかえるリファクタリングコンパイルした実行形式のコード削減のためみたいです。x86 で text 領域が 64 byte ...あいかわらずすごいこだわりですね。

normal: r51274 2015-07-17 09:59:02 +0900

標準添付ライブラリ rinda/tuplespace と、拡張ライブラリ pathname のテストスクリプトで不要な require "enumerator" が残っていたので削っています。 [Bug #10902]

normal: r51275 2015-07-17 10:42:18 +0900

rb_thread_alone() の不要な分岐やデバッグ出力を削ってコードをシンプルにしています。

nobu: r51276 2015-07-17 15:36:42 +0900

Range のテストに Range#last のテストケースを追加しています。 https://github.com/ruby/ruby/pull/970

nobu: r51277 2015-07-17 15:37:05 +0900

Range.new のテストを追加しています。 Range.new の第3引数で終端を含むかどうかの指定ができるんですね(普通 x..y や x...y の記法を使うのであまり Range.new を使ったことがない)。 https://github.com/ruby/ruby/pull/971

nobu: r51278 2015-07-17 15:39:29 +0900

include/ruby/encoding.h に ENC_CODERANGE_CLEAN_P() というマクロを導入して coderange が ENC_CODERANGE_VALID もしくは ENC_CODERANGE_7BIT であることをビット演算を使って判定するようにして、re.c や string.c でこれを利用しています。

nobu: r51279 2015-07-17 16:28:22 +0900

TracePoint などのイベントの実行を行なう EXEC_EVENT_HOOK_ORIG() マクロで引数 th を何度も評価するように展開するのをやめて、ruby_exec_event_hook_orig() という inline 関数を定義してこれを呼び出すようにしています。

nobu: r51280 2015-07-17 16:28:36 +0900

関数マクロ RUBY_VM_CHECK_INTS_BLOCKING() でも同様に引数の th を複数回評価するように展開されていたのを inline 関数 vm_check_ints_blocking() を定義してこれの呼び出しとして展開するように変更しています。また vm_core.h から定義を thread.c へ移動しています。

nobu: r51281 2015-07-17 16:28:53 +0900

関数マクロ RUBY_VM_CHECK_INTS() でも同様に引数の th が複数回評価されるように展開されていたのを inline 関数 ruby_vm_check_ints() を追加して、これの呼び出しに展開するように変更しています。

nobu: r51282 2015-07-17 22:15:29 +0900

compile.c の iseq_compile_each() で break 文の命令列を生成する時の throw 命令に渡す level のビットフラグから 0x4000 を消しています。うおー、なんだこのマジックナンバーは。

nobu: r51283 2015-07-17 22:18:12 +0900

compile.c で throw 命令に渡す TAG_BREAK, TAG_NEXT, TAG_REDO などの数値がマジックナンバーとして数字が書かれていたので定数マクロを利用するようにしています。 また TAG_BREAK などの定数の宣言を eval_intern.h から vm_core.h へ移動しています。