ruby-trunk-changes r33210 - r33224

今日は ObjectSpace._id2ref で sweep 中のオブジェクトが復活してしまう不具合修正と、GC::Profiler.raw_data メソッドの追加などがありました。

kou:r33210 2011-09-07 23:42:44 +0900

REXML が XML のコメント の中に行末の - があるとエラーになっていたのを修正。 [ruby-core:39289] [Bug #5278]

kou:r33212 2011-09-07 23:46:53 +0900

r33211 の ChangeLog の チケット参照の修正と ML の参照を追加。

ayumin:r33213 2011-09-08 02:56:24 +0900

ext/nkf/nkf-utf8/nkf.c のコメントのエンコーディングUTF-8 に変更。

svn:r33214 2011-09-08 02:56:28 +0900

version.h の日付更新。

ayumin:r33215 2011-09-08 03:03:23 +0900

test/rexml/test_encoding.rb に require 'rexml/document' を追加。

ayumin:r33216 2011-09-08 03:15:33 +0900

r33213 の ChangeLog の変更ファイルの誤記修正。

ayumin:r33217 2011-09-08 03:51:10 +0900

ext/readline/README.ja のエンコーディングUTF-8 へ変更。

naruse:r33218 2011-09-08 07:17:55 +0900

r33213 の nkf のソースファイルエンコーディング変更を revert しています。これは nkfソースコードから取り込んでるものなので変更しないようにとのこと。

nobu:r33219 2011-09-08 07:33:14 +0900

ObjectSpace._id2ref では object_id の値(数値)からその id に対応するオブジェクトを取り出すことができるのですが、LazySweep が入ったために「mark されなくて sweep 予定だけど、まだ実際の free は実行されていない」という状態のオブジェクトが存在するようになって、_id2ref でこのオブジェクトが取り出せてしまい、解放中のオブジェクトに触ることができてしまう(_id2ref で指定したオブジェクトそのものはまだ free されていないけど、そこから辿れるオブジェクトも sweep 対象になっていて、既に free されている可能性がある)ので、sweep 対象になって free される予定のオブジェクトについても "recycled object" というメッセージの RangeError 例外を発生させるようにしています。
ただこの修正でのチェックは lazysweep 処理中でマークが存在していないものを解放予定としていますが、sweep 処理でマークが外されるみたいなので問題があって後で修正されます。

naruse:r33220 2011-09-08 07:37:34 +0900

syck で Syck という定数を参照する時にトップレベルの定数であることを明示するようにしています。 Syck::Syck または YAML::Syck が定義された時のためとのこと。syck は Syck::XXX に組込みのクラスを拡張したクラスを作るという文化みたいですね。syck/types.rb にある定数の参照はパスを明示したほうがいいのかな。まだあと Array と Hash がありますね。

nobu:r33221 2011-09-08 07:44:27 +0900

r33202 でエンコード変換用のライブラリをロードするためのパスの生成をリファクタリングしたため、ライブラリ名の文字数制限が必要なくなりチェックを消しています。

nobu:r33222 2011-09-08 09:02:55 +0900

ObjectSpace._id2ref で sweep される予定のオブジェクトの判定方法を修正。sweep 予定の slot に含まれていてかつマークされていないものは解放される予定なので例外発生させるようにしています。
BUILTIN_TYPE(ptr) == 0 の判定も is_dead_object() の中に入れてしまってもいいような。klass == 0 はまたちょっと意味合いが異なる(内部的に利用するオブジェクトで ruby スクリプトへ見せないようにしたい時に klass を 0 にする)ので dead かどうかの判定とは別ですが flag == 0 は freelist に繋がれた時にクリアされてるので is_dead_object() の一部かなと。

nobu:r33223 2011-09-08 09:07:49 +0900

ext/nkf/nkf-utf8/nkf.c のエンコーディング変更を revert したので svn property の svn:mime-type の変更も元に戻しています。

nari:r33224 2011-09-08 12:57:41 +0900

GC::Profiler.report で表示される GC のプロファイル情報をそのまま Array オブジェクトで返すメソッド GC::Profiler.raw_data を追加しています。 [ruby-core:37857] [Bug #4991]
GC::Profiler.enable でプロファイラを有効にしてから GC が実行された回数ぶん Hash オブジェクトが格納された Array オブジェクト。キーは追記された rdoc のコメントを参照してください。