ruby-trunk-changes r42693 - r42710

今日は RubyGems 2.1.0.rc.2 のマージ、IO#read_nonblock や IO#write_nonblock に読み書きできない時に例外を返す代わりに値を返す挙動をするオプションの追加、IO#copy_stream の不具合修正、昨日の Timeout.#timeout の変更の再修正などがありました。

drbrain:r42693 2013-08-27 05:24:51 +0900

同梱されている RubyGems のバージョンを 2.1.0.rc.1 から 2.1.0.rc.2 に更新しています。全体的にサブコマンドのドキュメントの修正があった他、rubygems/basic_specification.rb で詳細は不明ですが require 時のパス解決の修正(?)、specification ファイルの扱いの修正などがあった模様です。

svn:r42694 2013-08-27 05:24:59 +0900

version.h の日付更新。

tenderlove:r42695 2013-08-27 07:41:44 +0900

IO#read_nonblock にキーワード引数 exception を追加して、これに false を指定するとまだ読めない時に例外を発生させるかわりに :wait_readable を返すようにしています。また StringIO と OpenSSL::Buffering の read_nonblock もこの仕様追加に追随しています。ただしこれらは :wait_readable ではなくて nil を返すようです。なんでここ統一しないんでしょうね……。また write_nonblock も同様にキーワード引数 exeption を追加して例外を発生させずに :wait_writable を返すようにしています。こちらも OpenSSL::Buffering も追随させています(StringIO もメソッドの引数の追加は対応していますが、書き込めないことがないので処理内容に変更はありません)。 [ruby-core:38666] [Feature #5138]
このチケットすっかり見落していたーと思ったらかなり前から議論が続いていて、先日の開発者会議でプレゼンして採用が決まったものだったみたいですね。ただこの変更で stringio に変数の宣言がブロックの途中で行なわれていて VC でコンパイルエラーになっていたり、Linux で OpenSSL のテストがエラーになっていたりするのでもう少し手が入ると思われます。

tenderlove:r42696 2013-08-27 07:50:23 +0900

NEWS ファイルに r42695 の IO#read_nonblock, write_nonblock の変更について追記しています。

ko1:r42697 2013-08-27 11:49:08 +0900

GC::Profiler.clear の最初に rest_sweep() を呼んで Lazy Sweep 中だったら sweep を完了させるようにしています。 Lazy Sweep 中は profile.current_record を触ってしまう可能性があるため一旦 sweep を完了させるとのことです。

marcandre:r42698 2013-08-27 11:50:08 +0900

Enumerator.new には size メソッドで予測サイズを返すために Proc オブジェクトを渡すことができるのですが、これを Proc に限らず call メソッドが呼べるオブジェクトなら受け付けるようにしています。 [ruby-core:56032] [Bug #8641] https://github.com/ruby/ruby/pull/362

marcandre:r42699 2013-08-27 11:52:49 +0900

r42698 の ChangeLog エントリを追加しています。

ko1:r42700 2013-08-27 13:04:33 +0900

r42695 の ext/stringio/stringio.c の変更でブロックの途中で変数を宣言していたところがあったので、宣言をブロックの先頭に移動しています。

nobu:r42701 2013-08-27 16:08:32 +0900

rb_check_funcall()、rb_check_funcall_hook()、rb_check_funcall_with_hook() などの関数の argv 引数(VALUE の配列)に const を付加する変更です。

nobu:r42702 2013-08-27 16:11:10 +0900

vm_insnhelper.h に HEAP_CLASS_OF() という RBASIC_CLASS() と全く同じマクロが定義されていて VM 周辺て使われていたので RBASIC_CLASS() を利用するように書きかえています。

nobu:r42703 2013-08-27 16:11:49 +0900

vm_insnhelper.c の vm_search_method() の条件分岐で同じ処理が別の分岐に書かれていたのを1箇所にまとめるようにリファクタリングしています。

nobu:r42704 2013-08-27 16:46:08 +0900

Array#index でオブジェクトの同値判定をする時に VM で Fixnum, Float, String などの一部の組込みクラスのオブジェクト同士で、比較メソッドが再定義されていないの時にメソッド呼び出しをしないショートカットの実装を利用するようにして最適化しています。 [ruby-core:56809] [Feature #8820]
rb_equal_opt() が Qfalse を返した時に continue しているので ptr, len を再取得してない、と思いましたが rb_equal_opt() はメソッド呼び出しをしないためそのあいだに ary が書き変わることはないはずなのでそのケースでは再取得する必要がなく、最適化版の比較ができなくてメソッド呼び出しに委譲した時だけ再取得するようにしているので、これで正しいのでした。

nobu:r42705 2013-08-27 16:51:27 +0900

Enumerator#each で struct enumerator::args の配列のサイズが int のサイズに収まらなかった時に例外を発生させるようにしているようです。

nobu:r42706 2013-08-27 16:56:17 +0900

r42705 の変更についてオーバフローチェックをしている旨コメントで追記しています。

nobu:r42707 2013-08-27 16:56:52 +0900

r42698 の Enumerator.new に渡すオブジェクトの call が呼べることを確認するのに rb_respond_to() を呼ぶかわりに rb_check_funcall() でチェックと呼び出しまで一度に行うようにしています。少し効率化。

nobu:r42708 2013-08-27 17:02:34 +0900

io.c の copy_stream_body() で O_NOCTTY という定数マクロが定義されているかどうかで #ifdef で分岐しているところが複数あったので、ローカル変数に代入しておいてそれを使うことで分岐を一ヶ所にまとめるようにしています。

nobu:r42709 2013-08-27 17:03:00 +0900

IO#copy_stream で rb_io_ascii8bit_binmode() を呼んでバイナリモードにしたうえでエンコーディングを ASCII-8BIT で出力(転送)するようにしています。 [ruby-core:56556] [ruby-core:56518] [Bug #8767]

nobu:r42710 2013-08-27 17:18:50 +0900

r42690 の Timeout.#timeout の修正で引数に利用する例外クラスが指定された時にもデフォルトの Timeout::ExitException で例外発生(を throw にすりかえ)していたので指定された時はその例外の発生にするようにしています。。あー、昨日の解説間違ってましたね。常に throw に置き換えになってました。でこのコミットでやっぱり明示的に例外クラスが指定されたら元の挙動をするように一部元の実装に戻しています。