ruby-trunk-changes r43398 - r43413

今日は Array#to_h, Enumerable#to_h メソッドの追加や GC のパラメータを設定する環境変数の追加などがありました。

nobu:r43398 2013-10-23 22:51:05 +0900

VC 2013 で C99 数学関数の提供が始まったため(?) missing.h での代替の宣言が警告になっていたので $(RT_VER) をチェックして HAVE_XXX を定義して余分な宣言を消すようにしています。 [ruby-core:57981] [Bug #9044]

tmm1:r43399 2013-10-24 00:05:22 +0900

メモリ管理で page を追加/解放する条件につかうパラメータの名称を変更しています。 free_min -> min_free_slots, free_min_page -> max_free_slots としています。元の名前があまりにもわかりにくかったですね。

svn:r43400 2013-10-24 00:05:31 +0900

version.h の日付更新。

marcandre:r43401 2013-10-24 00:10:48 +0900

Array#to_h と Enumerable#to_h という Hash への変換メソッドを追加しています。2要素(キーと値)の配列の配列やそれに類するものを Hash に変換し、配列(に変換できるオブジェクト)でなかったり要素数が 2 でないものはエラーにならず無視されるという仕様のようです。 [ruby-core:48988] [Feature #7292]
まとまらなさそうだったのでこのチケット読んでなかったんですけど、入ることになってたんですね。

marcandre:r43402 2013-10-24 00:13:19 +0900

標準添付ライブラリ ostruct.rb の OpenStruct で freeze されたインスタンスを変更しようとした時に TypeError を発生させていたのを RuntimeError に変更しています。 https://github.com/ruby/ruby/pull/383

marcandre:r43403 2013-10-24 00:13:38 +0900

同じく標準添付ライブラリ ostruct.rb の OpenStruct#delete_field で削除すべきメソッドの指定に一部引数を文字列化したものを使っていたのを to_sym で Symbol にしたものを文字列化して使うようにしています。普通は一致するはずですが、to_sym を定義したクラスのオブジェクトや to_sym を再定義していた時などに対応しているものと思います。 https://github.com/ruby/ruby/pull/383

marcandre:r43404 2013-10-24 00:13:57 +0900

OpenStruct#each_pair がブロックなしで呼ばれた時に生成する Enumerator が Enumerator#size に正しい値を返せるように size 指定ブロックつきで生成するようにしています。 https://github.com/ruby/ruby/pull/383

marcandre:r43405 2013-10-24 00:14:17 +0900

標準添付ライブラリ ostruct.rb で OpenStruct#method_missing でフィールドのアクセスのメソッドを偽装しているところで、対応するフィールドがみつからなくて NoMethodError 例外を発生させる時にバックトレースを呼び元の位置にすりかえています。 https://github.com/ruby/ruby/pull/383

nobu:r43406 2013-10-24 01:34:14 +0900

r43405 の ChangeLog エントリのインデント修正。

nobu:r43407 2013-10-24 01:34:17 +0900

r43398 の続きで VC 2013 を検出するのに使っている $(RT_VER) の番号を修正しています。また log2(x) を log2(x) と定義(#define で)しているのですが、これはなんだろう……。 [ruby-core:57992] [Bug #9044]

nobu:r43408 2013-10-24 01:34:22 +0900

VC 2013 で INFINITY の定義の警告除去をしているそうです。これもよくわからないですねぇ。多分古い VC で INFINITY の型が異なるとか? [ruby-core:57981] [Bug #9044]
[ruby-core:57985] にあるように mswin32 の math.h で INFINITY がオーバーフローする乗算を使って定義されているため警告が出ていたのを回避しようとしているそうです。

tmm1:r43409 2013-10-24 07:47:29 +0900

メモリ管理で新たに page を追加する時に page 内に含む slot 数を増やす上限値を指定できるようにして、それを越えた数の slot を一度に追加しないようにしています。パラメータはデフォルトでは 0 で無効化されていて、環境変数 RUBY_HEAP_SLOTS_GROWTH_MAX で指定できるようです。 NEWS にも追記が必要そうですね。 [ruby-core:57928] [Bug #9035]

kosaki:r43410 2013-10-24 12:15:58 +0900

メインスレッド以外の全スレッドを停止させる rb_thread_terminate_all() で子スレッドの停止の割り込みを待つため native_sleep() でタイムアウトの指定なしで sleep しているところにその理由をコメントで追記しています。

kosaki:r43411 2013-10-24 12:25:25 +0900

rb_thread_terminate_all() にもう一箇所、受け取った割り込みが例外だった場合はまだ子スレッドが残っているのでリトライするというコメントを追記しています。

zzak:r43412 2013-10-24 12:48:54 +0900

Module#const_get, const_set の rdoc 用コメントに第1引数が定数名として使える名前(大文字で始まる識別子)でない時に NameError を発生させることを追記しています。

marcandre:r43413 2013-10-24 21:58:54 +0900

"+(binary)" と
"-(binary)" という Symbol が作れないという不具合(?)を修正しています。 parse.y でパーサが使うトークン用のテーブルがあって、いくつかのシンボルが事前に登録されていたのですが、そのなかに二項演算子の +/- のために "+(binary)" と "-(binary)" という名前で '+' と '-' のトークンが登録されていたために Symbol 化する前の文字列と Symbol 化した後の文字列が変化してしまうという現象があったようです。 [ruby-core:57995] [Feature #9048]