ruby-trunk-changes r51254 - r51264

今日は spawn や exec で fd => :close オプションを使った時の不具合修正や、大きな Hash リテラルを使った時に GC されたオブジェクトを参照して異常終了してしまう可能性がある不具合の修正などがありました。

kazu: r51254 2015-07-15 22:27:58 +0900

r51243 と r51245 の ChangeLog エントリの typo 修正。

ngoto: r51255 2015-07-15 23:26:22 +0900

Process.spawn や Kernel#exec 時にオプションの指定で fd を close する指定に fd=3 などを指定してしまうとインタプリタにとって必須な fd を閉じてしまうので O_CLOEXEC などのフラグの指定によってカーネルが閉じてくれるのを期待してこれらの fd は閉じないようにしています。具体的には rb_reserved_fd_p() で判定されている timer thread の通信用のパイプ(r39686 によって normal と low の2ペアある)の両端のぶんの fd は close しないようにしています。 [ruby-core:69977] [Bug #11353]

ngoto: r51256 2015-07-15 23:44:06 +0900

fork 時の signal 受信によるデッドロックのテストで起動する子プロセスの ruby を EnvUtil.rubybin から取得していたのを RUBY という定数を利用するようにしています。実体は一緒です(RUBY は EnvUtil.rubybin が代入されている)。

kazu: r51257 2015-07-16 00:39:34 +0900

.gitignore に version.i を追加しています。

svn: r51258 2015-07-16 00:39:50 +0900

version.h の日付更新。

ngoto: r51259 2015-07-16 01:39:25 +0900

r51255 の修正についてのテストを追加しています。 [ruby-core:69977] [Bug #11353]

normal: r51260 2015-07-16 03:11:05 +0900

Thread の初期化の関数 thread_initialize() で例外発生時のメッセージの作成に PRIsVALUE を使って VALUE のまま文字列を埋め込むようにしています。コメントでは意味のある修正じゃなくて読みやすさのためとありますが、ファイル名が非ASCII文字列だったらエンコーディングを保持するという意味もあるんじゃないかと思います。

normal: r51261 2015-07-16 09:03:40 +0900

$LOADED_FEATURES に含めるパスやその検索時の expanded load path を fstring 化しています。特に load path を展開したものは繰り返し構築されるので使いまわしがきくのではないかと思います。とはいえ一度は expand_path してしまうのでオブジェクト生成回数自体はそんなに減らないのではないかなぁ。 そういう効果を目指してるわけではないのかな。 [ruby-core:69871] [Feature #11331]

normal: r51262 2015-07-16 11:39:30 +0900

r51255 での close_unless_reserved() の引数の型が宣言されてなかったのを修正。またコーディングスタイルも修正しています。

nobu: r51263 2015-07-16 14:18:40 +0900

Hash リテラルや配列リテラルの値を構築するために VM が内部的に利用しているメソッドの実装で cfp を巻き戻した後に VM スタック上の値を使ってしまって [BUG] で終了してしまっていたので先にコピーしてそれを利用するように修正しています。 大きな(とも限らないかもしれないですが) Hash リテラルを使ってすぐ捨てるようなことを繰り返しているとおきやすい……ってこれ結構普遍的に起きそうですね。 [ruby-core:69969] [Bug #11352]

nobu: r51264 2015-07-16 14:34:27 +0900

r51263 の再修正。 そもそも REWIND_CFP() というマクロの作りを、一つ前の cfp の cfp->sp の値を現在の cfp->sp の値に一時的に書きかえてから cfp を巻き戻して引数の expr の評価をして、cfp を戻す時に cfp->sp も元に戻すようにしています。こうして REWIND_CFP() を利用している同様の問題が別の場所でおきないような方法で修正しています。 [ruby-core:69969] [Bug #11352]
しかし後置の ++ や -- ややこしいですね。こういうケースは前置のほうがわかりやすい気がします。