ruby-trunk-changes r44052 - r44077

今日は一転たくさん変更がありました。 RubyGems の更新、RGenGC 関連の不具合修正、内部的なシンボルテーブルの fstring 化による性能向上、BigDecimal#coerce の Float の変換についての修正、キーワード引数を処理する API rb_get_kwargs() の機能追加などがありました。

charliesome:r44052 2013-12-08 09:41:01 +0900

RHASH_TBL() と RHASH_TBL_RAW() の使いわけについて各所で修正。 RHASH_TBL() を使っているのに別途 OBJ_WRITTEN() も呼んでいるところは RHASH_TBL_RAW() を使うようにしています。また Hash の要素追加/変更用の関数マクロ HASH_ASET() の実装を st_insert() から rb_hash_aset() を呼ぶようにしています。うーむこれはなぜだろう。 rb_hash_aset() だと freeze されているかのチェックや String をキーに渡した時の fstring 利用などの前処理が含まれるので fstring を使うようにするのが目的でしょうか。

svn:r44053 2013-12-08 09:41:09 +0900

version.h の日付更新。

drbrain:r44054 2013-12-08 10:22:39 +0900

RubyGems の最新版をマージしています。 Gemfile.lock の依存関係解決の不具合修正があるそうです。

drbrain:r44055 2013-12-08 10:25:05 +0900

RubyGems のバージョンを 2.2.0.rc.1 にしています。

nobu:r44056 2013-12-08 10:32:07 +0900

rb_get_kwargs()でオプション引数がなかった時に未初期化になるカウンタの初期化を分岐の外に出す修正。

tmm1:r44057 2013-12-08 10:39:27 +0900

fstring をシンボルテーブルにも利用するようにしています。 しかしシンボルテーブルから使うということは rb_cString の初期化前に使われることもあるということで、初期化が終わった後から fstring の共有文字列オブジェクトの klass をセットする処理も追加しています。 [ruby-core:58656] [Bug #9171]

tmm1:r44058 2013-12-08 10:52:28 +0900

Hash の要素追加時にキーが String だった時の dup+freeze 処理を fstring を利用するようにした r43870 を revert しています。 fstring は登録済みの文字列を検索する処理が入るためのオーバヘッドがあるため遅くなることがあったためです。かわりにリテラルのキーが文字列の時に fstring を利用するようにしています。ん、これって {"str" => 10} みたいなリテラルの時の "str" の部分だと思うのですが、元々文字列リテラルだったら fstring 利用されてたんじゃないんでしょうか。 [ruby-core:58730] [Bug #9188]

tmm1:r44059 2013-12-08 11:28:04 +0900

NODE は Ruby のオブジェクトではないですが同じメモリ管理の仕組みで管理されていて、RGenGC の Write Barrier を追加して sunny なオブジェクトになるようにしています。これで大規模なアプリだと remembered_shady_object_count が 80% くらい減るそうです。おーすごい。そして思ったほど変更箇所が多くないですね。 [ruby-core:58947] [Bug #9225]

tmm1:r44060 2013-12-08 12:03:42 +0900

r42027 の Hash#replace の高速化で RGenGC の Write Barrier なしでコピーが行なわれる可能性があったので一部 revert しています。 [ruby-core:58948] [Bug #9226]

a_matsuda:r44061 2013-12-08 12:51:11 +0900

標準添付ライブラリ xmlrpc の rdoc コメントの typo 修正。 explicitely → explicitly

tmm1:r44062 2013-12-08 13:05:59 +0900

RubyVM.stat というメソッドを追加して内部的にメソッドなどのキャッシュの管理に使っているカウンタをみることができるようにしています。Ruby開発者のデバッグ専用って感じでしょうね。故に(かどうかわかりませんが)NEWS には追記されていません。 [ruby-core:58750] [Bug #9190]

nobu:r44063 2013-12-08 13:06:08 +0900

r44062 で新規追加されたファイルの svn property 設定。

ktsj:r44064 2013-12-08 14:02:12 +0900

Array#shuffle! および Array#sample でキーワード引数のチェックに rb_get_kwargs() を利用するようにしています。このため未使用のキーワードが渡されたらエラーになるようになっています。

ktsj:r44065 2013-12-08 14:58:17 +0900

Arrah#shuffle! と Array#sample の関数でキーワード引数を受け取るローカル変数名を改名するリファクタリング

nobu:r44066 2013-12-08 15:47:39 +0900

r44064 の Array#shuffle! と Array#sample のキーワード引数の処理の変更に関連して :random という Symbol を使っていたところはもう Symbol は必要なくて内部的な表現の ID だけあればいいので static 変数の sym_random を削除して id_random に置き換えています。

nobu:r44067 2013-12-08 16:17:18 +0900

キーワード引数のチェックのテストで例外のメッセージもチェックするようにしています。

nobu:r44068 2013-12-08 16:17:21 +0900

キーワード引数のチェックで発生させる例外のメッセージにキーワードが1つだけの時は rb_ary_join() を呼び出さずにそのままキーワードを利用するようにしています。

nobu:r44069 2013-12-08 16:19:30 +0900

rb_get_kwargs() で省略可能キーワード引数の数を指定する optional に負の数値を渡すと未知のキーワード引数が渡された時もエラーにせずに受け付けるようにしています。

ktsj:r44070 2013-12-08 17:54:23 +0900

Module#singleton_class? というメソッドの rdoc 用コメントを追加しています。

ktsj:r44071 2013-12-08 18:33:56 +0900

NEWS ファイルに GC 関連の tuning 用環境変数について追記しています。

naruse:r44072 2013-12-08 20:04:56 +0900

NEWS ファイルの記述位置の整理。

mrkn:r44073 2013-12-08 20:20:51 +0900

拡張ライブラリ bigdecimalBigDecimal#coerce に Float が渡された時にレシーバの BigDecimal を Float に変換していたのを引数の Float を BigDecimal に変換するように修正しています。 BigDecimal の精度が小さい時にその精度に丸めてあげることで比較などで変換する時により正確な結果が出せるからだと思います。 [ruby-core:58756] [Bug #9192]

nobu:r44074 2013-12-08 20:25:06 +0900

r44047 の Hash#reject の変更で元の Hash が taint されていた時に結果の Hash オブジェクトにそれが伝播していない不具合があったので OBJ_INFECT() の呼び出しを追加しています。

kanemoto:r44075 2013-12-08 20:33:59 +0900

common.mk の ruby.imp というターゲットの依存関係の $(EXPORTOBJS) を $(COMMONOBJS) に変更しています。 AIX での循環した依存関係になるのを修正しているそうです。

nobu:r44076 2013-12-08 20:38:34 +0900

r44057 のあたりで rb_id2str() が返す String オブジェクトが fstring になったので fc_path() や classname() などの関数で dup していたのが不要になったので削除しています。

nobu:r44077 2013-12-08 20:47:39 +0900

rb_get_kwargs() で結果を取得する VALUE の配列 values が NULL でなければ、キーワード引数が格納されている Hash からチェックしたキーワード引数のエントリを削除するようにしています。これにより未知のキーワード引数を受け取れるように optional に負の数値を指定した時に、残りの未知のキーワード引数のみ Hash に残るので rest keyword arguments に相当する引数の取り出しが C API から簡単に実現できるようになっています。