ruby-trunk-changes r37121 - r37127

今日は YARV のインラインキャッシュの構造の変更、 Process.spawn/exec の uid,gid 変更機能の追加、Array#sample の精度の向上などがありました。

ko1:r37121 2012-10-09 14:33:54 +0900

インラインキャッシュ*1からメソッドのキャッシュの情報を分離して別のエントリで管理するようにしています。インラインキャッシュは複数の別の対象をひとつの union 型を含む iseq_inline_cache_entry の配列でキャッシュしてるのですが、そこから必要なエントリのサイズが大きいメソッドキャッシュを別管理するように切り出しています。
どうでもいいのですがインラインキャッシュの変数名が ic で新しつ追加された rb_call_info_t の変数が ci と略されると大変まぎらわしいですね。

ko1:r37122 2012-10-09 14:37:43 +0900

r37121 で rb_iseq_t に追加したメソッドキャッシュ用の callinfo_entries を解放し忘れていたのを修正しています。

nobu:r37123 2012-10-09 17:05:59 +0900

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

nobu:r37124 2012-10-09 17:13:29 +0900

Process.spawn や exec に uid, gid オプションを追加して、uid, gid を変更して実行(多くの場合は root 権限のあるプログラムがより権限の小さなユーザ/グループに変更して実行するために)する機能を追加しています。uid のほうにある uid = 30000 っていうのは何か意味があるんでしょうか。あとチケットでは akr さんが posix_spawn(2) には POSIX_SPAWN_RESETIDS というオプションがあるよと書かれていましたがこれは入ってないようですね。 [ruby-core:47414] [Feature #6975]

nobu:r37125 2012-10-09 17:59:03 +0900

unsigned long 型の乱数を生成する rb_random_ulong_limited() という C API を追加しています。 rb_genrand_ulong_limited() と類似ですが第1引数に乱数エンジンが指定できるようになっています。

nobu:r37126 2012-10-09 18:01:40 +0900

r37125 で追加した rb_random_ulong_limited() を利用して Array#sample の実装を修正しています。これまでは Array#sample の実装は double の乱数を利用していて、double は unsigned long よりも精度が小さい(1の差を識別できる範囲で表現できる最大の整数が小さい)ので非常に大きい配列の時に絶対に選択されない要素がありえたのを修正しています。 NEWS ファイルには Array#shuffle や Array#sample に渡される Random にこれまでは無引数の rand が呼ばれていたのが、最大値の引数つきで呼ばれるようになるという変更が追記されています。

nobu:r37127 2012-10-09 23:18:05 +0900

test/ruby/envutil.rb に assert_file/assert_file_not という(ruby 本体のテスト用の) assertion の定義を追加して、File.xxx? なメソッドで判定している assertion の書きかたを変更してエラー時により説明的な結果が出力されるようにしています。

*1:InstructionSequence に組込まれるキャッシュで命令列の特定の位置で定数やメソッドの探索結果をキャッシュして不要なら再度探索せずに済ませるためのキャッシュ。先日 r37106 で ON/OFF できるようにしたのは Class/Module 単位のキャッシュでそれとはキャッシュされる場所や粒度が異なる