ruby-trunk-changes r49774 - r49782

今日は RubyGems の 2.4.6 への更新、AIX 向けの pty の修正、Enumerable#each_slice や #each_cons にとても大きな数を渡した時のエラーの修正などがありました。

hsbt: r49774 2015-02-27 22:00:45 +0900

RubyGems を 2.4.6 に更新しています。 https://github.com/rubygems/rubygems/pull/1159 https://github.com/rubygems/rubygems/pull/1171 https://github.com/rubygems/rubygems/pull/1173 などを修正しています。 拡張ライブラリを含む gem のロードパスのサーチ順の修正も入っているはずですね。

odaira: r49776 2015-02-28 08:32:48 +0900

拡張ライブラリ pty で AIX 向けの ioctl(2) の呼び出しの条件コンパイルの条件を追加しています。 [ruby-core:58539] [Bug #9144]

svn: r49777 2015-02-28 08:32:58 +0900

version.h の日付更新。

nobu: r49778 2015-02-28 15:02:06 +0900

無名クラス/モジュール(Module.new で作られて定数に代入されていないもの)の下に追加されたクラス/モジュールの名前を作る時にエンコーディングを保持するようにしています。

nobu: r49779 2015-02-28 15:42:29 +0900

rb_tmp_class_path() でクラス名の文字列をすぐに作らずに Qnil や Qfalse を返して、cache 用関数で make_temporary_path() という関数を呼んでそこで文字列生成するようにしています。どうせすぐ cache 用関数を呼ぶのに、と思ったら rb_search_class_path() という関数が新規作成されていて、こいつは cache 用関数として never_cache() という関数を利用するので実際に文字列を生成せずに Qnil, Qfalse のまま結果を取り出せるようです。まだ使っているところはありませんが。

nobu: r49780 2015-02-28 15:44:22 +0900

r49779 で追加した rb_search_class_path() をさっそく利用して、vm_dump.c の rb_vm_bugreport() でシグナルハンドラ内で無名クラスの名称のためにメモリ確保されるのを抑制して、Qnil や Qfalse がかえってきたらポインタ表示にするようにしています。

nobu: r49781 2015-02-28 17:18:42 +0900

Enumerable#each_slice や Enumerable#each_cons で引数に渡されたサイズが receiver のサイズを越えていたら receiver のサイズまで小さくしたり、結果を作らないようにしています。内部的に無条件で指定されたサイズの配列オブジェクトを作ろうとしてエラーになっていたのを回避しています。 [ruby-core:68335] [Bug #10913]

nobu: r49782 2015-02-28 18:09:18 +0900

r49781 で導入した Enumerable#each_slice や #each_cons のサイズチェックですが、size メソッドで取得したサイズが Fixnum の時だけ比較して、そうでなければ(つまりサイズが Bignum 以上なら)切り詰めはしないようにしています。 NUM2ULONG() で変換できない場合を回避しているのだと思います。まあ実際にはその場合は配列のメモリ確保でエラーになってしまいそうですが。