ruby-trunk-changes r41199 - r41220

今日は昨日までに引き続き rb_integer_pack()/rb_integer_unpack() の変更/リファクタリングのほか at_exit 内での例外発生についての不具合修正や RGenGC の修正などがありました。

akr:r41199 2013-06-10 01:08:54 +0900

bignum.c の rb_absint_numwords() のリファクタリングをして処理を別の関数に切り出しています。

svn:r41200 2013-06-10 01:08:59 +0900

version.h の日付更新。

akr:r41201 2013-06-10 05:39:05 +0900

r41199 の続きで bignum.c の rb_absint_numwords() の処理で numbytes が sizeof(size_t) / CHAR_BIT(=8) 以下の時に使える最適化された計算方法を実装した absint_numwords_small() という関数を追加して、可能ならこれを利用するようにしています。

akr:r41202 2013-06-10 12:12:44 +0900

bignum.c の今度は rb_integer_unpack() のリファクタリングで、処理をいくつかの関数に切り出しています。

nobu:r41203 2013-06-10 15:33:58 +0900

test/ruby/test_beginendblock.rb のテストメソッドの名称から "should" を削る改名をしています。コミットメッセージいわく「テストは常に should (こうあるべき)ことを書くんだから冗長だ」ということみたいです。

nobu:r41204 2013-06-10 15:34:28 +0900

eval_error.c の error_print() で例外や例外以外の内部的なエラー等のメッセージを出力するところで TH_EXEC_TAG() で setjmp() を呼ぶ回数を減らしています。ローカル変数を Qundef で初期化しておいてその状態をチェックすることで、どこまで処理が進んでいたかを判定できるようにしているのがミソかと思います。

nobu:r41205 2013-06-10 15:35:37 +0900

at_exit で登録された処理の中で例外が発生した時に、エラーの内容を表示するところで更に例外が発生すると、後続の at_exit のブロック内で $! (例外オブジェクト)が nil になって、終了ステータスも 0 (正常終了)になっていたのを修正しています。 [ruby-core:55365] [Bug #8501]
r41204 はこの変更の前準備だったみたいですね。

nobu:r41206 2013-06-10 15:36:02 +0900

これも r41204、r41205 の続きのようです。eval_error.c で例外のメッセージを取得するために messege メソッドを rb_funcall() で呼んで、そこで例外が発生したら TH_TAG_EXEC() のところで捕捉するようにしていたのを、rb_check_funcall() によって呼べるかどうかチェックしてから呼び出すようにして、さらにその結果が String (または String に変換できるオブジェクト)であることを確認するようにして、極力例外が発生しないようにしています。

ko1:r41207 2013-06-10 16:12:14 +0900

gc.c の WeakMap の mark 処理関数 wmap_mark() で obj2wmap という構造体メンバを問答無用で利用していたのを NULL チェックをするようにしています。おそらくここのメモリ確保する前に GC が走ることがあるので、その時に SEGV で落ちてしまうということでしょう。

ko1:r41208 2013-06-10 16:23:36 +0900

array.c の rb_ary_new_from_values() で……えーと obj というが旧世代に昇格していないことをチェックする assert() を追加しているのですが、obj というローカル変数はないんですよね……。ary の間違い? でもそもそもコンパイルできないような気がするのですがコンパイルは通ってますね。はて……と思ったら assert() が NDEBUG が定義されていないと消されるからですね。

kazu:r41209 2013-06-10 17:00:01 +0900

r41202 の ChangeLog の単語間にスペースが入ってなかったのを修正。

kazu:r41210 2013-06-10 17:00:04 +0900

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

ko1:r41211 2013-06-10 17:15:31 +0900

gc.c で定義している RVALUE_DEMOTE() というマクロの引数が x なのに間違って obj という変数を使ってしまっていた(たまたま使っているところに obj という変数があって、それを渡していたのでうまく動いていた)のを修正するついでに、inline 関数として定義するように変更しています。

ko1:r41212 2013-06-10 17:21:08 +0900

gc.c の rgengc_remember() で RGENGC_CHECK_MODE を on にしてコンパイルされた時の引数 obj が新世代であることをチェックしていたのを削っています。 よく調べていませんが rb_gc_writebarrier() から remember set に入れる時に旧世代のオブジェクトが渡される可能性があったようです。

akr:r41213 2013-06-10 19:37:39 +0900

bignum.c の rb_integer_pack() のインタフェースを変更して、戻り値として pack した work の配列へのポインタを返していたのを、符号(およびオーバフローの有無)を表す int 型の戻り値(-2〜2 の値を取る)を返すようにしています。これまで符号はポインタとして引数に渡してそこに書き込ませていたのですが、呼び元の修正をみた感じだと格納するバッファは渡しているので戻り値でポインタを返していてもそれを受け取っていることがあまりなくて無駄だったので引数を減らすようにしたのかなと思います。

akr:r41214 2013-06-10 19:55:08 +0900

r41213 で rb_integer_pack() の rdoc の戻り値の説明を変更したのですが、そこに更に説明を追加しています。特にオーバフローかどうかの条件について追記しています。

naruse:r41215 2013-06-10 20:59:36 +0900

拡張ライブラリ socket の Addrinfo で Ubuntu 13.04 の mdns で名前解決が失敗するようになっているという問題があるそうで、これを回避するために特定の戻り値と errno の時に想定しているエラーを返すようにしているようです。しかしその ret という getaddrinfo() の戻り値を受け取るためと思われるローカル変数が戻り値を受け取っていなくて未初期化のままですね。 [ruby-list:49420]

kou:r41216 2013-06-10 21:50:45 +0900

r41215 で ret が getaddrinfo() の戻り値を受け取っていなかったのを修正しています。

kou:r41217 2013-06-10 21:51:48 +0900

r41215, r41216 の続きで関数呼び出しの引数の途中での不要な改行を消しています。

akr:r41218 2013-06-10 22:10:11 +0900

bignum.c の rb_absint_numwords() の rdoc コメントにオーバフローがおきるケースについて追記しています。

ktsj:r41219 2013-06-10 22:28:58 +0900

r41205 で追加したテストで未定義のローカル変数 ruby が参照されていたので EnvUtil.rubybin で初期化するようにしています。追加したテストくらいは通して欲しいところです。

akr:r41220 2013-06-10 22:51:20 +0900

r41218 で追記した rb_absint_numwords() の rdoc のオーバフローの説明を削って、単にオーバフローする可能性があることとその時の戻り値についてだけ記述するようにしています。うーん、説明が不正確だったとかでしょうか。