ruby-trunk-changes r35871 - r35888

今日は RubyVM::FrameInfo などの backtrace 関係のモジュール/メソッドの名前変更と、Process.exec の環境変数の設定のしかたの変更、freeze したオブジェクトが marshal_load で変更できてしまう問題の対策などがありました。

ko1:r35871 2012-06-03 00:59:37 +0900

vm_???.c というソースファイルは vm.c から #include で取り込まれて、コンパイルはまとめて行なわれるようになっているのですが、昨日 vm.c から分離した vm_backtrace.c は実際に別にコンパイルされるようにしています。

nobu:r35872 2012-06-03 01:02:01 +0900

新規追加されたファイルの svn property を設定しています。

ko1:r35873 2012-06-03 01:46:08 +0900

RubyVM::FrameInfo を RubyVM::Backtrace::Location に改名して RubyVM::FrameInfo.caller を Kernel#caller_locations に移動、また RubyVM::Backtrace::Location のメソッドの名前も変更しています。iseq は削除されました。 [ruby-dev:45686]

naruse:r35874 2012-06-03 03:24:24 +0900

regparse.c で明示的キャストを追加してコンパイラ警告除去をしています。

nobu:r35875 2012-06-03 06:34:14 +0900

gc.c で (&rb_objspace)->xxx という書きかたになっていたところを単に rb_objspace.xxx と書き直しています。

tadf:r35876 2012-06-03 10:26:41 +0900

immutable なオブジェクトや freeze しているオブジェクトでも Marshal.load を実現するためのメソッド marshal_load を明示的に呼ぶことで内容を変更できてしまう不具合を Complex と Rational について対策しています。 とりあえず freeze されていたら弾くようにしています。 [ruby-core:45394] [Bug #6538]

tadf:r35877 2012-06-03 14:05:29 +0900

MARSHAL_OLD_STYLE というマクロが定義されていたら Complex と Rational の Marshal.dump/load の実装方法を今の marshal_dump/marshal_load から _dump/_load メソッドによるものに変更(昔はこの方式だった?)にするようにしています。

tadf:r35878 2012-06-03 14:14:47 +0900

Date と DateTime も marshal_load で freeze されていないかチェックを追加しています。

tadf:r35879 2012-06-03 14:15:56 +0900

marshal.c の marshal_load(), marshal_dump() 関数の static 宣言をはずして外部から呼べるようにしています。

tadf:r35880 2012-06-03 14:17:38 +0900

Date, DateTime の freeze されたものに marshal_load を呼んだ時のテストを追加しています。

nobu:r35881 2012-06-03 16:34:03 +0900

r35877 で追加した Complex と Rational の _dump/_load の実装で marshal_dump()/marshal_load() 関数を直接呼んでいたのを rb_marshal_dump()/rb_marshal_load() を呼ぶようにして、r35879 で marshal_dump()/marshal_load() の static を消していたのを戻しています。

akr:r35882 2012-06-03 17:29:48 +0900

Process.exec の第1引数に Hash を渡して環境変数を設定する場合、環境変数をセットしてから execv(2) していたため execv(2) が失敗するとその環境変数の変化が残ってしまっていたのを execve(2) を利用するようにすることでシステムコール環境変数設定を任せるようにしています。 [ruby-core:44093] [Bug #6249]

naruse:r35883 2012-06-03 19:47:45 +0900

thread.c で明示的なキャストを追加してコンパイラの警告除去しています。

akr:r35884 2012-06-03 20:12:20 +0900

さらに rb_proc_exec() の全体を rb_proc_exec_e() という関数名として切り出して、環境変数の指定があれば execl(2) のかわりに execle(2) を呼び出すようにしています。

akr:r35885 2012-06-03 21:18:45 +0900

process.c で引数の文字列を作るために rb_str_new4() といういけてない名前を使っていたところを rb_str_new_frozen() を呼ぶようにリファクタリングしています。 rb_str_new4 は rb_str_new_frozen のことなので意味はかわっていません。

tadf:r35886 2012-06-03 21:21:18 +0900

これも MARSHAL_LOAD_DIRECT というマクロが定義されている時だけ有効な変更なので多分作業中ということなのだと思いますが Complex と Rational の marshal_load の関数に extern されたラッパを定義して marshal.c の marshal_load でそれを直接呼ぶようにしています。また Complex#marshal_load や Rational#marshal_load の定義には marshal_load_fake() という関数を当てて、Ruby レベルからはそのメソッドは呼べないようにしています。うーんなるほど、Marshal.load が内部的に呼ぶ時は関数を直に呼ぶので実行できるけど Ruby からは呼べないようにしようとしてるんですね。直接関数を呼ぶ方法が決め打ちなのはつらいと思うので何かそういうことができる仕組みを作るのか、そこまでして immutable なことを保証するかという気もしますね。

akr:r35887 2012-06-03 21:25:54 +0900

process.c の rb_exec_getargs() から未使用の引数を削除しています。

naruse:r35888 2012-06-03 22:07:58 +0900

GPL ファイルに記載されている FSF の住所が古くなっているので GPL ファイルを http://www.gnu.org/licenses/gpl-2.0.txt に更新しているようです。 [ruby-core:44488] [Bug #6328]