ruby-trunk-changes r37495 - r37541

今日はまず Enumerator#size というメソッドの追加に関するコミットが大量にあります。また CGI#header の挙動の変更や refinement の不具合修正などもありました。

marcandre:r37495 2012-11-07 02:09:43 +0900

Enumerator.new にブロックを渡さずに引数にオブジェクト(レシーバ)とメソッド名を指定して呼ぶ方法を利用した時に警告を出力するようにしています。 この使いかたはもともと deprecated になっていました。*1 [ruby-core:45805] [Feature #6636]

svn:r37496 2012-11-07 02:09:49 +0900

version.h の日付更新。

marcandre:r37497 2012-11-07 02:10:06 +0900

Enumerator#size というメソッドを追加しています。 これは Enumerator の要素の数、つまり yield する回数を返します。無限に止まらないものは Float::INFINITY を、いつ止まるかわからないものは nil を返すという仕様です。 また Enumerator.new に size 引数を受け付けるようにしています。これは数値を指定すればその数値(Float::INFINITY 含む)を、Proc オブジェクトを指定すればその Proc を呼び出した結果を Enumerator#size の結果として返すようにしています。 Proc オブジェクトを受け付けているのは、Enumerator を作る時点ではサイズがわからなくて、しかし呼び出した時点ではわかる(配列を to_enum で Enumerator にして、その後要素を追加する、など)ということがあるので、その場合に元となるオブジェクトを受け取って Proc オブジェクトを呼び出すことで Enumerator#size を呼んだ時点でサイズを計算できるようにするためです。 また C API からはこのサイズ計算は C の関数も登録でき、RETURN_ENUMERATOR という Enumerator を生成するマクロに RETURN_SIZED_ENUMERATOR という亜種を追加してサイズ決定関数を登録しつつ Enumerator を生成する方法を提供しています。 [ruby-core:45805] [Feature #6636]

marcandre:r37498 2012-11-07 02:10:20 +0900

Enumerator を生成するためのもうひとつの方法である Object#to_enumenum_for をブロックを受け付けるようにしています。このブロックは Enumerator#size の計算のためのもので、 r37497 の Enumerator.new の size 引数に Proc オブジェクトを渡した時のものと同等の扱いだと思います。 [ruby-core:45805] [Feature #6636]

marcandre:r37499 2012-11-07 02:10:35 +0900

Enumerator#with_index および with_object がブロックを省略した呼び出しでさらに Enumerator を返す時に RETURN_SIZED_ENUMERATOR() 関数マクロを使って Enumerator#size に対応した Enumerator を返すようにしています。 [ruby-core:45805] [Feature #6636]

marcandre:r37500 2012-11-07 02:10:50 +0900

Array の each, each_index, reverse_each, sort_by, collect, collect!, select, select!, keep_if, reject, reject!, delete_if といった Enumerable のメソッドがブロックなしで呼び出された時にかえす Enumerator はを size 対応しています。配列のサイズを返すようにしています。 [ruby-core:45805] [Feature #6636]

marcandre:r37501 2012-11-07 02:11:06 +0900

Array#permutation の返す Enumerator の size 対応をしています。 配列サイズと組み合わせ数で計算しています。 [ruby-core:45805] [Feature #6636]

marcandre:r37502 2012-11-07 02:11:21 +0900

Array#combination が返す Enumerator の size 対応です。 [ruby-core:45805] [Feature #6636]

marcandre:r37503 2012-11-07 02:11:36 +0900

Array#repeat_permutation の返す Enumerator の size 対応。 [ruby-core:45805] [Feature #6636]

marcandre:r37504 2012-11-07 02:11:51 +0900

Array#repeat_combination の返す Enumerator の size 対応をしています。 [ruby-core:45805] [Feature #6636]

marcandre:r37505 2012-11-07 02:12:05 +0900

Array#cycle の返す Enumerator の size 対応。 cycle は止まらないから Float::INFINITY かと思ったらサイズが 0 の時とか Array#cycle の引数で繰り返し回数が指定できるなどの仕様があってもうちょっと複雑でした。 [ruby-core:45805] [Feature #6636]

marcandre:r37506 2012-11-07 02:12:20 +0900

Kernel#loop が返す Enumerator の size 対応。 今度こそ Float::INFINITY を常に返します。 [ruby-core:45805] [Feature #6636]

marcandre:r37507 2012-11-07 02:12:35 +0900

Enumerable のメソッドでブロックを省略した時に返す Enumerator を size 対応しています。 [ruby-core:45805] [Feature #6636]

marcandre:r37508 2012-11-07 02:12:50 +0900

Enumerable#each_slice の返す Enumerator の size 対応です。 [ruby-core:45805] [Feature #6636]

marcandre:r37509 2012-11-07 02:13:04 +0900

Enumerable#each_cons のブロックを省略した時に返す Enumerator の size 対応です。 [ruby-core:45805] [Feature #6636]

marcandre:r37510 2012-11-07 02:13:19 +0900

Enumerable#cycle でブロックを省略した時に返す Enumerator の size 対応です。 [ruby-core:45805] [Feature #6636]

marcandre:r37511 2012-11-07 02:13:33 +0900

Hash の Enumerator を返す各種メソッドで size 対応した Enumerator を返すようにしています。 [ruby-core:45805] [Feature #6636]

marcandre:r37512 2012-11-07 02:13:48 +0900

ENV オブジェクトのメソッドが返す Enumerator の size 対応。 [ruby-core:45805] [Feature #6636]

marcandre:r37513 2012-11-07 02:14:02 +0900

Struct の each, each_pair, select のブロックを省略した時に返す Enumerator の size 対応。 [ruby-core:45805] [Feature #6636]

marcandre:r37514 2012-11-07 02:14:16 +0900

ruby_float_step() から引数を VALUE -> double に変換する部分を除いて本体を ruby_float_step_size() として切り出すリファクタリング。この後 Enumerator#size 対応のために使うのでしょう。 [ruby-core:45805] [Feature #6636]

marcandre:r37515 2012-11-07 02:14:31 +0900

Numeric#step の返す Enumrator の size対応。 [ruby-core:45805] [Feature #6636]

marcandre:r37516 2012-11-07 02:14:46 +0900

Range#size で要素数を返すメソッドを追加しています。 また Range#each でブロックを省略した時に返す Enumerator の size 対応をしています。 [ruby-core:45805] [Feature #6636]

marcandre:r37517 2012-11-07 02:15:00 +0900

Range#step が返す Enumerator の size 対応。

marcandre:r37518 2012-11-07 02:15:15 +0900

Integer#upto, downto でブロックを渡さずに呼んだ時に作る Enumerator の size 対応。 [ruby-core:45805] [Feature #6636]

marcandre:r37519 2012-11-07 02:15:30 +0900

Integer#times で返す Enumerator の size 対応。 [ruby-core:45805] [Feature #6636]

marcandre:r37520 2012-11-07 02:15:45 +0900

String の Enumerator を返すメソッドで Enumerator#size 対応をしています。 [ruby-core:45805] [Feature #6636]

marcandre:r37521 2012-11-07 02:15:59 +0900

Enumerable#lazy で返す Enumerator::Lazy も Enumerator を継承したクラスなので size に対応したものを返すようにしています。 [ruby-core:45805] [Feature #6636]

marcandre:r37522 2012-11-07 02:16:13 +0900

Enumerator::Lazy の各種メソッドの返す Enumerator の size 対応。

marcandre:r37523 2012-11-07 02:16:29 +0900

Enumerator::Lazy#take が返す Enumerator::Lazy の size 対応をしています。 [ruby-core:45805] [Feature #6636]

marcandre:r37524 2012-11-07 02:16:44 +0900

Enumerator::Lazy#drop の返す Enumerator の size対応です。 [ruby-core:45805] [Feature #6636]

marcandre:r37525 2012-11-07 02:16:58 +0900

Enumerator::Lazy#cycle の返す Enumerator::Lazy の size 対応をしています。 [ruby-core:45805] [Feature #6636]

marcandre:r37526 2012-11-07 02:17:12 +0900

NEWS ファイルに Enumerator#size に関連してメソッドの追加など記述を追加しています。 [ruby-core:45805] [Feature #6636]

luislavena:r37527 2012-11-07 03:50:53 +0900

拡張ライブラリ zlib の extconf.rb でターゲットのライブラリとして zlibwapi というライブラリもチェックするようにしています。 [ruby-core:44979] [Feature #6421]

luislavena:r37528 2012-11-07 04:40:42 +0900

test/ruby/test_file_exhaustive.rb で既に不要になっていた skip を削除しています。

shirosaki:r37529 2012-11-07 07:00:12 +0900

r37482 の ChangeLog エントリの typo 修正。そのほか load.c コメントの typo 修正。

nobu:r37530 2012-11-07 07:50:30 +0900

関数定義の開きかっこを行頭に置くようにスタイルの修正をしています。

nobu:r37531 2012-11-07 07:52:52 +0900

r37525 で internal.h に宣言を追加した enum_cycle_size() は慣習に従って rb_enum_cycle_size() と rb_ の prefix をつけるように改名しています。

nobu:r37532 2012-11-07 09:16:03 +0900

Module#const_get で文字列で指定された時に不要に Symbol 化せずに、Symbol 自体が存在しないなら文字列のままで扱うようにしています。これは Symbol は GC されずに一度参照するとずっと残ってしまうためだと思います。

nobu:r37533 2012-11-07 11:48:19 +0900

misc/ruby-additional.el という emacs 用の設定ファイルに ruby-mode-set-encoding という関数を追加しています。 マジックコメントを追加するための関数のようです。 [ruby-core:46021] [Feature #6679]

shugo:r37534 2012-11-07 13:09:51 +0900

refinement の不具合修正。 Module#refine のブロック内で method_added を再定義すると、Fixnum#+ のように VM の命令のレベルで特殊命令にコンパイルされているメソッドが再定義されていても、それを検出せず元々の動作をしてしまっていたのを修正しています。 refinement が再定義検出のために method_added を利用していたので、method_added に頼らず、T_CLASS (struct RClass) のフラグに RMODULE_IS_REFINEMENT というのを追加して refinement 用のモジュールかどうか判定できるようにして、メソッドの追加時(定義時)にそのモジュールが拡張しているクラスの再定義を検出するようにしています。 [ruby-core:48970] [Bug #7290]

xibbar:r37535 2012-11-07 15:36:49 +0900

r37470 で CGI#header が http_header に改名されて header はタグ生成用メソッドに変更された件ですが、header は http_header の alias として残しておいて、HTML5 のタグ生成メソッドの定義が実行された時は header をタグ生成用メソッドで再定義するようにしています。 HTML5 サポートも比較的最近入って(2.0 から?)いるのでそれを使っている場合は header -> http_header の変更も必要ということで。これで互換性の問題は自分で書いているところは HTML5 を使うけど third party のライブラリが CGI#header を使っているというような場合に困るくらいでしょうか。 [ruby-dev:46412] [Bug #7286]

ayumin:r37536 2012-11-07 15:49:57 +0900

WEBrick の rdoc 用コメントの typo というか文法修正。

naruse:r37537 2012-11-07 16:03:50 +0900

r37514 で切り出した ruby_float_step() の unit が Float::INFINITY だった時の挙動(NaN を yield する)を追加しています。

naruse:r37538 2012-11-07 16:03:53 +0900

Float のテストで Float の精度を越える大きさの整数を Float() に渡すと出てくる警告を抑制するため suppress_warning のブロックでくくっています。

knu:r37539 2012-11-08 00:36:14 +0900

拡張ライブラリ curses のサンプル? ext/curses/view.rb で画面の行数より短いファイルを表示する時にエラーになっていたのを修正。

svn:r37540 2012-11-08 00:36:22 +0900

version.h の日付更新。

ayumin:r37541 2012-11-08 00:51:00 +0900

r37498 で Enumerator.new に引数とブロックを渡して Enumerator を作る時に TypeError が発生してしまう不具合が入っていて、それをテスト化しています。 [ruby-core:49001] [Bug #7298]

*1:そのためみなとRuby会議の時の発表ではこの方法は触れませんでした