ruby-trunk-changes r38261 - r38276

今日は前田さん無双の日で、Refinement の仕様が大幅に変更/縮小されています。
また RubyGems の不具合修正を含むバージョンアップ、CSV の不具合修正などがありました。

shugo:r38261 2012-12-07 23:44:02 +0900

r38244 で拡張ライブラリ refinement のソースに rb_warn() のプロトタイプ宣言を加えましたが、そのかわりに #include "ruby/ruby.h" を追加するようにしています。

shugo:r38262 2012-12-08 00:49:21 +0900

Refinement の仕様に大きく変更が加えられているようです。

  • module_eval, instance_eval 内でのメソッド呼び出しで refine を考慮しなくなった
  • Module#refine は Class しか受け付けなくなった(Module を拡張することはできなくなった)
  • Class#refine は undef された (Class 内で refine はできなくなった。従って using の引数は Module のみ受け付けるようになった)
  • トップレベルの using は private メソッドになった

と仕様が縮小されたようです。

svn:r38263 2012-12-08 00:49:26 +0900

version.h の日付更新。

nobu:r38264 2012-12-08 01:27:32 +0900

r38257 で Test::Unit の並列テストのリトライ処理で skip はリトライの対象としないようにしたチェックで、skip 以外(error, failure) があればリトライするので判定方法を少し変更して error, failure がみつかったらすぐに抜けるようにしています。

jeg2:r38265 2012-12-08 02:42:16 +0900

標準添付ライブラリ csvCSV::Row#== で比較すると引数のオブジェクトに対して問答無用で row メソッドが呼ばれてから比較しようとするため NoMethodError が発生するため、相手が CSV::Row のインスタンスか確認してから呼ぶようにしています。 [ruby-core:50636] [Bug #7528]
また ChangeLog の URL やファイルパスの行がのきなみインデントが消されています。

ko1:r38266 2012-12-08 09:18:42 +0900

r37307 で追加した ObjectSpace::InternalObjectWrapper というクラスのオブジェクトが ObjectSpace.memsize_of() で利用しているメモリ容量を返せるように対応しています。といっても InternalObjectWrapper そのものはヒープにメモリを確保しないので、それが参照しているオブジェクトに対して memsize_of() を呼んでその結果を返しています。

nobu:r38267 2012-12-08 09:24:35 +0900

r38265 でインデントが消えてしまった ChangeLog の行を元に戻しています。

drbrain:r38268 2012-12-08 09:26:56 +0900

拡張ライブラリ openssl の OpenSSL::X509::Name の rdoc 用コメントを追記しています。

shugo:r38269 2012-12-08 11:37:16 +0900

Refinement の仕様変更です。 Module#refine の影響はこれまでそのモジュール内ならどこでも有効だったのですが refine のブロックの中でのみ適用されるようになっているようです。それから Symbol#to_proc で作った Proc が refinement の影響を受けないようにしています。

shugo:r38270 2012-12-08 12:06:13 +0900

Module#refine のブロックに Proc オブジェクトを & つけてブロック引数として渡すと ArgumentError が発生するようにしています。そして refine と using で修飾されたメソッドはインラインキャッシュに乗らないように特別扱いしていたのですが、それをやめています。この変更で同じ refinement の内容が複数の Module#refine で使い回されることがなくなったのでキャッシュにのせることができるようになったそうです。

shugo:r38271 2012-12-08 12:36:58 +0900

refine で修飾されたメソッド内で super した時に複数の Module を using していたらそれを考慮していたのですが常に refine 元のメソッドを直接呼ぶようにしています。これは仕様を削ってこうなったというよりは、あえてそうしているみたいですね。どういう理由でこれが望ましいんでしょうか。
ついでに r38270 の ChangeLog に追記。

drbrain:r38272 2012-12-08 15:01:49 +0900

RubyGems を '2.0.0.preview2' から '2.0.0.preview2.1' に更新しています。

  • 同梱されている証明書のサイズが拡張されていて、FIPS(米国連邦標準規格のセキュリティ要件)に適合
  • また gem clean で default_gems が消されないように
  • gem query に -r (remote) と -n (name) でリモートの gem の検索で名前の絞り込みがうまく動作しなかった不具合修正
  • gem install で依存関係にある gem を検索するのにローカルのキャッシュにファイル以外のものがあった時に読もうとしてしまう不具合を修正
  • gem uninstall で他の gem が依存している gem を消そうとした時に確認を行うように

marcandre:r38273 2012-12-08 16:06:24 +0900

Ripper の rdoc 用コメントのコード例を修正しています。

shugo:r38274 2012-12-08 22:35:12 +0900

トップレベルの self(main という特別なオブジェクト)の using がモジュール定義やメソッド定義の中から(send を使って)呼び出された時に ArgumentError を発生させるようにしています。イレギュラーな使い途を潰していってるみたいですね。

shugo:r38275 2012-12-08 22:35:15 +0900

Module#refinements (refine している Module とその無名モジュールを Hash で返すメソッド)を削除しています。

shugo:r38276 2012-12-08 22:41:16 +0900

refinement で修飾された Module で include を再定義していたのをやめています。 これまで refinement は refine した Module 内ではどこでも影響していたので include した時にその Module での refine も混ぜこむようにしていましたが、refine のブロック内に影響を限定したのでもう不要になっていました。