ruby-trunk-changes r37365 - r37383

今日は rexml, ostruct, psych などライブラリの修正/機能追加などがたくさんありました。 Feature チケットの棚卸しがあったのでしばらくこういうコミットが多くなりそうです。

kou:r37365 2012-10-28 23:52:21 +0900

標準添付ライブラリ rexml の REXML::Encoding#check_encoding を REXML::Source#detect_encoding として移動し、REXML::IOSource のエンコーディング判定のコードが重複していたので削除しています。

kou:r37366 2012-10-28 23:53:07 +0900

BOM つきの UTF-8 エンコーディングされた XML を REXML でパースした時のエンコーディング判定についてのテストを追加しています。 xml タグの encoding 属性で指定されていればそれが有効になります。

kou:r37367 2012-10-28 23:54:59 +0900

REXML のテストのインデント修正。

marcandre:r37368 2012-10-29 03:21:17 +0900

標準添付ライブラリ matrix の Matrix#determinant_e で determinant を呼ぶべきところを rank を呼んでしまっていたのを修正しています。コピペ修正忘れ。こんなの残ってるんですねぇ。 [ruby-dev:46305] [Bug #7228]

svn:r37369 2012-10-29 03:21:24 +0900

version.h の日付更新。

marcandre:r37370 2012-10-29 06:18:11 +0900

標準添付ライブラリ ostruct の OpenStruct の marshal_dump/marshal_load の rdoc の詳細を削っています。また typo なども修正。 [ruby-core:42557] [Feature #1400] [ruby-core:42780] [Feature #6056]

marcandre:r37371 2012-10-29 06:18:32 +0900

標準添付ライブラリ ostruct の OpenStruct#new_ostruct_member を protected に指定しています。 [ruby-core:42779] [Feature #6056]

marcandre:r37372 2012-10-29 06:18:53 +0900

標準添付ライブラリ ostruct に OpenStruct#each_pair メソッドを新たに追加しています。 Hash#each_pair のように項目名(Symbol) と値の配列を yield するメソッドです。 [ruby-core:42550] [Feature #1400]

marcandre:r37373 2012-10-29 06:19:15 +0900

標準添付ライブラリ ostruct の OpenStruct で eql? および hash を再定義し、内容による同一性の判定(OpenStruct#== は再定義されていたけど eql? がなかった)やハッシュ値の計算ができるようにしています。 Hash のキーに使えるようになりましたが、キーに追加した後で内容を変更したら Hash#rehash しないといけないのは Array と同じですね。 [ruby-core:42651] [Bug #6029]

marcandre:r37374 2012-10-29 06:19:32 +0900

標準添付ライブラリ ostruct の OpenStruct#new_ostruct_member で特異メソッドの定義に class << self と define_method を使っていたところを define_singleton_method を使うようにリファクタリングしています。

marcandre:r37375 2012-10-29 06:19:50 +0900

標準添付ライブラリ ostruct の OpenStruct#new に Hash だけでなく Struct や OpenStruct も受け付けるようにしています。 具体的には要素を抽出するのに each (for 文を使っていますが for 文は each を呼び出します)ではなく each_pair メソッドを使うようにしています。つまり each_pair でキーと値を yield するインタフェースがあれば OpenStruct.new に渡せるようになっています。 ドキュメントには Hash か Struct か OpenStruct と書かれているので、この実装に依存しないほうがいいと思いますけどね。 [ruby-core:47476] [Feature #7007]

marcandre:r37376 2012-10-29 06:20:10 +0900

標準添付ライブラリ ostruct に OpenStruct#[ ] と OpenStruct#[ ]= メソッドを追加しています。要素に Hash のようにアクセス/追加できるようにしています。 [ruby-core:42779] [Feature #6056]

marcandre:r37377 2012-10-29 06:20:26 +0900

r37376 の ChangeLog エントリを追加しています。また r37341 や r37293 の ChangeLog エントリの行末の空白除去も。

tenderlove:r37378 2012-10-29 10:23:54 +0900

拡張ライブラリ psych に Psych::Handlers::Recorder というハンドラを新規追加しています。これはパース時のイベントを記録しておいて後からイベント内容を取り出して利用できるというものです。 また Psych::Handlers::EVENTS という定数に配列でハンドラが対応すべきイベントの種類を列挙するようにしています(メタプログラミングで利用することを考慮しているということなので公開されたインタフェースということなのでしょう)。

nobu:r37379 2012-10-29 10:25:31 +0900

新規追加されたファイルの svn property 設定。

nobu:r37380 2012-10-29 12:19:38 +0900

GC::Profiler.report でメッセージを作成する時の rb_sprintf() の指示子 %zu を PRIuSIZE という ruby.h で用意されているマクロを利用するようにしています。 %z って何かと思ったら size_t 用の修飾子があるんですね。しかし C99 以降なのでよりポータブルに使えるように用意しているマクロに置き換えています。

naruse:r37381 2012-10-29 17:52:59 +0900

test_many_fibers_with_threads という Thread と Fiber を大量に発生させるテストをメモリ使用量が大きいので子プロセスを作ってそこで走らせるようにしています。

nobu:r37382 2012-10-29 18:23:02 +0900

拡張ライブラリ stringio で StringIO の readable, writable などのビットフラグを struct RBasic の flags を利用するようにして StringIO 独自の構造体の flags から追い出しています。これにより StringIO を dup した時にオブジェクト毎に close することができるようになっています。 StringIO は dup すると T_DATA 型のオブジェクトが wrap している構造体のメモリ領域は共有しているので、そこにフラグがあると closed のフラグ管理を共通にしないといけなかったのですが、オブジェクトが別なら VALUE は別にできるので、struct RBasic::flags を使うようにすると別々に closed の状態を管理できるようになりました。

nobu:r37383 2012-10-29 18:31:50 +0900

load.c の括弧の前後の空白の入れかたやブロックの括弧の改行位置などスタイルの修正だけです。