ruby-trunk-changes r49607 - r49614

今日は IO.console の不具合修正と多重代入で左辺値が attrset だった時の最適化などがありました。

nobu: r49607 2015-02-16 12:27:02 +0900

拡張ライブラリ io/console で r48993 での IO.console の Symbol を渡すことでメソッドを呼ぶ機能追加の時に引数の数のチェックを間違っていた(任意の個数の引数を受け付けるようにしたつもりが1つしか受け取れなくなってた)のを修正しているのと、rb_funcall() へ間違った引数の渡しかたをしていたので rb_funcallv() を使うように修正しています。でもこれも r49609 で再修正されています。

svn: r49608 2015-02-16 12:27:13 +0900

version.h の日付更新。

nobu: r49609 2015-02-16 12:43:18 +0900

拡張ライブラリ io/console の IO.console の Symbol 渡しによるメソッド呼び出し部分で、引数の Symbol が mortal symbol だったら Kernel#__send__ を使って呼び出すことで不要な pindown を抑制するようにしています。

nobu: r49610 2015-02-16 12:43:20 +0900

拡張ライブラリ io/console で IO#raw や IO#getch などでオプション引数のチェックのための min と time という Symbol の ID を実行時に rb_intern() していたのを初期化時に一度取得して static 変数に格納しておくようにしています。

nobu: r49611 2015-02-16 12:58:28 +0900

error.c でも実行時に様々な文字列を rb_intern() して ID を求めていたところを、初期化時に求めておいて static 変数に格納して使いまわすようにしています。

nobu: r49612 2015-02-16 13:08:52 +0900

rb_funcall() を利用しているところで引数がないものを rb_funcallv() の呼び出しに全体的に変更しています。可変長引数の処理部分を省くためかと思いますが、rb_funcall() も n が 0 だと分岐していきなり rb_call() を呼ぶから分岐を1つ減らせる程度ですね。

nobu: r49613 2015-02-16 14:14:48 +0900

configure でコンパイラのビルトイン関数 __builtin_choose_expr() と __builtin_constant_p() が利用できるかチェックしているところで、実際に真偽値や定数/変数を渡して結果が期待したとおりになっているかの確認もするようにしています。

nobu: r49614 2015-02-16 20:58:52 +0900

詳しくは後述のささださんの日記の後半にありますが、a[x], a[y] = 0, 1 のように左辺値が attrset である多重代入で中間データとして配列を作っていたのを、代入する/される要素の数が 2つだった時は newarray + expandarry で順番を保存するようにしていたのを、swap 命令で VM スタックの top 2つの要素を入れ変えることで順番を保持して配列の作成を抑制するように最適化しています。
http://kokizzu.blogspot.jp/2015/02/c-java-hhvm-ruby-nodejsrhinojscspidermo.html というブログ記事のベンチマークを受けてささださんが ruby のメモリ使用量を削減するように業務命令を受けて調査中に判明した最適化の余地をさっそく修正したようです。 http://www.atdot.net/~ko1/diary/201502.html#d16