今日はいくつかの Math のメソッドで引数に Fixnum を渡した時の高速化や、if 文や &&, || などで条件部分(左辺値)がリテラルだった場合の最適化などがありました。
nobu: r49433 2015-01-29 10:41:54 +0900
math.c で数値オブジェクトを double へ変換する Get_Double() というマクロを導入して、Fixnum の時は rb_to_float() を呼ばずに直接 double へキャストするようにしています。高速化のためみたいですね。 to_f を呼ばなくなるので再定義が効かなくなるという非互換はありますが…。実用的にはまあ許容できるような気もします。 [ruby-core:67822] [Feature #10785]
nobu: r49434 2015-01-29 10:42:12 +0900
r49434 の再修正で、Get_Double() で直接キャストするのは Fixnum#to_f が再定義されていない時だけにしています。なるほど、これで再定義時の非互換は回避できそうですね。 [ruby-core:67822] [Feature #10785]
nobu: r49435 2015-01-29 17:03:24 +0900
parse.y に if 文の条件部がリテラルの nil, true, false だったり文字列リテラルだったりして真偽が静的にわかる場合は IF ノードを省略して直接実行すべきノードを返す new_if_gen() という関数を定義して、これを使うようにしています。 制御構造としての意味を持つ && や || でも(logop_gen()) 同様の最適化を行っています。
nobu: r49436 2015-01-29 17:26:45 +0900
tool/rbinstall.rb で Makefile の変数の置換つき展開のために ":" と書きたいところで Path separator を使っていた(Unix 系だと ":" だけど Windows だと ";" なので意図した Makefile にならない)のを修正しています。
hsbt: r49437 2015-01-29 20:28:31 +0900
tool/make-snapshot で表示するパッケージのチェックサムから MD5 を削除しています。おお、ついに MD5 は使わないようにするんですね。次からリリースパッケージのチェックサムに MD5 はなくなるかもしれません。
nobu: r49438 2015-01-29 22:22:39 +0900
r49435 の再修正。 logop_gen() で || や or で左辺値がリテラルの nil, false だった時に左辺ノードを 0 にクリアしてしまっていたのを修正しています。
nobu: r49439 2015-01-29 22:22:45 +0900
r49435 の更に再修正。 logop_gen() で defined? の引数ではこの最適化は実行しないようにしています。
mrkn: r49440 2015-01-29 23:34:43 +0900
拡張ライブラリ bigdecimal で Rational の構造体を遮蔽するようになった 2.2.0 から導入された rb_rational_num() と rb_rational_den() や構造体 struct RRational を利用していたため古い ruby で gem install で gem パッケージ版のインストールができなくなっていたのを修正しています。 存在しなかったら代替を自前実装するようにしています。 [ruby-core:67867] [Bug #10796]
marcandre: r49441 2015-01-30 00:56:58 +0900
String#to_s の rdoc 用コメントで String を継承したサブクラスでは to_s は String に変換されたものが返される点を追記しています。
svn: r49442 2015-01-30 00:57:10 +0900
version.h の日付更新。