ruby-trunk-changes r48637 - r48648

今日は Windows 環境でのコマンドライン引数のエンコーディングの扱いの修正などがありました。

usa: r48637 2014-11-29 06:11:22 +0900

捕捉されなかった例外などのエラーの表示の時にメッセージのエンコーディングが保持されない出力のされかたがあったのを String オブジェクトのまま持ち回るようにしてエンコーディング情報が保たれるようにしています。 また Windows 環境で stderr が端末の時は rb_w32_write_console() を利用するようにしています。

svn: r48638 2014-11-29 06:11:41 +0900

version.h の日付更新。

usa: r48639 2014-11-29 07:32:36 +0900

r48637 の変更に対するテストを追加しています。

usa: r48640 2014-11-29 08:36:08 +0900

encoding.c から不要なプロトタイプ宣言 rb_locale_charmap() を削除しています。 include/ruby/encoding.h で宣言済みとのこと。

usa: r48641 2014-11-29 08:52:34 +0900

r48639 で追加したテストで子プロセス渡すスクリプトに magic comment を追加してスクリプトエンコーディング cp932 を指定するようにしています。

nobu: r48642 2014-11-29 09:36:33 +0900

テストで continuation が必要なところで r48588 で追加した警告を抑制するように EnvUtil.suppress_warning を利用するようにしています。

nobu: r48643 2014-11-29 09:37:12 +0900

SystemCallError 例外(Errno::EXXXX 群)の初期化時のメッセージの構築を最初から String オブジェクトを生成してから連結するようにしてエンコーディングの扱いを String オブジェクトまかせにするように修正しています。一応エンコーディングについては意識した作りにはなっていたようですが潜在的に不正なバイト列の文字列になってしまう可能性があったとのことです。

nobu: r48644 2014-11-29 10:49:26 +0900

Windows 版の win32_direct_conv() および rb_w32_readdir() でのファイル名のエンコーディングの変換処理を変更しています。 UTF-8 への変換を行う場合は Win32 API を使って直接変換するようにしているとのこと。うーむこの差分でどうしてそうなるのかはよくわかりませんが、readdir_internal() などの関数の rb_encoding* を渡していた引数に UINT cp (code page) を指定した変数へのポインタを渡すケースが増えていて、引数の型が const void* になっています。あーこれまで NULL だった時は filesystem encoding への変換の関数ポインタを渡していたのを UTF-8 の場合もそのパスを通すようにして変換する cp を引数経由で渡すようにしたということか。引数が変換用の関数(関数ポインタで渡される)への引数になるので、渡される関数ポインタによって内容が異なるということですね。

usa: r48645 2014-11-29 15:00:19 +0900

r48641 でのテストの書き変えでのインデントの修正。

usa: r48646 2014-11-29 15:01:49 +0900

定数の再定義によるメモリリークのテストでタイムアウトの値をのばしています。 mswin の CI でタイムアウトが発生するためとのこと。

nobu: r48647 2014-11-29 16:14:53 +0900

rb_typeddata_inherited_p() を deprecated にしています。かわりに RTYPEDDATA_TYPE(obj) でチェックすればいいみたいです。TypedData の継承がなくなったみたいですね。 struct RTypedData の parent メンバも削除されていますが、構造体のレイアウトは保持するために reserved というメンバとして残しています。

nobu: r48648 2014-11-29 16:53:17 +0900

Windows 版で引数にメタキャラクタでファイル名に展開されたものが渡された時にエンコーディング情報が失なわれて "?" という文字になってしまうのを修正しています。 うーんこれはつまりコマンドラインの引数で期待されるエンコーディングファイルシステムエンコーディング(従って ? や * で展開した時に渡される文字列のエンコーディング)が異なる環境での問題と一般化され得るのでしょうか? と思ったけど修正内容は主に Windows 版特有の部分ですね。もしかして Windows 版ではメタキャラクタの展開を ruby 側でやってるとか? [追記]そうらしいです。というかシェルでは展開していなくて各コマンドで展開するのが Windows 流らしいです。知らなかった。[/追記] [ruby-dev:48752] [Bug #10555]