ruby-trunk-changes r37335 - r37341

今日は Module#const_get の機能拡張や Float の仕様変更(特異メソッド定義の禁止)がありました。

tenderlove:r37335 2012-10-27 06:31:23 +0900

Module#const_get で "::" で区切ったネストした定数名を受け付けるようにしています。 [ruby-core:41404] [Feature #5690]

svn:r37336 2012-10-27 06:31:36 +0900

version.h の日付更新。

nobu:r37337 2012-10-27 10:05:06 +0900

mingw32 プラットフォームで fstat() として fstati64() のかわりに _fstati64() という関数を使うようにしています。

nobu:r37338 2012-10-27 10:07:59 +0900

parse.y でパーサの状態を enum で定数として定義していたのをビットフラグで表現するように変更しています。 [ruby-core:23503] [Feature #1493]

shyouhei:r37339 2012-10-27 10:16:25 +0900

RubyVM::InstructionSequence#compile に IO を受け付けるようにしています。 また Ripper も IO を受け付けていたのですが、 respond_to? で get を呼べるかどうかをチェックするようにしていたので、T_FILE 型のオブジェクトであるかを確認するようにチェックを厳密にしています。 StringIO とかは渡せなくなるんですね。 [ruby-dev:40202] [Feature #2674]
ChangeLog には [Bug #2861] と記載されていましたがこちらは閲覧できなかったので関連しそうな [Feature #2674] をリンクしておきます。

tenderlove:r37340 2012-10-27 10:51:58 +0900

r37335 の追加の修正。 Module#const_get で定数を検索する前に名前が String オブジェクトであることを確認/変換するようにしています。 [ruby-core:48405] [Feature #5690]

ko1:r37341 2012-10-27 11:10:53 +0900

[追記] ささださんに教えてもらったところ、特異メソッドの定義は元々禁止されていて*1、freeze するようにしたほうが主な変更だったそうです。 [/追記]

Float オブジェクトに特異メソッドを定義するのを禁止しています。 Fixnum などの即値の他に Bignum も特異クラスを定義することはできなかったのでそれに合わせて Float も特異メソッドを定義できないようにしています。 flonum (VALUE に埋め込んだ即値の Float)はこれまでも当然特異メソッドが定義できなかったので、プラットフォーム(flonum が有効になるのは 64bit 環境)や値にかかわらず Float の挙動を揃えています。また Float は全て freeze された状態で生成されるようにしています。 [ruby-dev:46081] [Feature #6936]

*1:しかし回避する方法もあった