ruby-trunk-changes r35000 - r35020

DateTime のタイムゾーンの不具合修正、Eumerable::Lazy の対応(lazy 版)メソッドの追加、Float#% の仕様変更などがありました。

nobu:r35000 2012-03-14 00:26:03 +0900

キーワード引数の文法ルールのリファクタリングで Ripper のコンパイルができなくなっていたのを修正しています。

svn:r35001 2012-03-14 00:26:07 +0900

version.h の日付更新。

tadf:r35002 2012-03-14 07:56:03 +0900

DateTime の offset がサマータイム(米国では daylight savings time って言うみたいですね)に入った時に Time とずれている不具合修正。 [ruby-core:43256] [Bug #6135]

shugo:r35003 2012-03-14 08:08:15 +0900

Enumerable::Lazy#zip を追加しています。無限リストとの zip でも必要なぶんだけ take できます。ChangeLog のメソッド名が間違ってますね。また Enumerable::Lazy#lazy の定義を追加しています(単に self を返す)

shugo:r35004 2012-03-14 08:16:37 +0900

Enumerable::Lazy#flat_map でブロックが返した値を to_ary で配列に変換して利用していましたが、配列でない時には each を呼んでそのブロックに渡された要素を展開するように変更しています。

nobu:r35005 2012-03-14 10:35:06 +0900

template/id.h.tmpl (組込で定義する ID を定義する id.h のテンプレート)でシンボルの種類の定義が重複しているのをまとめて再利用するようにリファクタリング

nobu:r35006 2012-03-14 10:35:09 +0900

Enumerable::Lazy で利用しているシンボルを毎回 rb_intern() を呼ぶのをやめて最初に定義して使い回すようにしています。

nobu:r35007 2012-03-14 10:35:12 +0900

Init_Enumerator() からメソッド定義や古いRubyとの互換性のために enumerator.so をロード済みにみせる処理などを InitVM_Enumerator() に分離しています。
MultiVM にむけた対応ですね。

nobu:r35008 2012-03-14 10:44:37 +0900

Enumerable::Lazy#grep で要素と引数がマッチするかの判定に =~ を使っていたのは Enumerable#grep と同じく === を使って判定するように変更しています。

nobu:r35009 2012-03-14 11:29:48 +0900

WeakRef のテストで GC されやすくするように WeakRef の参照を 10段階くらいネストさせてやっています。途中でもどこかが GC されれば WeakRef::RefError になるので確率を上げるため。

marcandre:r35010 2012-03-14 13:48:02 +0900

Module#remove_const の rdoc で Module や Class も remove_const で消せるけどクラスの名前は変化しなくておかしな状態になるけど自分の足を撃つのはご自由に、みたいな文を削ってます。チケットの指摘はちょっと違うみたいですけど。 [ruby-core:39676] [Bug #5354]

marcandre:r35013 2012-03-14 15:10:01 +0900

Float#% の結果が a % b と演算子のように使われた時と a.send(:%, b) とメソッドとして呼ばれた時で結果が違ってしまう不具合修正と、 a が 0.0 だった時に 0.0 を返し、 b が Infinity だったら a をそのまま返すようにする変更です。 [ruby-core:42726] [Bug #6044]

usa:r35014 2012-03-14 16:42:30 +0900

tmpdir.rb のディレクトリのパーミッションを変更するテストを Windows 版でスキップするようにしています。

usa:r35015 2012-03-14 17:56:42 +0900

r35013 で -0.0 % b を 0.0 にしたり a % Float::INFINITY を a にしたりする修正が HAVE_FMODE が定義されていない時だけ有効になっていたので常に有効になるように条件分岐の位置を変更しています。

shugo:r35016 2012-03-14 18:26:27 +0900

StopIteration の rdoc の位置が Enumerale::Lazy の追加で定義と離れてしまったので移動しています。

shugo:r35017 2012-03-14 18:41:44 +0900

Enumerable::Lazy の実装部分でArrayのループのカウンタを int -> long に変更しています。

shugo:r35018 2012-03-14 19:29:25 +0900

Enumerable::Lazy#take も Lazy を返すようにしています。つまり take(n) で n個とりだすように指定しても n個あつまるまで待たず、each とか next で値を取り出そうとした時に値を引き出してこようとします。 r34661 で修正しているのと同様に C で実装されたブロックへ VALUE 以外の引数を渡すために NODE を利用しています。
また lazy.drop(3).take(2) がエラーにならないよう yield から Qundef がかえってきた時に rb_iter_break() で処理を止めるようにしています。もっとも Lazy 版の drop はこの次で追加されています。

shugo:r35019 2012-03-14 22:04:18 +0900

Enumerable::Lazy に lazy 版の take_while, drop, drop_while と take などを正格評価させる(その場で配列として全要素を取り出す) Enumerable::Lazy#force を追加しています。 force は to_a の alias です。