ruby-trunk-changes r43219 - r43241

今日は TracePoint の b_return イベントが lambda からの return でも呼ばれるようにする変更などがありました。

nobu:r43219 2013-10-09 23:57:04 +0900

Module#attr_reader, attr_writer, attr_accessor などのメソッドで属性名を文字列で与えた時にチェック前に Symbol を生成してしまっていたので、チェックが通ってから Symbol 化することで不要な Symbol 生成を抑制しています。rb_is_attr_name() が static 関数なのに定義されているだけで利用されていないようです。 と思ったら id_for_setter() というマクロが展開された中で呼ばれていました。

mame:r43222 2013-10-10 00:08:41 +0900

Fixnum#[] でインデックスが Fixnum で表現できるビット数より大きい時は符号bitを返していましたが、ぴったり同じだった時にも符号bitを返すようにしています。64bit 環境で 1L << 63 の結果が未定義なので(ISO/IEC 9899 (C99) 6.5.7 によると)、このようなシフト演算を回避するようにしています。

svn:r43223 2013-10-10 00:08:47 +0900

version.h の日付更新。

nobu:r43224 2013-10-10 00:17:20 +0900

テストで assert_raise +α のかわりに assert_raise_with_message を利用するようにするリファクタリング

ko1:r43231 2013-10-10 06:04:12 +0900

r43224 のテストのリファクタリングで未定義のローカル変数を参照してしまっていた不具合を修正しています。

nobu:r43232 2013-10-10 11:11:37 +0900

VM がメソッド定義などの VM コアの動作のために使うメソッドを定義している FrozenCore というクラスの特異クラスも Ruby から ObjectSpace などで見えないように隠しています。

nobu:r43233 2013-10-10 12:13:34 +0900

klass を 0 にして ObjectSpace からも見えなくした文字列オブジェクトから再び Ruby スクリプトから見えるコピーを生成する rb_str_resurrect() で str_duplicate() という関数を利用するようにするリファクタリング

ko1:r43234 2013-10-10 13:56:32 +0900

GC 中や GVL の解放中などでオブジェクト生成や Ruby の処理の呼び出しが行えないところで、後で実行するために処理を登録しておく rb_postponed_job_register() などの API で登録する postoned job の構造を single linked list から配列に変更しています。配列サイズは固定(MAX_POSTPONED_JOB という定数で 1024 に定義されています)にしていて、これを超えたらエラーを返すようにしています。
たぶん malloc 回数が頻繁になって GC 絡みでパフォーマンスとかの考慮した変更かと思われます。今 postponed job は finalizer の実行のために使われていますがバッファサイズが 1024 で充分なのかというのがちょっと気になりますね。その呼び元では戻り値を無視していますし。

nobu:r43235 2013-10-10 15:33:34 +0900

numeric.c で finite() の宣言を Windows 環境ではしないように条件を修正しています。 ruby/win32.h で既にしているためとのこと。

nobu:r43236 2013-10-10 15:33:38 +0900

win32/win32.c の rb_w32_write_console() でメモリ確保関数の戻り値をチェックしていなかったのを修正してエラーを返すようにしています。

ko1:r43237 2013-10-10 17:31:48 +0900

TracePoint の :b_return イベントが lambda{ return } のような lambda タイプの Proc オブジェクトの中で return した時にもフックが呼ばれるようにしています。 [ruby-core:55924] [Bug #8622]

glass:r43238 2013-10-10 21:06:01 +0900

st.c に st_table のキーを Array に格納したものを返す st_keys() という API を追加して、Hash#keys の実装で利用するようにしています。これは st_table のキーの st_data_t が VALUE だという前提を置いていることになりますね。

glass:r43239 2013-10-10 21:37:58 +0900

Array#compact! の実装で配列サイズを切り詰めた時に capacity も小さくする処理を rb_resize_smaller() という既にあった関数を利用するようにリファクタリングしています。リファクタリングと書きましたが、capacity を小さくする条件として ARY_DEFAULT_SIZE との比較が変化していますね。元は ARY_DEFAULT_SIZE の2倍より大きかったら小くしていたのが ARY_DEFAULT_SIZE より大きいときにリサイズするようになっています。

glass:r43240 2013-10-10 23:02:52 +0900

Array#| の実装で Hash に要素を追加しておいてそのキーを取り出すところを rb_hash_keys() を利用するようにリファクタリングしています。

glass:r43241 2013-10-10 23:04:55 +0900

r43240 の変更で rb_ary_or() の不要になったローカル変数の宣言を削除しています。