ruby-trunk-changes r52249 - r52273

今日はメソッド呼び出しの最適化(引数やローカル変数の少ないメソッドの呼び出しを高速に)や --enable-frozen-string-literal-debug オプションの追加、標準添付ライブラリ forwardable の潜在的不具合修正、また mkmf.rb の link するライブラリの探索ルールの修正(revert)などがありました。

shugo: r52249 2015-10-24 00:41:04 +0900

標準添付ライブラリ forwardable で rescue 節の Exception が利用するクラスに同名の定数が定義済みだとトップレベルの Exception ではなくてそちらを参照してしまうので ::Exception と明示的に名前空間を指定するようにしています。 [ruby-core:71175] [Bug #11615]

svn: r52250 2015-10-24 00:41:21 +0900

version.h の日付更新。

knu: r52251 2015-10-24 01:53:41 +0900

NEWS ファイルの obj.?meth 記法のエントリに引数が呼び出しが行なわれる時のみ評価される点について追記しています。また doc/syntax/calling_methods.rdoc の typo 修正。

ko1: r52252 2015-10-24 01:57:58 +0900

VMDEBUG というデバッグ用マクロ定義とコメントを vm_insnhelper.h から vm_core.h に移動しています。

ko1: r52253 2015-10-24 02:00:51 +0900

struct rb_call_cache の関数型のメンバ call の型を inline で書いていたのを vm_call_handler として typedef するようにしています。

ko1: r52254 2015-10-24 02:53:35 +0900

メソッド呼び出しの最適化で、tool/mk_call_iseq_optimized.rb というツールを追加してこれで引数の数が 0〜3、ローカル変数の数が 1〜6 の時の vm_call_iseq_setup_normal_0start_Nparams_Mlocals() (N と M はそれぞれ引数とローカル変数の数)という特別化された関数を vm_call_iseq_optimized.inc というファイルに生成して、条件が合ったらこれを呼び出すようにしています。これらの関数は引数の数とローカル変数の数に依存した分岐がなくなっていてそのぶん速い…と書かれているのですが、生成された関数群も結局 vm_call_iseq_setup_normal() の param_size と local_size にリテラルで引数を渡すようにしているだけなので、これで最適化されるってことは inline 化された時にコンパイラがうまいことループ展開とかしてくれるってことですかね。条件に合うメソッドの呼び出しのベンチマークでは 8.3% 程度の高速化がみられて、逆に条件に合わないものは inline cache miss で 3.4% 遅くなるとのこと。引数やローカル変数の数をこの範囲に収めるようにする最適化が流行りそうですね。なおここでのローカル変数の数には special variable が含まれているので、実際に書かれているローカル変数はこれより1か2少ないものが対象になると思います(つまり 4個が5個まで)。

svn: r52255 2015-10-24 02:53:51 +0900

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

svn: r52256 2015-10-24 02:53:53 +0900

r52254 で新規追加されたファイルの svn property 設定と改行コードの変換。

ko1: r52257 2015-10-24 04:02:55 +0900

コマンドラインオプションに --enable-frozen-string-literal-debug というのを追加して、"can't modify frozen String" の例外のメッセージに対象の文字列が作られたファイル名と行数を表示するようにしています。compile 時に fstring に内部的なインスタンス変数を付与するようにしているため、デフォルトの挙動ではなくてオプションを付けた時だけ有効にしています。

ko1: r52258 2015-10-24 04:13:51 +0900

r52257 の追加。 --enable-frozen-string-literal-debug オプションを有効にするための VM の compile option 追加漏れ。

nobu: r52259 2015-10-24 07:29:14 +0900

r52249 と同様に標準添付ライブラリ forwardable で文字列で eval するためのソースコードで定数参照している部分で Forwardable -> ::Forwardable と絶対パス名前空間を指定するようにしています。 [ruby-core:71176] [Bug #11616]

nobu: r52260 2015-10-24 07:41:06 +0900

magic comment の parse で compile option を設定する時の magic comment は大文字小文字を無視するので、小文字化した文字列を渡すようにしています。

nobu: r52261 2015-10-24 08:37:44 +0900

make incs で他の *.inc ファイルと同様に r52254 で導入した vm_call_iseq_optimized.inc を生成するように common.mk のルールに追加しています。

nobu: r52262 2015-10-24 08:54:50 +0900

r52261 の common.mk への追加で nmake 用の {$(VPATH)} の後に "/" を入れてしまっていたので削っています。

shugo: r52263 2015-10-24 12:01:55 +0900

r52254 で vm_insnhelper.c に vm_call_handler() の型定義が追加されていましたが、これは r52253 で vm_core.h に追加されたものが誤ってコピーされた? みたいなので削っています。

duerst: r52264 2015-10-24 12:47:40 +0900

メソッド呼び出しの引数の数の不一致で ArgumentError を発生させる時の例外メッセージに "N for M" のように書かれていたのを (given N, expected M) のように変更しています。 [Feature #9025]
うーん、元のメッセージもわかると思いますけどね…。まあ、こんなメッセージに依存しているのは ruby 自体のテストくらい、だと思いたいですね。

nobu: r52265 2015-10-24 15:42:22 +0900

と思ったら予想通り ruby のテストが r52264 で変更した ArgumentError のメッセージに依存していたので追随させています。 [Feature #9025] [ruby-core:71178] [Bug #11617]

nobu: r52266 2015-10-24 16:35:57 +0900

undef 時の対象のメソッドの method entry がみつからなかった時の例外発生の処理に rb_method_name_error() を利用するようにしてシンプルにしています。

sorah: r52267 2015-10-24 21:10:48 +0900

r45640 で標準添付ライブラリ mkmf で $LIBPATH を優先させるようにしていましたが、この影響で /usr/lib などに libruby が存在すると、拡張ライブラリが本来対象の ruby の libruby ではなくそちらに link してしまうという問題があったので、これを revert しています。最近だと rbenv などで system wide なパスではないところに ruby がインストールされることが多いので、拡張ライブラリがリンクしたいライブラリは /usr/lib にあるけど libruby はそこにあるのを link したくない、というような時にコマンドラインを正しく作ろうと思うとなかなか大変みたいです。 [ruby-core:62100] [Bug #9760]

svn: r52268 2015-10-24 21:11:22 +0900

r52266 の行末の空白除去。

nobu: r52269 2015-10-24 21:16:55 +0900

r52265 の続きで r52264 で ArgumentError のメッセージが変更されたのに FileUtils のテストも追随させています。 [Feature #9025], [ruby-core:71178] [Bug #11617]

hsbt: r52270 2015-10-24 22:51:25 +0900

Haiku でのビルド失敗の修正で configure.in のライブラリについての変数の設定を Linux/*BSD などと同じにしているのと、拡張ライブラリ socket で #include の追加や #define _BSD_SOURCE の追加などを行なっています。 https://github.com/ruby/ruby/pull/984

naruse: r52271 2015-10-25 02:36:07 +0900

r52216 で追加した Net::IMAP#idle の timeout 引数のテストで 0.1 sec 待つようにしていたのですが、FreeBSD 上でテストがこけるようで 0.2 にのばしています。

svn: r52272 2015-10-25 02:36:36 +0900

version.h の日付更新。

naruse: r52273 2015-10-25 03:21:39 +0900

r52229 で長いコマンドラインの Process.spawn のテストで負荷軽減のため rlimit_nproc: オプションをつけたのですが、Windows ではこのオプションは利用できなかったので RUBY_PLATFORM をみてオプションの有無を変更するように追加対応しています。