ruby-trunk-changes r54159 - r54187

今日は [1, 2.0].inject(:+) のように Float を含む配列の inject(:+) でも最適化が効くように拡張されているのと、Fixnum と Integer でそれぞれメソッド定義を持っていたものを Integer や Numeric に統合していく変更がありました。

mame: r54159 2016-03-18 00:18:59 +0900

Numeric#step で引数 step の 0 チェックで rb_num_corece_cmp() を使っていたのを rb_equal() に変更しています。中間オブジェクトの生成を抑制する最適化のようです。

svn: r54160 2016-03-18 00:18:59 +0900

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

svn: r54161 2016-03-18 00:18:59 +0900

version.h の日付更新。

akr: r54162 2016-03-18 00:27:05 +0900

r54120 や r54147 の続きで、さらに Array の 要素が Fixnum, Bignum に続いて Float になった場合もメソッド呼び出しをせずに直接計算する最適化を有効にしています。どんどん配列の要素の総和を取るのが最適化されていきますね。

mrkn: r54163 2016-03-18 02:07:29 +0900

bignum.c の rb_big_odd_p() と rb_big_even_p() を公開関数にしています。 include/ruby/intern.h に追加しているので、third party の拡張ライブラリからも利用できるという意味で公開 C API にしています。
[追記]これは間違いだったみたいで r54196 で internal.h に宣言が移動されています。[/追記]

mrkn: r54164 2016-03-18 02:11:42 +0900

Bignum#even?, Bignum#odd?, Fixnum#zero?, Fixnum#even?, Fixnum#odd? などのメソッド定義は削除して、それぞれ Integer#event?, Integer#odd?, Numeric#zero? での実装でまとめて扱うように統合しています。ふーむ組み込みの数値クラスはこういう流れなんですね。

mrkn: r54165 2016-03-18 02:15:33 +0900

r54164 で Integer#even? の修正が漏れていたのを追加しています。

mrkn: r54166 2016-03-18 02:17:08 +0900

r54164 のメソッド定義削除で不要になった Fixnum のメソッド用の関数を削除しています。

sonots: r54167 2016-03-18 02:46:22 +0900

標準添付ライブラリ time の Time.parse および Time.strptime でタイムゾーンが無視されているのを修正して DateTime と同様の挙動にしています。 https://github.com/ruby/ruby/pull/1297 [ruby-core:74423] [Bug #12190]

mrkn: r54168 2016-03-18 10:22:38 +0900

Bignum#hash メソッドもメソッド定義は削除して、Object#hash で rb_big_hash() を呼び出すように統合しています。また rb_big_hash() を公開 C API にしています。がこれは意図的ではなかったようで後で internal.h に宣言が移動されてます。

sonots: r54169 2016-03-18 10:26:12 +0900

拡張ライブラリ date の DateTime#to_time でタイムゾーンの情報が破棄されてローカルタイムになってしまっていたのを修正しています。 https://github.com/ruby/ruby/pull/1295 [ruby-dev:49521] [Bug #12189]

nobu: r54170 2016-03-18 12:25:32 +0900

r54145 で powerpc64 向けの tick_t の定義を追加した時にかっこの対応が間違っていたのを修正。 https://github.com/ruby/ruby/pull/1291

nobu: r54171 2016-03-18 15:59:10 +0900

File.split の実装で rb_file_s_dirname() を使っていたのを rb_file_dirname() を直接呼ぶようにしています。rb_file_s_dirname() はクラスメソッド定義用の関数で内容はすぐ rb_file_dirname() を呼んでるだけなので意味は同じですね。

nobu: r54172 2016-03-18 16:22:26 +0900

parse.y の parse_numvar() で nth_ref_max という変数は INT_MAX または FIXNUM_MAX の 1/2 のどちらか小さいほうにしていましたが、INT_MAX の 1/2 との比較にしています。これにより境界付近の整数をリテラルとして書くとエラーになっていたようです。うーむ、こんな不具合が潜んでいたとは…。 https://github.com/ruby/ruby/pull/1296 [ruby-core:74444] [Bug #12192]

nobu: r54173 2016-03-18 16:37:07 +0900

r54115 で finalizer 登録を ObjectSpace 毎に行うようにした変更で引数に追加した objspace を見ずに rb_thread_t::vm を参照してたところがあったので追加修正しています。

nobu: r54174 2016-03-18 17:00:57 +0900

File.dirname のテストでなぜかファイル名との前方一致でチェックしていたところをディレクトリ名が正しいかどうかちゃんと確認するようにしています。

mrkn: r54175 2016-03-18 21:33:28 +0900

Fixnum#to_s のメソッド定義を Integer#to_s に移動しています。メソッドの実体の関数はそのままなのかな…と思ったら Bignum の統合は次で実現されてました。

mrkn: r54176 2016-03-18 21:57:40 +0900

r54175 の続きで Bignum#to_s のメソッド定義およびその実装関数を削除して、int_to_s() に統合しています。

mrkn: r54177 2016-03-18 22:11:09 +0900

Bignum#eql? のメソッド定義を削除して Numeric#eql? の実体の関数 num_eql() で Bignum の時も処理できるようにしています。

mrkn: r54178 2016-03-18 22:33:42 +0900

r54168 で include/ruby/intern.h に追加していた rb_big_hash() の宣言を internal.h に移動しています。公開 C API にするつもりではなく他のソースファイルから呼び出すために公開するという意図だったようです。

mrkn: r54179 2016-03-18 23:52:46 +0900

Fixnum#to_f のメソッド定義も削除して Integer#to_f に移動しています。

svn: r54180 2016-03-18 23:52:48 +0900

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

mrkn: r54181 2016-03-19 00:02:45 +0900

r54179 の続きで Bignum#to_f のメソッド定義も削除して実装を Integer#to_f に統合しています。

svn: r54182 2016-03-19 00:02:46 +0900

version.h の日付更新。

nobu: r54183 2016-03-19 00:38:10 +0900

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

odaira: r54184 2016-03-19 03:05:47 +0900

r54137 で DST を考慮したテストのスキップをしていましたが、Time.now で作った Time オブジェクトとテスト用に決まった時刻を指すオブジェクトで gmtoff を比較しているから問題なので、Time.now の時刻から timespec_new で作った Time オブジェクトとの比較をするようにしてスキップしないようにしています。

nobu: r54185 2016-03-19 03:09:52 +0900

parse.y の parser_mark() で struct parser_params::debug_buffer の mark 漏れしていたのを修正しています。

naruse: r54186 2016-03-19 04:06:32 +0900

glibc で struct tm の tm_gmtoff メンバの宣言が有効になるには time.h ヘッダの #include 前に _BSD_SOURCE というマクロが定義されてないといけないみたいなので、time.c に追加して configure での構造体メンバ存在チェック時にも定義してからチェックするようにしています。

naruse: r54187 2016-03-19 04:06:33 +0900

time.c の HAVE_GMTIME_R によって #ifdef で分岐していた関数定義などを rb_gmtime_r() と rb_localtime_r() という関数内の分岐におさめてシンプルにしています。 rb_localtime_r() と rb_localtime_r2() や rb_gmtime_r() と rb_gmtime_r2() とプリプロセッサによる分岐部分を関数として切り出していたものはまとめて rb_localatime_r() と rb_gmtime_r() という関数に収めるようにリファクタリングされています。