ruby-trunk-changes r45284 - r45294

今日は Enumerable のブロック呼び出しでのブロックパラメータの扱いの修正や、Process で getpwnam_r()/getgrnam_r() でバッファが足りないエラーが出たときの対応の追加、拡張ライブラリ dl と fiddle でのメモリリーク修正などがありました。

nobu: r45284 2014-03-08 07:35:55 +0900

Enumerable の修正をしようとしていたっぽいのですが、ChangeLog の変更しかコミットされていません。

svn: r45285 2014-03-08 07:35:59 +0900

version.h の日付更新。

nobu: r45286 2014-03-08 07:36:32 +0900

r45284 で ChageLog のみコミットされてた件の修正が改めてコミットされています。 Enumerable で複数の値を yield でブロックパラメータに渡して呼び出す時に配列にして rb_yield() に渡すのでなくて enum_yield() で argc, argv の引数の形式で渡すか、rb_yield_splat() で明示的に配列変換するようにしています。 Enumerable#each_with_index などで作った Enumerator のメソッドに lambda 型の Proc オブジェクトをブロック引数として渡した時に ArgumentError になる(lambda は引数の arity チェックがあるため)のを修正しています。 [ruby-core:61340] [Bug #9605]

nobu: r45287 2014-03-08 12:55:01 +0900

Process のメソッドで uid, gid を取得するための処理で getpwnam_r(3) などの関数に渡すバッファを sysconf(_SC_GETPW_R_SIZE_MAX) などで上限を調べて ALLOCA() で確保していたのを rb_alloc_tmp_buffer() を使って確保するようにしています。スタック上に領域を確保することでスタックオーバフローがおきる可能性を回避するためみたいです。

nobu: r45288 2014-03-08 13:08:46 +0900

r45287 の変更はこの変更のためだったみたいですが、getpwnam_r(3) などで使うバッファのサイズを決定するために sysconf() で _SC_GETPW_R_SIZE_MAX/_SC_GETGR_R_SIZE_MAX で取得していた値は、最大値が設定されていない時に負の値になりえるようで、その場合はデフォルト値として 0x1000 を利用するようにしています。

nobu: r45289 2014-03-08 13:30:30 +0900

r45287、r45288 の続きで obj2uid()、obj2gid() でバッファとして使う文字列オブジェクトの len でなく capa をバッファサイズとして利用するように修正しています。

nobu: r45290 2014-03-08 13:30:56 +0900

r45287、r45288、r45289 のさらに続きで、getpwnam_r() や getgrnam_r() の呼び出しでバッファサイズが足りなかった場合は errno=ERANGE でエラーが返されるので、その時はバッファを拡張して再度呼び出すようにしています。なるほどこれがやりたかったわけですね。またバッファを伸長するとしても 0x10000 を最大値としてこれを越えるようだとエラーを返すようにしています。 [ruby-core:61325] [Bug #9600]

nobu: r45291 2014-03-08 13:46:57 +0900

拡張ライブラリ dl と fiddle で DL::CPtr と DL::Handle、Fiddle::Handle、Fiddle:Pointer のオブジェクト開放時の処理で TypedData で wrap している構造体のメモリ領域を解放していなかったためメモリリークしていたのを修正しています。 [ruby-dev:48021] [Bug #9599]

nobu: r45292 2014-03-08 14:49:12 +0900

r45286 の Enumerable の修正で each_val_i() で不要になったマクロ呼び出しがあったので警告除去のために削除しています。 ENUM_WANT_SVALUE() は引数が複数の時に配列に変換するものみたいですが、enum_yield() で直接 argc, argv を受け取るようにしたので不要になってたみたいです。 [ruby-core:61340] [Bug #9605]

normal: r45293 2014-03-08 17:56:50 +0900

VM の命令で最適化されるいくつかの組み込みクラスのメソッドの再定義を監視するために method entry を取得する add_opt_method() で st_lookup() を直接利用していたのを rb_method_entry_at() という関数を利用して抽象度を上げるリファクタリングです。 method entry の管理方法の実装を変更するのをやりやすくするためと書かれていてそういう実験が行なわれているのかも。

ktsj: r45294 2014-03-08 20:01:48 +0900

NEWS ファイルに r45241 や r45269 で Find#find と Pathname#find に ignore_error というキーワード引数が追加された変更について追記しています。