ruby-trunk-changes r35889 - r35913

今日はたくさんコミットがありました。Process の exec/spawn 関係の変更とその Windows 版での追随、Windows での端末の色付け(VT100 エスケープシーケンス)対応などなどでした。

akr:r35889 2012-06-03 23:53:13 +0900

process.c の exec の処理でコマンドラインを引数に分割する処理を rb_proc_exec_e() から rb_exec_fillarg() へ移動して事前に分割しておくことで、(おそらく)Process.spawn を使った時に子プロセスでメモリ確保の必要がなくなるようにしています。

akr:r35890 2012-06-04 00:13:54 +0900

コマンド文字列の空白をスキップするのに ISSPACE() を使っていたところを、スペース、タブ、改行(LF)と比較するようにしています。 \f, \r, \v は Bourne shell ではセパレータにならないからとのこと。

svn:r35891 2012-06-04 00:13:59 +0900

version.h の日付更新。

akr:r35892 2012-06-04 00:45:46 +0900

process.c の最近の変更で構造体のメンバに追加削除があったのに Windows 版のコードが追随できていなかったので修正しています。

tadf:r35893 2012-06-04 04:26:58 +0900

r35877 と r35886 で Rational と Complex の Marshal.dump/load の実験的なコードを条件コンパイルつきで入れていたのを revert しています。

nobu:r35894 2012-06-04 06:12:46 +0900

Marshal.load でオブジェクトを生成する時にクラスメソッドの _alloc が定義されていたら、警告を出力しつつそれを使うようになっていたのを allocate メソッドを使うのに一本化しています。つまり _alloc でオブジェクト確保するクラスはサポートされなくなります。

nobu:r35895 2012-06-04 06:13:36 +0900

marshal.c のインデントを調整。

usa:r35896 2012-06-04 10:44:27 +0900

r35889 に Windows 版というか fork(2) がない環境での追随する修正です。

usa:r35897 2012-06-04 11:36:11 +0900

[ruby-core:44093] [Bug #6249] の exec に失敗すると環境変数の変更が残ってしまう問題は execve(2) 族を使うことで修正したのですが、fork() のない環境(つまり Windows)ではやはり環境変数を設定して実行しようとするので元に戻す処理を入れることで対応しています。

nobu:r35898 2012-06-04 11:40:30 +0900

コードをよく理解していないのですがテストをみると rb_marshal_define_compat() で別のクラスの dump/load を利用する時に marshal_dump/marshal_load を定義してカスタマイズしたものや _load/_dump を定義してカスタマイズしたものもサポートするようにしているようです。 rb_marshal_define_compat() の使いかた自体よくわかってないので機会があったら調べてみたいです。

ko1:r35899 2012-06-04 11:49:37 +0900

rb_location_t の型の名前と構造体メンバの名前変更するリファクタリングです。

ko1:r35900 2012-06-04 12:04:34 +0900

backtrace のテストで caller の結果を ":" で分割してチェックしていたものを caller_location を使って直接ファイルパスや行番号を取り出すように修正しています。 Windows でパスに ":" が含まれることがあるので失敗することがあったので対応。とコミットメッセージにはあるのですが、パスに ":" を含むことは別に Unix 系でもありうると思うのですが。

usa:r35901 2012-06-04 13:10:44 +0900

拡張ライブラリ dl のテストで require するものが間違っていたのを修正。

naruse:r35902 2012-06-04 14:02:27 +0900

ext/-test-/string/coderange.c の UNREACHABLE を置いている場所に rb_bug() を入れてコンパイラの警告を抑制しています。 switch 文に break がないので言語仕様上はここに来ることもありうるということだったようです。

usa:r35903 2012-06-04 14:06:56 +0900

fork() がない環境での rb_exec_err() で rb_run_exec_options_err() の呼び出し前後で errno を保存するようにしています。

nobu:r35904 2012-06-04 14:33:43 +0900

process.c で条件コンパイルによって未使用になることがある変数を #ifdef に中に括るようにしています。

nobu:r35905 2012-06-04 14:46:22 +0900

process.c の proc_spawn_n() で未使用の引数 argc を削除しています。

nobu:r35906 2012-06-04 14:46:24 +0900

process.c の proc_exec_v() と rb_proc_exec_e() の NaCl 版との条件コンパイルの分岐を関数の定義ごと分けてていたのを関数の中で分岐(#ifdef __native_client__)するようにしています。

nobu:r35907 2012-06-04 15:39:40 +0900

Windows 版にも端末の色付けのため VT100 のエスケープシーケンスを解釈する機能を追加して、Test::Unit で色付けの条件から Windows だったらやめるというのを削ってます。 [ruby-core:44958] [Feature #6418]

ko1:r35908 2012-06-04 16:24:44 +0900

YARV のローカル変数のスタック上の領域を指すポインタ lfp の先頭の要素の 0x2 ビットに何か意味を持たせていた痕跡が残っていますが、これは現在は使われていないので削除しています。
そういえばなんかこれオブジェクト(VALUE)じゃないポインタか何かを格納してその時に0x2ビットを立てて識別とかしてたっていうようなのを読んだことがあったような気が。最近 VM の整理が進んでいるので YARV が読み易くなりそうですね。

akr:r35909 2012-06-04 19:19:32 +0900

process.c でコマンドラインを argv 形式の String オブジェクトに分割したものから argc と argv に変換するマクロ ARGVSTR2ARGC()、ARGVSTR2ARGV() を定義して、これを利用するようにリファクタリングしています。

akr:r35910 2012-06-04 20:01:41 +0900

process.c の rb_exec_fillarg() でコマンドラインを分割する時に先頭に "/bin/sh" を入れるためのスペースを追加しています。またそのぶんの調整を r35909 で定義した ARGVSTR2ARGC() と ARGVSTR2ARGV() で吸収しています。

akr:r35911 2012-06-04 20:13:47 +0900

process.c の rb_spawn_process() で proc_spawn(), proc_spawn_n() や system() を呼んでいるところで earg 引数(struct rb_exec_arg * 型)は無視されていることをコメントで追記しています。

akr:r35912 2012-06-04 21:52:35 +0900

Process.exec に失敗した時の環境変数設定が残らないことを確認するテストでテストプロセスで直接 exec を実行していて、エラーになるはずですが、もし /nonexistent が存在して成功してしまったらプロセスが切り替わってしまうので、子プロセスを作ってそこで呼ぶようにしています。

nobu:r35913 2012-06-04 21:54:00 +0900

MinGW 版で make test-all のわざと SEGV を起こすテストでダイアログが表示されて待ちが発生するそうで、それを抑制するために SetErrorMode() という関数呼び出しを追加しています。 [ruby-core:45389] [Bug #6535]