ruby-trunk-changes r52653 - r52673

今日は拡張ライブラリ socket の recvmsg{_nonblock} の Windows 版での修正やマシンスタックオーバフロー時の処理の不具合修正、GC.disable と GC.start の関係の変更などがありました。

usa: r52653 2015-11-19 00:55:39 +0900

ext/extmk.rb に --extflags というオプションを追加して EXTLDFLAGS を拡張ライブラリのビルドに伝播させるようにしています。

svn: r52654 2015-11-19 00:55:58 +0900

version.h の日付更新。

usa: r52656 2015-11-19 01:48:37 +0900

configure で mingw では -static-libgcc というコンパイラオプションを追加するようにしています。

akr: r52657 2015-11-19 02:22:34 +0900

r52647 で追加した拡張ライブラリ socket の UDPSocket#recvmsg のテストで recvmsg の戻り値の rflags のチェックは rflags が nil でない時だけ行うようにしています。 Solaris 10 では struct msghdr::msg_control がなくて rflags が nil になるのでエラーになってたようです。 [ruby-core:71557] [Bug #11709]

usa: r52658 2015-11-19 02:53:20 +0900

拡張ライブラリ socket の BasicSocket#recvmsg{_nonblock} の実装で Windows など struct msghdr::msg_control がない環境受け取るメッセージのサイズに合わせてバッファサイズを拡張するのを第1引数の最大受信サイズが nil (省略)された時だけにするようにしています。

nobu: r52659 2015-11-19 08:26:47 +0900

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

nobu: r52660 2015-11-19 08:33:08 +0900

gc.c の rb_raw_obj_info() で TYPE() でオブジェクトの型を取得しているところを BUILTIN_TYPE() に変更しています。 BUILTIN_TYPE() は即値オブジェクトに対応する分岐を省いているので、ここでは既に SPECIAL_CONST_P() で分岐済みなので冗長な分岐を除去しているようです。

usa: r52662 2015-11-19 13:59:50 +0900

Windows 版の socket のエラー処理で WSAEMSGSIZE というエラーを無視するようにしています。 r52647 のテストの失敗を修正するためだそうです。 twitter 上でみかけたところによると、UDP のメッセージがバッファサイズより大きかったら、バッファの限界まで読み込みはした上で残りは捨ててこのエラーが返されるそうなのですが、この挙動は POSIX でも同様なのでエラーを無視するようにしているそうです。 https://twitter.com/unak/status/667206073376337921 https://twitter.com/unak/status/667369555493195776

nobu: r52663 2015-11-19 14:12:14 +0900

iseq_peephole_optimize() で末尾再帰の最適化の適用を、leave 命令をみつけて、その前が send/opt_send_without_block/invokesuper/opt_aref/opt_aref_with/opt_aset/opt_aset_with などの命令だったら最適化するようにしていたのを、逆に send/invokesuper をみつけて、その後任意個数の nop を挟んで leave があるというパターンを検出して最適化をかけるようにしています。これで nop が挟まる時も最適化されるようになるのと、opt_xxx の特殊命令は最適化によって作られるので、それらの最適化の前に実施する(命令列のリストをなめて最適化していく時に、末尾再帰の最適化が send を見た時点で実施される)ので特殊命令になる前に実施できる、ということみたいです。

usa: r52664 2015-11-19 14:16:13 +0900

r52662 の追加修正で Windows 版の socket のエラー処理 finish_overlapped_socket() で result には整数をセットするようにしています。

nobu: r52665 2015-11-19 14:58:31 +0900

ruby.c で ISeq のコンパイルオプションのデフォルト設定を DEFAULT_FEATURES という enum 定数に切り出すリファクタリング

hsbt: r52666 2015-11-19 15:16:19 +0900

RubyGems を 2.5.0 の最新版 (commit hash c6b4946) に更新しています。ぱっとみた感じ通信のエラー処理やパフォーマンス改善のためのリファクタリングといった感じですが、依存関係解決の部分にも少し手が入っているようなのでそのあたりの不具合修正もあるかもしれません。

ko1: r52667 2015-11-19 15:33:05 +0900

iseq_compile_each() で T_IMEMO の iseq 用オブジェクトのデバッグ用メッセージ出力の引数で r_iseqw_new() で wrapper object を作るようにする変更の追随漏れがあった(通常は preprocessor によって消えるのでエラーにならない)のを追随させています。 [ruby-core:71446] [Bug #11676]

ko1: r52668 2015-11-19 15:54:35 +0900

マシンスタックのスタックオーバフロー検出の check_stack_overflow() でオーバフローを検出して例外を発生させる時に received_signal と共にruby_disable_gc も 0 にクリアするようにしています。 SIGBUS, SIGSEGV, SIGILL などの致命的な signal 受信時にハンドラ実行中にさらにシグナル受信した場合を考慮した処理の check_reserved_signal() で GC を抑制するようにしているので、それをクリアしないといけなかったようです。 [ruby-core:71497] [Bug #11692]

nobu: r52669 2015-11-19 17:56:12 +0900

ruby の --enable-xxx/--disable-xxx のオプションの処理で enable と disable の処理が別々の関数で実装されていたので、共通部分を feature_option() という関数に括り出すリファクタリング

nobu: r52670 2015-11-19 19:45:04 +0900

ARGV についての rdoc 用コメントが ARGV に $0 も含まれるように記述されていたので修正しています。 [ruby-core:71561] [Bug #11711]

ko1: r52671 2015-11-19 20:13:27 +0900

gc_writebarrier_generational() や gc_writebarrier_incremental() で引数の順序を入れ換えることで引数をレジスタ渡しされやすくするようにする最適化や、rb_gc_writebarrier() で LIKELY() の利用をやめる最適化。LIKELY() 使うと関数のコードが配置される位置が変化して、かえって遅くなるみたいです。以前も r52389 で LIKELY() 削ってましたね。

ko1: r52672 2015-11-19 21:57:20 +0900

GC.start は GC.disable されている状態だと GC を実行しないようになっていたので、GC.start のほうを強くして強制的に GC を実行するようにしています。

akr: r52673 2015-11-19 22:49:58 +0900

拡張ライブラリ socket の BasicSocket#recvmsg{_nonblock} の読み込みバッファサイズの取得について struct msghdr::msg_control の有無で分岐していたところで結果的に同様の処理をするようになった部分を分岐の外に出しています。