ruby-trunk-changes r41151 - r41186

今日は akr さん無双の日で、主に昨日までに実装していた rb_integer_pack()/rb_integer_unpack() を使ってあちこちの Bignum の処理を置き換える変更がありました。また Module#include で定数の定義をおきかえた時にインラインキャッシュがクリアされないことがある不具合の修正がありました。

akr:r41151 2013-06-08 00:02:39 +0900

rb_integer_pack() および rb_integer_unpack() の word order と byte order(エンディアン)の指定を個別の引数でしていたのをビットフラグで指定するようにしています。

svn:r41152 2013-06-08 00:02:44 +0900

version.h の日付更新。

akr:r41153 2013-06-08 00:10:26 +0900

r41151 で入った internal.h の空行を削除しています。

akr:r41154 2013-06-08 00:39:07 +0900

rb_integer_pack()/rb_integer_unpack() から使うユーティリティ関数(?)の関数名を int -> integer にしたり pack という名称を含めるようにする関数名変更を行なっています。

akr:r41155 2013-06-08 00:56:59 +0900

r41154 で改名された integer_pack_loop_setup() の引数から word_num_nailbytes_ret を削除しています。 rb_integer_pack()/rb_integer_unpack() の引数からは対応する引数の nails は残っていますが、ループの条件で word_num_nailbytes は利用しないようにしています。

akr:r41156 2013-06-08 06:01:42 +0900

random.c の mt_state() でバイト列を Bignum オブジェクトに変換するのに rb_integer_unpack() を利用するようにしています。

akr:r41157 2013-06-08 06:16:12 +0900

random.c から不要になった numberof() マクロの定義を削除しています。

akr:r41158 2013-06-08 07:16:15 +0900

rb_integer_pack()/rb_integer_unpack() のビットフラグによる word order と byte order (エンディアン)の指定が不正だった時のエラーメッセージを修正しています。

akr:r41159 2013-06-08 08:12:55 +0900

random.c の random_load() という関数で Integer(Fixnum/Bignum) からバイト列を生成するのに rb_integer_pack() を利用するようにしています。なるほどー、このような処理が頻出していたから汎用的に使える rb_integer_pack()/rb_integer_unpack() を作っていたんですね。

akr:r41160 2013-06-08 09:50:40 +0900

random.c の int_pair_to_real_inclusive() で uint32_t の配列から Integer を生成するのに rb_integer_unpack() を利用するようにしています。

akr:r41161 2013-06-08 11:18:14 +0900

random.c の int_pair_to_real_inclusive() で Bignum からバイト列を生成するのに rb_integer_pack() を利用するようにしています。

akr:r41162 2013-06-08 12:01:33 +0900

