今日は最近の最適化命令時の仕様の再現不足の修正や fork/spawn などのメソッドでのタイミング依存のデッドロックの恐れのあった部分の追加修正などがありました。
nobu: r44700 2014-01-25 10:55:44 +0900
class.c の rb_obj_methods() を goto 文を使わない書き方にリファクタリング。
svn: r44701 2014-01-25 10:55:49 +0900
version.h の日付更新。
nobu: r44702 2014-01-25 11:16:20 +0900
キーワード引数の取り出しを行うユーティリティ関数 rb_extract_keywords() で第1引数の keyword_hash が Qnil の時は 0 (Qfalse) に上書きしておくようにしています。この関数内では keyword_hash が存在しない時は 0 を前提としているのですが、rb_scan_args() が nil を返した時に nil が渡される可能性があった模様。
nobu: r44703 2014-01-25 12:15:30 +0900
insns.def のコーディングスタイルの統一。
nobu: r44704 2014-01-25 14:17:17 +0900
compile.c で obj[key] = のような式を最適化した命令にコンパイルするあたりでキーが文字列の時に fstring にしているのですが、この文字列を mark 対象として登録しておくようにしています。
nobu: r44705 2014-01-25 14:21:07 +0900
同じく obj[key]= のコンパイル時の最適化命令へのコンパイルの際、メソッドの戻り値ではなくて代入の右辺値を評価値にするようにしています。
これは obj[key]= 型のメソッドのルールで、以下のような挙動をするはずが、最適化時に対応漏れてたということですね。 [ruby-core:60071] [Bug #9448]
class A def []=(key, val) p [key, val] :ok end end a = A.new a[:key] = 42 [:key, 42] => 42 >> a.send(:[]=, :key, 72) [:key, 72] => :ok
nobu: r44706 2014-01-25 14:50:44 +0900
r44687 の修正と同様に fork, spwan, popen などの子プロセスを起動するメソッド類で pipe を通じてエラーをやりとりする時の EINTR の考慮がまだ足りてなかったようで EINTR がかえってきたらリトライする関数 write_retry() と read_retry() を導入して利用するように修正しています。