ruby-trunk-changes r33158 - r33164

今日は class/module 文で定義済みのクラス/モジュールを検索する方法の再修正がありました。

nobu:r33158 2011-09-02 01:07:16 +0900

r33140 で Float#round のオーバフロー検出などしている所で、double の実装(10進数で表現可能な桁数)に依存しているところを DBL_DIG を使って定義する定数に置き換えるようにしています。またテストを追加。

svn:r33159 2011-09-02 01:07:21 +0900

version.h の日付更新。

tenderlove:r33160 2011-09-02 04:07:44 +0900

Psych による YAML ダンプ時に、文字列にヌル文字(\x00)が含まれているかとか、普通使用される英数字や記号以外の文字や非ASCII文字の割合で binary と判定して binary データ用の出力をしていたものを、文字列のエンコーディングが ASCII-8BIT のものは binary として扱うようにしています。

nobu:r33161 2011-09-02 09:58:10 +0900

文字列リテラル内で非ASCII文字の前のバックスラッシュがパースエラーを引き起こしていたので、他のバックスラッシュが前置されてもエスケープシーケンスにならない文字と同様に単にバックスラッシュを無視するようにしています。 [ruby-core:39222] [Bug #5262]

nobu:r33163 2011-09-02 14:36:49 +0900

r33157 の class/module 文で Object に include されたモジュール内で定義されたクラス/モジュールを再定義する時の挙動の再修正です。 r33157 だと継承したクラスの中に定義されているクラスやモジュールを見てしまうようになっていたようです。 module/class で既に定義済みのクラス/モジュールかどうか探索する際にトップレベル(cbase が Object)の時だけ継承ツリーを辿って(include したモジュール内の定数も探索して)、そこから再定義すべきクラス/モジュールを(あれば)取ってくるようにしています。 [ruby-core:39227] [Bug #5264]
うーん複雑な仕様ですね。チケットや追加されたテストでどういう定義が可能なのかわかりますが、定数の探索のルールと微妙に違っている(定数は見えるけど class/module では新しいクラス/モジュールを作る)わけですね。
以下を実行してみるとわかると思います。

class A
  module X; end
end
class B < A
  p X               # => A::X
  module X; end     # ここで A::X の再定義ではなく B::X が定義される
  p X               # => B::X
end