ruby-trunk-changes r50451 - r50465

今日は Enumerable#to_a で size メソッドに依存した最適化や String#encrypt の不具合修正のほか、T_DATA 型のオブジェクトの確保時の潜在的メモリリークの修正などがありました。TypedData などは ptr が NULL でも SEGV しないように GC の mark 処理が修正されました。

glass: r50451 2015-05-10 11:06:06 +0900

Enumerable#to_a で size メソッドの有無をチェックするようにしていますが、これはコミットミスみたいで後に revert されています。

glass: r50452 2015-05-10 11:06:14 +0900

r50451 の再修正ですがこれも後に revert されています。なんとなく squash し忘れっぽいですね。

svn: r50453 2015-05-10 11:06:18 +0900

version.h の日付更新。

glass: r50454 2015-05-10 11:10:16 +0900

r50451 の revert のようなのですが conflict が発生している状態ですね。

glass: r50455 2015-05-10 11:12:16 +0900

r50452 を revert しています。

glass: r50456 2015-05-10 11:19:55 +0900

改めて r50451 と r50454 での conflict 状態をまとめて revert しています。 これで元に戻ったはず。

glass: r50457 2015-05-10 11:25:33 +0900

改めて、Enumerable#to_a で size メソッドが呼べるなら呼んで値がかえってきたらそれを新しく作る Array オブジェクトの capa としてあらかじめバッファを確保しておくようにしています。 https://github.com/ruby/ruby/pull/444

glass: r50458 2015-05-10 11:49:01 +0900

String#crypt が NUL文字を持つ String オブジェクトに対して呼ばれたら ArgumentError を発生させるようにしています。なるほど。まあ crypt(3) を呼んでいるのでしかたないですね。 [Bug #10988] https://github.com/ruby/ruby/pull/853

glass: r50459 2015-05-10 12:01:18 +0900

win32ole や rubygems のコメントの "indicies" を "indices" に修正しています。 https://github.com/ruby/ruby/pull/892

glass: r50460 2015-05-10 12:43:22 +0900

拡張ライブラリ zlib に GzipReader#external_encoding メソッドを追加しています。利用している IO オブジェクトの external_encoding を見せるメソッドですね。 [ruby-core:68287] [Bug #10900]

ktsj: r50461 2015-05-10 16:29:44 +0900

Proc#binding で envval のオブジェクトを確保してから ptr に入れるメモリ領域を確保しているため、一瞬 envptr が NULL になるタイミングがあり、その瞬間に GC の mark 処理が走ると SEGV する可能性があったので、先に envptr 用のメモリ領域を確保してからオブジェクトを確保するようにしています。 これ今度はオブジェクト確保時に例外が発生すると xmalloc() した領域が解放されなくなってしまうんですよね。

nobu: r50462 2015-05-10 21:32:47 +0900

GC の mark 処理で T_DATA 型のオブジェクトで ptr が NULL だったら mark 関数(dmark) を呼ばないようにしています。 r50461 で修正したようなケースを許容するためだと思われます。

nobu: r50463 2015-05-10 21:34:26 +0900

r50462 で ptr が NULL の T_DATA オブジェクトが作れるようになったので r50461 は revert し、さらに vm.c の vm_make_env_each() でも同じように xmalloc() してから TypedData_Wrap_Struct() でオブジェクトを作っていたところがあったので、ここも先にオブジェクトを ptr=NULL で作っておいてから xmalloc() でメモリ確保するようにしています。

nobu: r50464 2015-05-11 00:20:35 +0900

r50462 の変更に絡んでですが、そもそも Data_Make_Struct() や TypedData_Make_Struct() も先に ptr 用のメモリ領域を ZALLOC() で確保してから Data_Wrap_Struct()/TypedData_Wrap_Struct() でオブジェクトを確保するという順番になっていて、オブジェクト確保で例外になった時に memory leak するようになっていたので、専用の関数を導入して順番を入れかえるようにしています。

svn: r50465 2015-05-11 00:20:57 +0900

version.h の日付更新。