ruby-trunk-changes r45534 - r45543

今日はとても大きな String オブジェクトの連結処理時の不具合や GC のマーク漏れなどによる SEGV の修正や x64-mingw での callcc の SEGV の修正、拡張ライブラリ openssl のバージョンを表す定数の追加などがありました。

nobu: r45534 2014-04-09 12:44:55 +0900

String の文字列連結を実装した str_buf_cat() でバッファのサイズである capa を 4096 の倍数に切り上げるための計算で 4096 を掛け忘れていた不具合を修正しています。 とても大きいサイズの文字列を作った時に通るパスで、SEGV することがあったそうです。 [ruby-core:61886] [Bug #9709]

svn: r45535 2014-04-09 12:45:00 +0900

version.h の日付更新。

nobu: r45536 2014-04-09 12:50:07 +0900

同じく str_buf_cat() で文字列の終端文字のぶんを考慮して capa を計算していたのをやめています。 RESIZE_CAPA() で考慮しているので不要とのこと。

nobu: r45537 2014-04-09 13:07:14 +0900

configure で x64-mingw では __builtin_setjmp()/__builtin_longjmp() を無効にしています。 callcc のまわりで SEGV が発生するとのこと。 [ruby-core:61887] [Bug #9710]

ko1: r45538 2014-04-09 14:45:01 +0900

test/ruby/test_gc.rb の test_sweep_in_finalizer のタイムアウト時間を 30秒から60秒にのばしています。 RGENGC_CHECK_MODE を 2以上にすると時間がかかってこのテストがエラーになることがあるからとのこと。

nobu: r45539 2014-04-09 15:17:00 +0900

Encoding.default_internal の rdoc 用コメントで default_internal が影響する対象に __FILE__ が書かれていましたが、__FILE__ は filesystem encoding の影響を受けるので削除しています。 [ruby-core:61894] [Bug #9713]

nobu: r45540 2014-04-09 17:27:56 +0900

拡張ライブラリ openssl に OpenSSL::OPENSSL_LIBRARY_VERSION という定数を導入しています。 SSLeay_version(SSLEAY_VERSION) でランタイムに取得できるバージョンを返します。

akr: r45541 2014-04-09 21:05:14 +0900

process.c で USE_GETPWNAM_R が未定義の時も OBJ2UID1() と OBJ2GID1() いうマクロを定義するようにしています。内容は OBJ2UID() や OBJ2GID() と同じものなのですが Android 版のビルド時にエラーになってしまっていたのを修正しているそうです。

akr: r45542 2014-04-09 23:30:46 +0900

r40703 で RGenGC が導入された時に mark_current_machine_context() から削除された SET_STACK_END マクロの呼び出しを復活させています。マーク対象のマシンスタックの底をスタックポインタから得るもので、おそらく gc_marks() でセットしているので不要と判断されたのかと思いますが必要だったようで SEGV することがあったようです。 [ruby-dev:48098] [Bug #9717]

akr: r45543 2014-04-09 23:32:01 +0900

r45542 で復活させた mark_current_machine_context() の SET_STACK_END にこの位置からマークが必要な理由をコメントで追記しています。 この関数のスタックフレームには rb_setjmp() を利用して退避したレジスタの内容が置かれているため、これをマークするために必要なんだそうです。
[追記]コメントにある callee save registers は関数の呼び出し規約についての話だったようで、呼び出された関数側で利用前に保存しておかないといけない(上書きされるので)レジスタのことで、関数の呼び出し元でそのレジスタVALUE が入っていたらそれをマシンスタックに退避したものも mark させないといけないため、という話で、rb_setjmp() で退避したレジスタはあまり関係なかったそうです。 akr さんに教えていただきました。 こちらの記事も参考にしてください。 参考URL: http://www.a-k-r.org/d/2014-04.html#a2014_04_09_1 [/追記]