今日は GC の処理のリファクタリングと Windows で特定のファイルポジションで読み書きするとエラーになる不具合の対応がありました。
ko1:r40884 2013-05-22 08:09:22 +0900
gc.c の GC を実行するエントリポイントを garbage_collect() にまとめて、引数にフルGCを実行するかどうか、sweep を lazy に実行するかどうかのフラグを受け取れるようにしています。
svn:r40885 2013-05-22 08:09:27 +0900
version.h の日付更新。
ko1:r40886 2013-05-22 14:21:06 +0900
gc.c で GC 中であることを示す変数 during_gc を sweep 処理時にクリアする処理を rb_objspace_free() から抜ける時から rest_sweep() と gc_prepare_free_objects() から抜ける時に移動しています。
nobu:r40887 2013-05-22 15:17:33 +0900
Windows 版の read()/write() の実装 rb_win32_read()/rb_win32_write() からファイルポインタの操作処理(?)を setup_overlapped() と finish_overlapped() として切り出して共通化するリファクタリングです。
nobu:r40888 2013-05-22 15:19:03 +0900
r40887 で切り出したファイルポインタ操作の処理で SetFilePointer() が INVALID_SET_FILE_POINTER を返した時無条件でエラーにしていましたが GetLastError() で NO_ERROR が返ってきたらエラー扱いにしないようにしています。 INVALID_SET_FILE_POINTER は 0xFFFFFFFF のように定義されていて、正常な戻り値の場合もあるからということのようです。そんなひどい。 ただチケットではまだ rb_w32_write() に同じような間違ったエラーチェックがあるという報告もあります。 [ruby-core:55098] [Bug #8431]
nobu:r40889 2013-05-22 16:50:20 +0900
gc.c の GC::Profiler の出力で GC 回数をカウントする変数を int から size_t に変更してオーバーフロー対策をしています。またループで最初の1回目を検出する条件の書きかたを変えるリファクタリング。 gc.c の count /* > 1 */ のコメントは暗黙の条件を書いたのだとすると > 0 の間違いじゃないでしょうか。
nobu:r40890 2013-05-22 17:03:51 +0900
rb_bug() などで loaded features をダンプする時に String 以外のオブジェクトが入っていた時にクラス名を表示していたところで、クラス名の文字数を制限して出力するようにしています。
nobu:r40891 2013-05-22 17:03:53 +0900
同じく rb_bug() などで loaded features を表示する時に、Class や Module が入っていた時には "class:" や "module:" という文字列を前に置いて、表示するようにしています。
naruse:r40892 2013-05-22 19:36:28 +0900
r40879 で追加した Digest のテストでテスト用にファイルを作成する時に binmode を指定してファイルを書き込むことで改行コードが自動変換されるのを防いでいます。
naruse:r40893 2013-05-22 19:38:37 +0900
NEWS ファイルに r40879 で追加した Digest::Class.file メソッドの引数の受け付けについて追記しています。