ruby-trunk-changes r57504 - r57514

今日は Fixnum の加算/減算のオーバーフロー処理の最適化や IO#write, IO#syswrite の最適化の続きなどがありました。

kazu: r57504 2017-02-03 00:12:29 +0900

標準添付ライブラリ fcntl の magic comment frozen_string_literal を true に変更しています。

svn: r57505 2017-02-03 00:12:30 +0900

version.h の日付更新。

naruse: r57506 2017-02-03 00:54:51 +0900

ops_plus, ops_minus などの VM の最適化命令と fix_plus(), fix_minus() で FIX2LONG() で変換して計算後に LONG2FIX() で戻していたのを rb_fix_plus_fix() と rb_fix_minus_fix() という inline 関数を internal.h に導入してこれを利用するようにしています。これらの関数では gccLLVM の __builtin_add_ovewflow() や __builtin_sub_ovewflow() を利用して、Fixnum の VALUE が常に最下位ビットが立っているということを利用して、overflow 時の判定と処理を最適化しています。

naruse: r57507 2017-02-03 02:07:28 +0900

r57506 の __builtin_add_overflow() などの組み込み関数の configure での存在チェック時に使う引数の数の間違いなどを修正しています。

normal: r57508 2017-02-03 03:59:40 +0900

io_fwrite(), rb_io_syswrite() などで rb_ensure() を使って例外発生時にも一時オブジェクトの強制回収(rb_str_tmp_frozen_release() の呼び出し)をするようにしていましたが、IO 操作時の例外発生はそれこそ例外的で頻繁に通るパスではなく、また例外オブジェクトが既に作られているので一時オブジェクトも GC による回収にまかせてもいいだろう、ということで直接呼ぶようにしています。これにより通常のケースを高速化するのが目的のようですね。

nobu: r57509 2017-02-03 15:11:32 +0900

r57507 と書いてあるけど r57506 の __builtin_add_overflow() などを用いた overflow 処理の実装の修正。 LSB を MSB にもってくる rb_ulong_rotate_right() はやりたいことを表す rb_overflowed_fix_to_int() と名前を変更して、明示的な型キャストを追加しています。

nobu: r57510 2017-02-03 15:23:34 +0900

rb_ensure() で例外オブジェクトではない th->errinfo がセットされていた時に ensure 節に相当する関数の実行時にその errinfo が見えてしまっていたので Qnil でリセットしておくようにしています。拡張ライブラリで Exception を期待して触って SEGV することがあったみたいですね。 [ruby-core:79371] [Bug #13176]

nobu: r57511 2017-02-03 15:48:02 +0900

r57510 でテスト用の拡張ライブラリに追加した raise() という関数名が raise(2) と衝突していたので exc_raise() に改名しています。 [ruby-core:79371] [Bug #13176]

hsbt: r57512 2017-02-03 21:39:04 +0900

拡張ライブラリ zlib に gemspec ファイルを追加しています。おお、ついに zlib もかー。 [ruby-core:79408] [Feature #13186]

nobu: r57513 2017-02-03 21:52:08 +0900

make test-all などで -j オプションの先頭に 't' がついていた時に :testing オプションを有効にする処理を OptionParser の on のブロック内でやっていましたが OptionParser#on は正規表現を引数に渡してチェックできるので、そこでマッチさせてグループの情報を取得してオプションに設定するようにリファクタリングしています。正規表現でチェックできるのは知ってましたが、こんなふうにグループ化したらブロック引数に分解されて渡されるのは知りませんでした。

nobu: r57514 2017-02-03 21:52:09 +0900

test/lib/test/unit.rb の並列テスト機能で MAKEFLAGS から --jobserver-auth を抜き出してきてこれを流用するようにしているようです。 fd を流用しているみたいだけどいいのかな。