ruby-trunk-changes r51064 - r51074

今日は st_table のリスト操作を ccan/list で書きかえる変更と、Windows での IO#reopen の不具合修正などがありました。

normal: r51064 2015-06-30 03:10:00 +0900

r51034 および r51044 での st_table のリストを ccan/list を利用するようにする変更の3度目のトライです。 st_head() の実装で一旦 uintptr_t の変数に受けてからキャストするようにしています。 gcc 4.4 の不具合? で scrict-aliasing の警告が出ていたのを回避するようにしているようです。 [ruby-core:69726] [misc #10278]

svn: r51065 2015-06-30 03:10:20 +0900

version.h の日付更新。

normal: r51066 2015-06-30 08:24:56 +0900

IO#reopen に渡した mode 引数の "w+" が訊いてなくて "r+" 扱いになっていた不具合を修正しています。 標準入出力の reopen では freopen(3) を利用しているから "r", "w" とかの mode 引数が一旦 flags に変換されたあと再度文字列の mode に変換されるんですね。 [ruby-core:69779] [Bug #11319]

nobu: r51068 2015-06-30 16:48:24 +0900

IO の close_on_exec や reopen のテストで Windows プラットフォームで skip していたのを、Windows ではサポートされないのでテストメソッドの定義自体しないように分岐に変更しています。

nobu: r51069 2015-06-30 17:28:28 +0900

r51066 でも書いたように IO#reopen は標準入出力の場合 freopen(3) を利用しているので、Windows 環境では WCHAR の文字列に変換して wfreopen()/wfreopen_s() を利用する wrapper 関数を用意してこれを利用するようにしています。 [ruby-core:69780] [Bug #11320]

usa: r51070 2015-06-30 18:38:51 +0900

r51069 で追加した Windows 用 rb_freopen() で WCHAR の文字列に変換したパス名を NUL 文字終端するようにしています。

usa: r51071 2015-06-30 18:41:40 +0900

r51070 で入ってたデバッグ用の cprintf() を削除しています。

nobu: r51072 2015-06-30 23:04:00 +0900

r51070 で導入された Windows 用の rb_freopen() で rb_w32_mbstr_to_wstr() で確保されたバッファの解放には xfree() ではなく free(3) を呼ぶように修正しています。

nobu: r51073 2015-06-30 23:11:56 +0900

r51070 と関連あるのかどうかわかりませんが、dir.c の check_dirname() および io.c の rb_sysopen() で rb_str_encode_ospath() に渡す前または後のパスを NUL 終端するように StringValueCStr() を呼ぶようにしています。

nobu: r51074 2015-06-30 23:12:16 +0900

rb_io_reopen() で IO オブジェクトの fptr->pathv に格納する String オブジェクトを fstring にしてコピーを作っていましたが、引数の fname はこの前で FilePathValue() が呼ばれて NUL終端と freeze が行なわれているためこのまま代入して良かったので不要な rb_str_new_frozen() の呼び出しを削除しています。