今日は bignum.c のリファクタリングと、Windows 環境で UTF-8 をコマンドライン文字列に含めて system/popen などで子プロセスを起動できるようにするための対応がありました。
akr:r41694 2013-06-29 22:33:40 +0900
bignum.c の bary_2comp() の do{}while ループを for ループで書き直して、ループ途中で判定が完了したら return するようにしています。
akr:r41695 2013-06-29 23:38:26 +0900
bignum.c のリファクタリング。 bary_2comp() から BDIGIT の配列をビット反転する処理を bary_neg() として切り出し、BDIGIT の配列で表現された整数に1を加算する処理を bary_plus_one() として切り出し、get2comp() から桁上がりでバッファを1つ増やす処理を big_extend_carry() として切り出し、それぞれ別の箇所でも共用するようにしています。
akr:r41696 2013-06-30 00:57:07 +0900
bignum.c にBignumの符号をセットするマクロ RBIGNUM_SET_NEGATIVE_SIGN() RBIGNUM_SET_POSITIVE_SIGN() を定義しています。
また rb_big_neg() を r41695 で切り出した関数を利用して実装しなおしています。
svn:r41697 2013-06-30 00:57:12 +0900
version.h の日付更新。
akr:r41698 2013-06-30 01:58:58 +0900
bignum.c の big_rshift() で負値の時の考慮の方法を abs2twocomp() と twocomp2abs_bang() を利用するようにリファクタリング。
nobu:r41699 2013-06-30 10:23:35 +0900
test/ruby/test_process.rb で一時ディレクトリ作成時に Pathname#realpath を使っていたのを File.realpath を使うように書き変えて pathname への依存をなくしています。
nobu:r41700 2013-06-30 10:57:16 +0900
process.c のインデントの修正のみ。
nobu:r41701 2013-06-30 10:57:18 +0900
process.c に EXPORT_STR(), EXPORT_DUP() という DEFAULT_PROCESS_ENCODING が定義されていた時に文字列オブジェクトのエンコーディング変換と複製を行なうマクロを導入して、exec 時のプログラムや引数の文字列の変換や環境変数の文字列の変換に利用するようにしています。特にチケットの参照がないですけど exec に渡す文字列のエンコーディングの指定が必要な場合があるのでしょう。
また最後の hunk の rb_exec_fillarg() の変更で arg = EXPORT_STR(arg); も #ifdef DEFAULT_PROCESS_ENCODING の中に入れていいような気がします。
nobu:r41702 2013-06-30 10:58:51 +0900
ちょっと理由がわかりませんが dln_find.c の dln_find_exe_r() と dln_find_file_r() の宣言の末尾に DLN_FIND_EXTRA_ARG_DECL というマクロと配置、呼び出し時は DLN_FIND_EXTRA_ARG を置くようにしています。これらのマクロはデフォルトで空に宣言されています。なので引数の最後のカンマはなしでこれらのマクロを置いています。あと ChangeLog の extract -> extra でしょうか。
nobu:r41703 2013-06-30 10:58:55 +0900
win32/win32.c の rb_w32_ustati64() と rb_w32_stati64() から utf8_to_wstr() で WCHAR に変換する処理を w32_stati64() に切り出して共通化するリファクタリング。
nobu:r41704 2013-06-30 10:58:59 +0900
win32/win32.c の rb_w32_ugetenv() と rb_w32_getenv() から主な処理を w32_getenv() として切り出して、その引数に渡す codepage のみ変更するようにしています。
nobu:r41705 2013-06-30 10:59:03 +0900
更に win32/win32.c のリファクタリング。 rb_w32_aspawn_flags() から codepage 変換の処理を w32_aspawn_flags() として切り出して、これを利用して rb_w32_uaspawn_flags() rb_w32_uaspawn_flags() という UTF-8 版の関数を追加しています。
nobu:r41706 2013-06-30 10:59:07 +0900
r41705 と全く同様に win32/win32.c のリファクタリング。 rb_w32_spawn() から codepage 変換部分を w32_spawn() として切り出して、UTF-8 版の rb_w32_uspawn() という関数を追加しています。
nobu:r41707 2013-06-30 10:59:12 +0900
win32/win32.c で DLN_FIND_EXTRA_ARG_DECL, DLN_FIND_EXTRA_ARG に codepage 指定の引数を追加してから dln.h と dln_find.c を #include するようにしています。 r41702 で dln_find_exe_r() dln_find_file_r() の引数を追加できるようにマクロを挿入しておいたのがここで利用されるみたいです。
nobu:r41708 2013-06-30 10:59:16 +0900
win32/win32.c で translate_char(), join_argv(), has_redirection() に引数 cp を追加して spawn のための文字列処理で codepage を意識した処理をするようにしています。
nobu:r41709 2013-06-30 10:59:21 +0900
ここまでの process.c, dln.h, dln_find.c や win32/win32.c の変更の目的がここで明らかになりました。 Windows 環境で system/popen/open3 などの子プロセスを起動するメソッド群がコマンドライン文字列に UTF-8 を使うと動作していなかったのを、UTF-8 版の spawn 用の関数を利用するようにして対応しています。約4年越しの懸案事項だったみたいです。 [ruby-core:24309] [Bug #1771]
nobu:r41710 2013-06-30 10:59:25 +0900
r41709 の続きで win32/win32.c の join_argv() に引数 backslash を追加して、"/" を "\\" に置換するようにして、w32_spawn() でプログラム名の部分は置換つきで join_argv() を呼ぶようにしています。 [ruby-core:24309] [Bug #1771]
nobu:r41711 2013-06-30 11:10:20 +0900
r41707 の ChangeLog 追記で入った余分な行を削除しています。
nobu:r41712 2013-06-30 14:06:43 +0900
r41709, r41710 の Windows 環境での UTF-8 を使ったコマンド起動の対応のテストの追加。コマンドの引数部分に非ASCII文字が含まれていた時のテストケースを追加しています。 [ruby-core:24309] [Bug #1771]
akr:r41713 2013-06-30 22:16:08 +0900
bignum.c の rb_cstr_to_inum() で基数が 2の累乗の時に rb_integer_unpack() を利用するように変更しています。