ruby-trunk-changes r37819 - r37835

今日は WeakRef(が利用している WeakMap)が不正メモリアクセスを起こす不具合の修正、静的リンク用の configure のオプション追加、Process.getsid の追加などがありました。

nobu:r37819 2012-11-23 22:49:14 +0900

Windows 版でスクリプトファイルを実行可能形式にまとめるツール tool/mkrunnable.rb でライブラリディレクトリのアーキテクチャ毎のサブディレクトリを掘るようにしています。さてなんのためでしょう。

nobu:r37820 2012-11-23 23:44:45 +0900

標準添付ライブラリ mkmf.rb で mingw64+MSYS でコマンドラインに余分な改行が含まれてしまうことがあったらしく String#chomp ではなく String#strip で pkgconfig の出力を整形するように修正しています。 [ruby-core:47998] [Bug #7163]

nobu:r37821 2012-11-24 00:00:12 +0900

configure に --disable-dln というオプションを追加して dln.c をコンパイルしないようにしています。 --with-static-link-ext を指定して静的リンクをするように ruby をビルドしても dln.o がリンクされていると dlopen(3) が使われているので警告がでることがあるらしく、これを抑制するためのようです。 [ruby-core:37676] [Feature #4946]

svn:r37822 2012-11-24 00:00:20 +0900

version.h の日付更新。

nobu:r37823 2012-11-24 00:00:55 +0900

proc_options(), process_options(), ruby_process_options() などで argc == 0 で argv == NULL のケースが考慮されていなかったのを修正しています。 通常最低でも argc == 1 で argv[0] にはプログラム自体の名前(パス)が渡されるのでそういうことはないのですが、execv(2) で明示的に NULL を渡されたり、組み込みの利用で関数を直接呼ばれたりしたらありうるということで(つまりやっぱり普通はない)対応しています。 [ruby-core:49889] [Bug #7423]

kosaki:r37824 2012-11-24 11:00:10 +0900

vm->living_threads に登録する rb_thread_id_t の値を実際にスレッドを生成する前に格納してしまっていたのを修正しています。 よくこれで動いてましたね、と思いましたがキーのほうに rb_thread_t が使われているのでデッドロック検出とかは value のほうは使われていなかったので気付かれにくかったようです。

kosaki:r37825 2012-11-24 11:51:24 +0900

getsid(2) を呼び出すためのメソッド Process.getsid を追加しています。 [ruby-dev:45977] [Feature #6757]

shirosaki:r37826 2012-11-24 13:01:33 +0900

WeakRef の不具合修正。 WeakRef を実装するために作られた WeakMap の finalizer で内部で参照を保持するために作られている配列に格納するオブジェクトを元のオブジェクトに修正したり、 VALUE からポインタを取得する方法に間違いがあったのを修正したり。 [ruby-core:49044] [Bug #7304]
が、これはテストが SEGV したということで後に r37831 で revert されています。

shirosaki:r37827 2012-11-24 13:01:37 +0900

WeakMap の実装する関数の引数、変数の命名を変更するリファクタリング[ruby-core:49044] [Bug #7304]
これも r37831 で revert されています。

shirosaki:r37828 2012-11-24 13:01:40 +0900

rb_ary_aref() で rb_scan_args に引数を格納するポインタとして 0 を渡していたところがあったのですが、x64 mingw 環境では(多分その他の 64ビット環境でも) NULL ((void *)0) でないとバイト幅が異なるので、可変長配列部分に渡すと不正なメモリアクセスをおこしてしまっていたのを修正しています。

shirosaki:r37829 2012-11-24 13:01:43 +0900

r37825 で追加した Process.setsid のテストで ruby インタプリタの起動を "./ruby-trunk" と決め打ちで書かれていたところを定数 RUBY を使うように修正しています。 [ruby-dev:45977] [Feature #6757]

ko1:r37830 2012-11-24 13:12:30 +0900

TracePoint#return_value と TracePoint#raised_exception で値が Qundef でないかのチェックの前にイベントの種別がそれぞれ return value や exception を返すに相応わしいものかをチェックするようにしています。

naruse:r37831 2012-11-24 16:43:13 +0900

r37826 と r37827 を revert しています。 コミットログは "r37827 and r37828" と書かれていますが実際は r37826 と r37827だと思います。 rubyspec で SEGV が発生したとのこと。

tadf:r37832 2012-11-24 19:31:10 +0900

rubyコマンドラインオプション -h と --help のテストメソッドを切り分け&統合するリファクタリング

naruse:r37833 2012-11-24 21:09:39 +0900

拡張ライブラリ nkfunicode_iconv_combine() と nkf_iconv_utf_32_combine() で返り値の型を size_t から nkf_char に変更しています。

shirosaki:r37834 2012-11-24 21:26:54 +0900

r37831 で revert された r37826 の再修正です。 r37826 では rb_ary_delete() を使って WeakMap が内部に保持している配列から参照を消す時にその中で rb_equal() が呼ばれてしまって死んでいるオブジェクトにメソッドが呼ばれる危険があったようです。 このため array.c に rb_ary_delete_same_obj() という関数を生やして、これを使って削除するようにしています。これは値の比較を VALUE の比較、つまり同一性で判定しています。しかしこの関数での rb_ary_modify() の位置はここでいいのかな。まあでも rb_ary_delete() をベースにしているようなのでいいのでしょう。 [ruby-core:49044] [Bug #7304]

shirosaki:r37835 2012-11-24 21:26:57 +0900

同じく r37831 で revert された WeakMap 関連の引数、変数名の改名するリファクタリングの再適用です。 [ruby-core:49044] [Bug #7304]