random.c の int_pair_to_real_inclusive() で乗算のために rb_big_mul() を直接呼んでいたのを "*" メソッドの呼び出し(rb_funcall()に変更しています。 r41160 での rb_integer_unpack() の利用に伴い常に Bignum だったところが Fixnum になる可能性がでてきたためです。

nobu:r41163 2013-06-08 14:17:04 +0900

Windows 版で使う NET_LUID というマクロは r41094 で MinGW の 32bit 版と 64bit 版で有無が異なるということで条件分岐が修正されましたが、どうも実際にはコンパイラのバージョンで変化するらしく、configure で存在チェックをするようにしています。
このコミットでこれ以前の ChangeLog がごっそり削られてしまっていますね。

akr:r41164 2013-06-08 14:40:46 +0900

r41163 で削られてしまった ChangeLog のエントリを復活させています。

akr:r41165 2013-06-08 15:00:04 +0900

rb_integer_unpack() の引数で使えるフラグのビットとして数値の範囲によらず Bignum を返すことを指定する INTEGRE_PACK_FORCE_BIGNUM を追加しています。
また random.c の int_pair_to_real_inclusive() でこのフラグを利用することで r41162 で rb_big_mul() を直接呼ばずに rb_funcall() で "*" メソッドを呼ぶようにしたのをやっぱり rb_big_mul() を直接呼ぶように戻しています。

akr:r41166 2013-06-08 15:00:23 +0900

r41165 の ChangeLog エントリの行末の空白除去。

akr:r41167 2013-06-08 15:46:45 +0900

random.c の rand_init() でも rb_integer_pack() を利用するようにしています。
またこれに伴なって不要になった roomof() というマクロの定義を削除しています。

akr:r41168 2013-06-08 16:01:19 +0900

clang でのコンパイル時に int の引数に size_t を渡してエラーになっていた(リポジトリから直接チェックアウトした ruby は警告をエラー扱いにするようにオプションが指定されているため) random.c の rand_init() での関数呼び出しの引数に明示的なキャストを追加しています。

akr:r41169 2013-06-08 16:40:03 +0900

rb_integer_unpack() で rb_funcall() でメソッド呼び出しで演算していたところを numwords の範囲をチェックして可能なら直接計算するようにする最適化を施しています。また random.c の make_seed_value() でも rb_integer_unpack() を利用するようにしています。またこのために seed を int の配列として定義していたのを uint32_t の配列としてワード幅を明示的に指定するようにしています。

akr:r41170 2013-06-08 17:15:51 +0900

random.c の make_seed_value() でバッファサイズとして渡す引数を直前で計算しているのに常に DEFAULT_SEED_CNT という定数を渡してしまっていたのを修正しています。

akr:r41171 2013-06-08 19:05:37 +0900

random.c の limited_big_rand() という static 関数で引数に struct RBignum * を受け取っていたのを VALUE 型で受け取って rb_integer_pack()/rb_integer_unpack() でこの関数内で変換するように変更しています。

akr:r41172 2013-06-08 19:07:05 +0900

random.c で RBignum の中身を見るために定義していたマクロ群の定義を削除しています。

naruse:r41173 2013-06-08 19:26:36 +0900

r41163 で configure で NET_LUID をチェックするようにしたので win32/Makefile.sub で生成する config.h に HAVE_TYPE_NET_LUID の定義を追加しています。 mswin32/mswin64 向けとのこと。 この定義にさらに条件分岐が必要かどうかは usa さんのレビューが必要と書かれています。

charliesome:r41174 2013-06-08 19:33:05 +0900

random.c の limited_big_rand() で変数 rnd, lim を long と定義していたのが環境によっては警告を発生させるため uint32_t 型に宣言するように修正しています。

charliesome:r41175 2013-06-08 19:48:33 +0900

Module#include が呼ばれた時にインラインキャッシュ*1をクリアするためのチェックに Module が定数を含むかどうかというチェックを追加しています。メソッド追加後に定数を含む Module を include すると、その後のメソッド呼び出しでその定数を参照しても新しい定数のほうが参照されなかったようです。これは不具合修正ですね。

akr:r41176 2013-06-08 20:25:07 +0900

time.c の rb_big_abs_find_maxbit() で bignum.c で定義した rb_absint_size() を利用するようにして、不要になった bdigit_find_maxbit() を削除しています。

akr:r41177 2013-06-08 21:05:57 +0900

bignum.c に rb_absint_singlebit_p() という関数を定義して time.c の v2w_bignum() から利用するようにしています。このため不要になった rb_big_abs_find_minbit() の定義を削除しています。しかしどうもこの後この関数は利用されなくなったみたいです。

akr:r41178 2013-06-08 21:48:39 +0900

r41177 の続きと思われますが time.c の v2w_bignum() の定義をごっそり書き替えています。このため r41177 で追加した rb_absint_singlebit_p() は利用されなくなっています。しかし bignum.c での関数定義は残っています。

naruse:r41179 2013-06-08 22:00:42 +0900

r41173 で win32/Makefile.sub での config.h のマクロ定義の追加をしても mswin でのビルドエラーが直らなかったため r41163 で HAVE_TYPE_NET_LUID を参照するようにした変更を一旦 revert しています。
しかしどうもこのエラーを検出した CI の実行は r41163 が入る前のものだったみたいなので後でこの変更も revert されそうです。

akr:r41180 2013-06-08 22:31:35 +0900

time.c の v2w() で Bignum の数値を保持するバイト数を計算するのに rb_absint_size() を呼び出すようにリファクタリングしています。オブジェクトが持ってるバッファサイズではなくて実際に数値を格納するのに必要なサイズを得るようにしています。

akr:r41181 2013-06-08 23:14:46 +0900

marshal.c の r_object0() でも Bignum をロードするのに rb_integer_unpack() を利用するようにしています。

kazu:r41182 2013-06-08 23:26:04 +0900

r41163 の ChangeLogtypo 修正。

akr:r41183 2013-06-08 23:57:28 +0900

numeric.c の rb_num_to_uint() でも Bignum の数値を表現するサイズを取得するのに RBIGNUM_LEN() のかわりに rb_absint_size() を利用するように変更しています。

akr:r41184 2013-06-09 00:57:05 +0900

Hash のキーの hash が Bignum を返した時のテストで、利用するローカル変数を間違えていて意図しないテストになっていたのを修正しています。

svn:r41185 2013-06-09 00:57:09 +0900

version.h の日付更新。

akr:r41186 2013-06-09 01:00:16 +0900

hash.c の rb_hash() で Bignum の数値の最も下位の桁(least significant)の long 型の数値を切り出すのに rb_integer_pack() を利用するようにリファクタリングしています。

*1:ChangeLog には method cache と書かれていますがメソッドだけでなく定数のアクセスにも使われるキャッシュですね