ruby-trunk-changes r47849 - r47859

今日も AIX 対応や潜在的メモリリーク修正、細かい最適化などがありました。

nobu: r47849 2014-10-08 23:49:49 +0900

インスタンス変数のセットの時も st_lookup()+st_insert() などしていたのを st_update() を利用するように変更しています。

nobu: r47850 2014-10-09 00:53:11 +0900

Dir. メソッドの rdoc 用コメントに引数に配列を受け付けるように書かれていましたが、実際には受け付けないのでこの記述を削除しています。 Dir.glob は配列を受け付けていますが Dir は受け付けないようです。 そのかわり Dir[*ary] のように複数の引数として受け取ることができます。 [ruby-core:65265] [Bug #10294]

svn: r47851 2014-10-09 00:53:22 +0900

version.h の日付更新。

odaira: r47852 2014-10-09 07:31:53 +0900

missing/setproctitle.c で main() の argv を直接書き変えないようにしています。 AIX ではここを書き変えると ps(1) コマンドの結果に影響してしまうそうです。 [ruby-core:63998] [Feature #10090]

normal: r47853 2014-10-09 12:39:02 +0900

rb_any_hash() で VALUE が即値の時に SYMBOL_P() でチェックしていたのを STATIC_SYM_P() に置き換えています。即値なので dynamic symbol であることはチェックする必要がなく、こうすることで少しコード量が減るそうです。

normal: r47854 2014-10-09 12:44:12 +0900

benchmark/bm_hasharef_sym.rb bm_hasharef_sym_long.rb という Hash#[] に Symbol をキーとしてアクセスするベンチマークで %i{} 記法を使うことで強制的に static symbol 化して GC 対象にしないようにしています。Symbol GC のないバージョンと比較して不利にならないようにしているようです。

nobu: r47855 2014-10-09 13:35:12 +0900

ary_new() で Array オブジェクトを生成する時に、バッファを確保した後でオブジェクトのスロットを確保しようとしていたので、ここで例外が発生すると確保したバッファ用のメモリ領域がリークする可能性があったのを修正しています。

normal: r47856 2014-10-09 16:16:19 +0900

st_foreach() と st_foreach_check() のテストを追加しています。 st_foreach()/st_foreach_check() では要素数の変更で packed 状態のテーブル(配列に直接キーと値を詰めた状態)から unpack する機能があるのですが、それがテストされていないということで、テスト用の C の拡張ライブラリを追加してテストしています。コールバック関数から force_unpack_check() という関数を読んで要素を追加して unpack させて期待通り unpack されていることを確認しています。 チェックもほぼ C でやっていて rb_bug() で止めてるので、assert_nil じゃなくて assert_separately で子プロセスを作ってそこでやったほうがよさそうですね。 [ruby-core:65396] [Feature #10321]

svn: r47857 2014-10-09 16:16:24 +0900

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

nobu: r47858 2014-10-09 16:53:54 +0900

gcc 拡張(多分)を使って、可変長引数を渡して Array オブジェクトを作る rb_ary_new_from_args() に wrapper マクロを導入して、呼び元でコンパイル時にスタック上の配列に引数を格納してから rb_ary_new_from_values() を呼ぶように変換するようにしています。

nobu: r47859 2014-10-09 16:53:59 +0900

拡張ライブラリ tk でも struct RTypedData を使った実装に切り替えています。また内部で使うキューのオブジェクトの klass を 0 にして ObjectSpace.each_object から見えないようにしています。