ruby-trunk-changes r52625 - r52648

今日は Refinements とメソッド再定義の組み合わせでの不具合修正や、昨日の socket の recvmsg などの変更にまつわる不具合修正、メソッド再定義の警告を include した Module のメソッドの上書きでも出せるようにする変更などがありました。

normal: r52625 2015-11-18 07:00:23 +0900

r52602 の BasicSocket#recvmsg{_nonblock}() の Ruby wrapper メソッド化で第2引数 dlen のデフォルト値を nil にして、C 実装のメソッドで読めるだけ読むようにしています。けどバッファサイズのデフォルト(初期値)が 4096 から 4061 に変化してしまっていますね…。ただの書き間違いかな? [ruby-core:71517] [Bug #11701]

nobu: r52626 2015-11-18 09:25:29 +0900

configure.in で AC_ARG_VAR() で cflags, cppflags, cxxflags などのフラグを指定して --help で説明が出るようにしているようです。 AC_ARG_VAR() は precious variable というものを宣言するもので、--help に出る以外にも、環境変数からは取り込まないなど、機能的にも意味があるようです。ふーむ。 optflags とかもそうでしたよね、と思ったけど他に AC_ARG_VAR() はなかったので optflags=-O0 ./configure みたいなのは OK なのかな。確かだめだったような記憶があったのですが。

あと全く関係ありませんが、"precious variable" と書かれると「いとしい変数」って訳したくなりますね(「いとしいへんしゅう」とかかな)。

nobu: r52627 2015-11-18 09:26:07 +0900

configure の --with-ruby-pc (pkg-config 用の ruby.pc ファイルを指定するオプション)の help メッセージを修正しています。

sonots: r52628 2015-11-18 09:53:14 +0900

r52620 で導入された Logger#reopen のテストが mswin 版でエラーになったそうなのでその対応をしています。 Windows では開かれているファイルを削除することができないので、別のファイル名で開きなおすテストに変更しているようです。 [ruby-core:71520] [Bug #11702]

shugo: r52629 2015-11-18 10:08:19 +0900

doc/syntax/refinements.rdoc に Refinements の 2.1 以降の変更について追記/変更しています。 using が toplevel でしかできないみたいに書かれてるので結構古い記述になっていたみたいですね。 [ruby-core:71466] [misc #11681]

normal: r52630 2015-11-18 10:18:30 +0900

r52625 のバッファサイズの修正。 4061 はやっぱり 4096 の typo だったようです。

usa: r52631 2015-11-18 10:37:34 +0900

r52602 の BasicSocket#recvmsg{_nonblock}() の Ruby wrapper メソッド化で struct msghdr::msg_control が存在しないプラットフォームで recvmsg(2) が errno=EMSGSIZE を返した時にバッファサイズの拡張を行うようにしています。主に Windows 向けの修正みたいです。

nobu: r52632 2015-11-18 11:08:17 +0900

compile.c の iseq_peephole_optimize() で branchif, branchnil, branchunless などの命令のジャンプ先のラベルの直後の命令が jump だったら、その jump の飛び先に直接飛ぶようにする最適化で INSN::insn_id をチェックする前にそれを参照してもいいかどうか INSN::link::type をチェックしておくようにしています。

nobu: r52633 2015-11-18 11:32:17 +0900

さらに iseq_peephole_optimize() で branchif や branchunless の直前にリテラルなどで真偽があらかじめわかっていてジャンブしない場合は分岐命令自体を消すようにしています。 defined? などでこの最適化が効く命令列が現れるらしいです。

nobu: r52634 2015-11-18 16:09:27 +0900

r52633 で追加した peephole optimization に説明のコメントを追記しています。

ko1: r52635 2015-11-18 17:08:09 +0900

gc.c の主にデバッグ用の関数 rb_raw_obj_info() で即値の VALUE の値にも対応するようにしたり、method entry 用の T_IMEMO オブジェクトの出力に owner を追加したりしています。

ko1: r52636 2015-11-18 17:15:51 +0900

r52614 のリベンジで rb_method_definition_t::complemented_count というフィールドを追加して alias_count とは別に Module を include した時の参照数を管理してメソッド再定義の警告が出せるようにしています。

ko1: r52646 2015-11-18 21:10:07 +0900

r52636 の続きで RCLASS_EXT()->callable_m_tbl のかわりに RCLASS_CALLABLE_M_TBL() マクロを使って callable method table にアクセスするようにしています。

akr: r52647 2015-11-18 22:19:01 +0900

拡張ライブラリ socket の UDPSocket#read, #recv, #recvmsg などで読むサイズを指定した時のテストケースを追加しています。

ko1: r52648 2015-11-18 22:59:57 +0900

Class/Module のオブジェクトの RCLASS_CALLABLE_M_TBL() でアクセスできる callable method table には継承したメソッドや include された Module のメソッドなどの参照をキャッシュしているのでメソッド再定義したり新たに include した時にクリアしないといけないのですが、Refinements を考慮すると複雑な参照状態になりうるので、再帰的に method entry のキャッシュクリアするようにしています。 refine のブロック内でのメソッド再定義がちゃんと影響するようにするための修正です。これで r52509 で追加されていたテストが通る状態になりました。 [ruby-core:71423] [Bug #11672]