ruby-trunk-changes r46854 - r46867

今日は Array#any? と Hash#any? を Enumerable#any? とは別途定義して、最適化されたループ処理になるようにしています。ただ Array のほうは問題がありそう…

nobu: r46854 2014-07-18 01:54:59 +0900

iseq.h の catch table のサイズを計算する iseq_catch_table_bytes() でサイズが int の上限を越えないようにチェックを追加しています。越えたら rb_fatal() で強制終了ですが。

svn: r46855 2014-07-18 01:55:05 +0900

version.h の日付更新。

hsbt: r46856 2014-07-18 10:16:12 +0900

標準添付ライブラリ fileutils の FileUtils.touch の rdoc 用コメントに利用可能なオプションに mtime, nocreate を追加しています。 https://github.com/ruby/ruby/pull/669

nobu: r46857 2014-07-18 10:47:01 +0900

configure に --with-destdir というオプションを追加して DESTDIR の指定をオプションからできるようにしています。 ふむ、なに用だろう。

nobu: r46858 2014-07-18 10:53:18 +0900

vm_insnshelper.h の組み込みの演算子の種類を示すフラグを vm_core.h に移動して vm.c のグローバル変数に持ってた再定義の有無を持つ redefined_flag を rb_vm_t のメンバに移動しています。

nobu: r46859 2014-07-18 11:10:37 +0900

Enumerable#any? でレシーバが Array や Hash で each メソッドが再定義されていなかった場合はメソッド呼び出しを経由せず直接ループを回すようにする最適化を入れています。 r46858 で vm_core.h に移動した演算子再定義のフラグのマクロを参照しています。 https://github.com/ruby/ruby/pull/671

nobu: r46860 2014-07-18 11:18:16 +0900

r46859 の ChangeLog で参照している GitHub の pull request の番号がまちがっていたので修正しています。

hsbt: r46861 2014-07-18 17:48:05 +0900

標準添付ライブラリ matrix の conjugate, eigensystem, real, imaginary, lup, rect などのメソッドのテストを追加しています。 [ruby-core:63809] [Feature #10057]

marcandre: r46862 2014-07-18 19:04:15 +0900

標準添付ライブラリ matrix の Matrix#+ と Matrix#- で後置 unless 文の条件に優先順位の低い演算子 and を使っていたのをコーディングスタイルの統一のため && に変えています。 [ruby-core:63812] [Feature #10058]

marcandre: r46863 2014-07-18 19:11:18 +0900

標準添付ライブラリ matrix で Vector.sendの呼び出しにかっこをつけるようにしています。 これもかっこありのところとなしのところがあるので統一のためとのこと。 [ruby-core:63812] [Feature #10058]

suke: r46864 2014-07-18 19:56:31 +0900

拡張ライブラリ win32ole の folevariant_initialize() で変数に代入してそのまま使っていないところがあったので不要な処理を削っています。

nobu: r46865 2014-07-18 22:16:37 +0900

r46859 の Enumerable#any? の最適化(と r46860 での ChangeLog の修正)を revert しています。 特に理由は書かれていませんけど RubyCI をみるとテストが失敗してたみたいなのでそのせいかな。あきらかに関係しているテストというふうでもないので別口かもしれませんが。

nobu: r46866 2014-07-18 22:16:48 +0900

r46859 のリベンジで Array#any? と Hash#any? の最適化バージョンの実装を追加して Array と Hash は any? を独自に実装する方針に変更しています。 なるほど、each の再定義をチェックするのじゃなくて、Array#any? と Hash#any? は each を再定義しても動作は変わらないようにしたという感じですね。
ところで、rb_ary_any_p() で最初に RARRAY_LEN() で配列サイズを取得して、それをそのままループに使っているんですが、rb_yield() を呼んでいるところで Ruby の処理に入るので、配列のサイズがループ中に変化したり、RARRAY_CONST_PTR() もポインタの指す先が変化する恐れがあるんじゃないでしょうか。

suke: r46867 2014-07-18 22:40:41 +0900

拡張ライブラリ win32ole で WIN32OLE_VARIANT.new に VT_RECORD(整数の 36 らしい。よく理解していませんが)を渡した時にチェックして例外を発生させるようにしています。 VT_RECORD は WIN32OLE_VARIANT じゃなくて WIN32OLE_RECORD を使うべきとのこと。