ruby-trunk-changes r38002 - r38070

今日もまたたくさんの変更がありました。 Rake 0.9.5 のマージ、RubyGems の修正多数、TracePoint の仕様変更、Thread.control_interrupt のメソッド名変更、その他不具合修正やドキュメント追加などいろいろあります。

naruse:r38002 2012-11-30 03:22:52 +0900

拡張ライブラリ dl の DL::Handle::NEXT のテストでライブラリ内の次の関数のシンボルを取得するのに require "objspace" して拡張ライブラリをロードして(objspace なのはたまたまで、なんでもいいんだと思います)、Init_objspace() がみつかることを期待しているのですが、既に require "objspace" していると順番が意図した通りにならず失敗するので子プロセスを起動して実行するようにしようとしている、ようにコメントを読むと思えるのですが、minitest の capture_io はプロセスを起動していないようなのではたして効果があるのでしょうか?

drbrain:r38003 2012-11-30 04:16:46 +0900

Rake 0.9.5 をマージしています。 0.9.4 → 0.9.5 のバージョンアップです。トレース出力の機能の変更があったみたいです。 参考URL: https://github.com/jimweirich/rake/blob/master/CHANGES と思ったけど 0.9.3 で止まってますね。リリースノート……。

naruse:r38004 2012-11-30 05:34:29 +0900

rubygems のテストで Dir.glob の順序に依存した比較をする assert があり、Dir.glob の順序は不定なので(ファイルシステムの実装などに依存)、ソートしてから比較するようにしています。

naruse:r38005 2012-11-30 05:48:52 +0900

r38004 のソートするメソッド名の typo 修正。

ryan:r38006 2012-11-30 07:02:36 +0900

MiniTest 4.3.2 (r8027) をマージしています。 といっても minitest 自体のテストを変更しているだけです。

ko1:r38007 2012-11-30 07:28:16 +0900

TracePoint のイベントに Thread の開始と終了、ブロックの呼び出しと終了を追加しています。しかしブロックの開始終了のために VM の命令にコンパイルする時に trace 命令を追加していて、何もしなくても遅くなってしまうので議論したいということです。遅いの嫌だって人やTracePointでイベント取得したいって人は意見を言ってみるのが良いでしょう。

ko1:r38008 2012-11-30 07:35:09 +0900

vm_backtrace.c の backtrace_to_str_ary(), vm_backtrace_to_ary(), vm_backtrace_to_ary() でコンパイラの最適化による GC マーク漏れを回避しようとしているようです。が、 self は保護必要なのかなぁ。

ko1:r38009 2012-11-30 07:44:51 +0900

thread.c の暗黙の型変換で警告がでていたところに明示的キャストを追加しています。

nari:r38010 2012-11-30 07:56:02 +0900

メインスレッドにファイナライザを登録してプロセス終了するなど、プロセスの終了処理時に必要なオブジェクトにファイナライザが登録されていると SEGV などが発生する不具合の対処として、終了時のファイナライザ実行を繰り返し呼んで、ファイナライザ実行した結果追加されたファイナライズ待ちのオブジェクトのファイナライザを呼んでいたのをやめているみたいです。これはプロセス終了時に確実にファイナライザが実行されなくなることもあるということなんでしょうか? [ruby-dev:46647] [Bug #7452]
あと r37927 の ChangeLog のエントリを書き換えて typo にしてしまっているようです。

nari:r38011 2012-11-30 08:02:03 +0900

直前の r38010 で r37927 の ChangeLog エントリに typo を入れてしまっていたのを修正しています。

nari:r38012 2012-11-30 08:10:36 +0900

r38010 の変更の結果使われなくなった gc.c の関数 chain_finalized_object() を削除しています。

drbrain:r38013 2012-11-30 08:34:29 +0900

ライブラリ rdoc のマークアップのパーサで String#byteslice を使って高速化したり、インスタンス変数の typo していたのを修正したりとこまごました修正が入っています。

drbrain:r38014 2012-11-30 09:23:15 +0900

r38004, r38005 で rubygems のテストで Dir.glob の結果がソートされていないことによるテスト失敗をテスト側でソートすることで修正しましたが、ライブラリ(rubygems)内部でソートするようにしています。

nobu:r38015 2012-11-30 09:38:24 +0900

r38008 で vm_backtrace.c に追加した GC マーク漏れの対処を RB_GC_GUARD_PTR() でなく RB_GC_GUARD() を使うように書き直しています。 RB_GC_GUARD_PTR() は直接使うためのものではないのでその旨ヘッダにコメントを追加しています。

naruse:r38016 2012-11-30 09:54:04 +0900

r38002 で DL のテストで require "objspace" で確実にロードさせるために子プロセスを起動しようとしているようだったのですが、使っている capture_io は子プロセスを起動していないので capture_subprocess_io を使っています。しかし minitest の capture_subprocess_io はこれが fork してくれるものではなくて、fork しても大丈夫なように標準出力などの受け渡しを Tempfile 経由にしているというだけなので、これでもだめなのでした。

drbrain:r38017 2012-11-30 10:01:26 +0900

rdoc のパーサに無意味な式など -w をつけると警告が出るものを対処しています。
と言いたいところなのですが、true を代入した変数をその直後に if で分岐していたのがあって、それを if の内容ごと消して、その後の unless は残している(そっちは実行されないはず)などかなり謎なことをしていて怪しいです。

naruse:r38018 2012-11-30 10:29:57 +0900

r38002, r38016 の再修正です。 test/ruby/envutil.rb の assert_in_out_err を使って子プロセスで実行するようにしています。が、今度は require "dl" が足りないのでは。と思ったけど更に再修正はされていないのでこれで動いているようですね。あれ、なんでだろう……。

nobu:r38019 2012-11-30 10:35:08 +0900

拡張ライブラリ fiddle のライブラリ内で require "dl/func" していたのはもう DL への依存がなくなって不要になったので削除しています。

nobu:r38020 2012-11-30 10:35:13 +0900

ext/fiddle/lib/fiddle/value.rb のインデントの修正のみ。

drbrain:r38021 2012-11-30 10:39:03 +0900

RDoc で ri フォーマットのパーサで他のページへのリンクがページ名が行頭にある時だけ生成されるようになっていたのを行の途中でもマッチするようにしているんじゃないかと思います。

shugo:r38022 2012-11-30 11:11:59 +0900

r37993 の Refinement の速度向上のための実装方法変更を revert しています。 テストで SEGV が発生してしまったためです。

drbrain:r38023 2012-11-30 12:21:06 +0900

あまり詳しく調べていませんが rake でバックトレースのうち標準のライブラリパスのものを抑制するとかのために RbConfig から prefix, libdir などのキーワードでパスを抽出してきていてその結果に重複があるのを Array#uniq で消すようにしています。またテストで カレントディレクトリがその消されるパスに含まれていたら backtrace 関連のテストを skip するようにしています。カレントディレクトリに一時ファイルを置くのを止めたほうがいいんですけどね。

drbrain:r38024 2012-11-30 12:28:04 +0900

RubyGems の修正。特に参照がないのでよくわかりませんが Bundler との組み合わせて不具合があったのを修正しているそうです。 rubygems のなかみを知らないので詳しく読むのはあきらめています。

knu:r38025 2012-11-30 12:35:01 +0900

標準添付ライブラリ abbrev.rb のテストを追加しています。

knu:r38026 2012-11-30 12:56:25 +0900

r38025 で追加した abbrev のテストのテストデータにコーナーケースを踏むように変更をしているようです。

knu:r38027 2012-11-30 12:56:28 +0900

標準添付ライブラリ abbrev の Abbrev#abbrev にマッチ対象の文字列に改行が含まれているとその行頭でもマッチしてしまう不具合があったのを修正しています。

knu:r38028 2012-11-30 13:01:07 +0900

標準添付ライブラリ abbrev で [\w\W] という文字クラスを含む正規表現を使うと重複があるという警告が出ていたので、正規表現を使わず末尾から1文字ずつ削ってチェックしていく書きかたに変更しています。 正規表現のほうは \z でマッチしていたので文字列の末尾ではなく行末で削ってしまっていたのではないかと思うのでそもそも不具合もあったのかと思います。 [ruby-core:50344] [Bug #7471]

drbrain:r38029 2012-11-30 13:30:12 +0900

RubyGems で gem install 時にインストール済みの bin lib などのファイルを削除してからインストールするようにしているみたいです。

nobu:r38030 2012-11-30 13:32:19 +0900

r38029 で追加されたファイルの svn property の設定。

drbrain:r38031 2012-11-30 13:48:50 +0900

RDoc::VERSION を "4.0.0.preview2", Gem::VERSION を "2.0.0.preview2" に変更しています。

zzak:r38032 2012-11-30 13:53:09 +0900

time.c の rdoc の主に体裁や英語の文法修正など。 [ruby-core:49203] [Bug #7326]

zzak:r38033 2012-11-30 14:06:45 +0900

標準添付ライブラリ cgi のタグ生成のサンプルコードの修正。サンプルのバージョンを html3 から html4 にしているのと、メソッドに明示的に () をつけているのを削っている程度です。 [ruby-core:50303] [Bug #7465]

nobu:r38034 2012-11-30 14:41:57 +0900

parse.y に lexer の状態をチェックする IS_lex_state() というマクロがあるのですが、これはチェックする対象の変数が lex_state 固定なので、変数を指定してチェックできる IS_lex_state_for() というマクロを新設して、各所でこれを使うようにしています。 lexer の状態は一部ビットフラグになったので、まだ "==" で比較していたところもこれでビット単位のチェックになっています。

nobu:r38035 2012-11-30 14:42:01 +0900

parse.y でビットフラグ LVAR_USED という定数の定義に int 型の MSB を使っていたのを、利用している場所の変数に合わせて ID 型に変更しています。

zzak:r38036 2012-11-30 14:45:23 +0900

標準添付ライブラリ net/http.rb の rdoc にリクエストメソッドのクラスのリストから Net::HTTP::Patch が抜けていたので追加。

zzak:r38037 2012-11-30 15:15:59 +0900

set_trace_func の rdoc の体裁を修正してイベントの種類をリスト形式にしてみやすくしてくれていたりします。

drbrain:r38038 2012-11-30 15:20:34 +0900

r38014 で r38004, r38005 の rubygems での Dir.glob の結果のソートをテストから rubygems 内に移動した影響で、今度はまたテストのほうがソートにより順序が変わったためにこけてたので、テストのほうで比較対象もソートするようにしています。また gem package で gem をビルドする時に Gem.load_yaml を呼んでいます。まぎらわしいですがこれは YAML ファイルを読み込むという意味ではなくて Psych などの YAML のライブラリをロードする処理のことです。

nobu:r38039 2012-11-30 15:24:40 +0900

代入(によって宣言)されているけど使われていないローカル変数を警告する機能がありますが、同じスコープに同じ名前の Symbol リテラルがあると警告が出ない不具合を修正しています。 parse.y で lexer の状態のチェックに抜けがあってシンボルリテラルの登場をローカル変数の参照と勘違いして利用済みフラグをつけてしまっていたようです。 [ruby-core:49659] [Bug #7408]

drbrain:r38040 2012-11-30 16:06:01 +0900

NEWS ファイルに RubyGems 2.0.0 へのバージョンアップを追加しています。 変更点も書かれています。gem search がデフォルトで --remote になったとか、ruby 本体に同梱されている default gem の扱いの改善などもあったようです。

nobu:r38041 2012-11-30 16:19:16 +0900

$LOADED_FEATURE に文字列以外のオブジェクトが入っていて SEGV した時に backtrace を表示するためにそのオブジェクトに to_str を呼ぶことがあって、そこで例外や大域脱出があると SEGV のハンドラから抜けてしまうという問題があって、StringValueCStr() は使わず、オブジェクトが T_STRING 型ならそのままバッファを参照して、文字列じゃなかったら クラス名と VALUE の値で表示するようにしています。 [ruby-core:49573] [Bug #7402]

nobu:r38042 2012-11-30 17:43:42 +0900

なにやら ChangeLog には複数の修正が書かれているのですがこのコミットには実際には一部しか含まれていないみたいです。 rb_str_cmp_m() で文字列の比較をした結果が負、0、正の数で返していたのを -1, 0, 1 と固定の数値を返すようにしています。

nobu:r38043 2012-11-30 17:43:47 +0900

r38043 と ChangeLog に重複して追記されてしまっていますね。
rb_str_cmp_m() で rb_respond_to() でメソッドが呼べるか確認して rb_funcall() で呼んでいるのを rb_check_funcall() という関数でまとめて実行できるのでこれを利用するようにリファクタリングしています。

nobu:r38044 2012-11-30 17:43:52 +0900

rb_str_cmp_m() で引数が String でない時に to_str が呼べるかチェックしているのですが、 to_str を呼んでもその結果を使っていなかったので、 to_str で String に変換した結果を使うように修正しています。 [ruby-core:49279] [Bug #7342]

zzak:r38045 2012-11-30 18:25:24 +0900

TracePoint API の rdoc を追加しています。 [ruby-core:47243] [Feature #6895]

ko1:r38046 2012-11-30 18:28:35 +0900

Thread.control_interrupt を Thread.async_interrupt_timing に改名しています。また :never というオプションを :defer に変更しています。また Thread.check_interrupt も Thread.async_interrupted? に変更して機能もマスクされている例外を発生させるものだったのを、マスクで待たされている例外などがあるかどうかをチェックするだけの機能に変更しています。もう preview版 も出たというのにかなり大きく変更しますね。 [ruby-core:50375] [Feature #6762]

nobu:r38047 2012-11-30 18:50:30 +0900

ext/zlib/zlib.c で空に展開する関数マクロを 0 に変換するようにして、呼び元で (void) をつけて未使用の式の警告を抑制しています。 これマクロ内に (void) も入れてはいけないんでしょうか。

nobu:r38048 2012-11-30 18:50:32 +0900

ext/zlib/zlib.c で未使用の変数の警告除去のために RB_GC_GUARD() を使っています。

nobu:r38049 2012-11-30 18:50:34 +0900

vm_backtrace.c でも未初期化変数のコンパイラ警告の除去のため UNINITIALIZED_VAR() を使っています。

ko1:r38050 2012-11-30 18:55:32 +0900

TracePoint#enable, disable にブロックを渡した時にブロックパラメータに TracePoint オブジェクト自身を渡していたのをブロックパラメータなしにしています。

zzak:r38051 2012-11-30 19:08:02 +0900

r38050 の ChangeLog のエントリの typo 修正。

zzak:r38052 2012-11-30 19:29:49 +0900

TracePoint#enable の rdoc にブロックを渡した時の挙動について追記したり TracePoint#return_value の rdoc に b_return イベントのことも追記したりしています。

kou:r38053 2012-11-30 19:45:58 +0900

ruby に同梱されている default gem パッケージのインストール方法を変更しているのですが、テストが失敗するため revert されているので詳細はスキップします。

usa:r38054 2012-11-30 19:57:06 +0900

テストでメモリの使用量を調査するために Windows 版では dl を使っていたのを fiddle を使うようにしています。 しかし extern メソッドの引数に dl と fiddle で非互換があるそうです。 [ruby-core:50194] [Bug #7443]

usa:r38055 2012-11-30 19:59:38 +0900

r38054 の ChangeLog のエントリに ML 番号と チケットの番号を追記しています。

usa:r38056 2012-11-30 20:15:36 +0900

r38054 でテストに fiddle を使うようにしましたが fiddle が使えない時は dl を利用するようにしています。

usa:r38057 2012-11-30 20:22:49 +0900

r38056 で ::Fiddle = ::DL で定数に代入して DL に Fiddle のまねをさせようとしていたのですが、なにやらうまくいかなかったみたいで Win32 に extend している所で Fiddle::Importer がなかったら DL::Importer を使うようにしています。

ko1:r38058 2012-11-30 20:50:26 +0900

thread_begin と thread_end のイベントの時の TracePoint#self がその Thread のオブジェクトを返すようにしています。 self っていうメソッドでイベント毎に異なるものが返ってくるんですね。

usa:r38059 2012-11-30 21:09:19 +0900

TestUnit の並列テストで子プロセスから例外を Marshal.dump で親プロセスに渡しているところで ProxyError を使ってメッセージやバックトレースなど必要な情報だけ渡すようにしています。例外クラスを親プロセスが知らないと NameError が発生してしまう可能性があります。 LoadError なので通常は親プロセスも知っているかと思いきや、RubyGems が Gem::LoadError という LoadError を継承した例外を使っているらしく、ここも wrap するようにしています。 [Bug #6882]

kazu:r38060 2012-11-30 21:50:05 +0900

r38007, r38046, r38058 の ChangeLogtypo 修正。

usa:r38061 2012-11-30 22:00:23 +0900

r38053 の default gem のインストールについての変更を revert しています。 テストが失敗してしまっていたそうです。 またこのバージョンで一旦 make install してしまうと lib/ruby/gems/2.0.0 を消して make install しなおさないと不可逆な変更があるらしくエラーになるそうです。

kosaki:r38062 2012-11-30 22:52:24 +0900

r35486 でスレッド切り替えがビジーループ状態になるのを避けるため rb_thread_t::yielding というフィールドを追加して gvl_yield() 中のスレッドにタイマー割り込みしないようにしていたのを revert しています。これではレースコンディションを修正できていないそうです。

kosaki:r38063 2012-11-30 22:52:34 +0900

タイマースレッドが実行中のスレッドに割り込みするために rb_thread_t::interrupt_flag にフラグをセットするところで、rb_thread_t のポインタを取得してから interrupt_flag に書き込むあいだにその Thread が終了して、回収されてしまうと解放済みのメモリ領域に書き込んでしまう可能性が存在していたので、rb_vm_t::thread_destruct_lock に rb_mutex_t を持って、スレッドが終了する時に vm->running_thread を thread_destruct_lock で保護しつつ NULL にリセットするようにしています。 タイマースレッドが vm->running_thread に割り込みをかける時に、同じく thread_destruct_lock を保持しつつ vm->running_thread をみて NULL になっていたらその時は割り込みしない(できないですけど)ようにしています。 [ruby-dev:43859] [Bug #4911]

usa:r38064 2012-11-30 23:15:35 +0900

RubyGems で gemspec に executable として登録されているファイルに実行権限のビットがあることをチェックしているのですが、Windows ではこのチェックは不要なので unless Gem.win_platform? で括るようにしています。 [ruby-core:50388] [Feature #7427]

usa:r38065 2012-11-30 23:29:03 +0900

同じく Windows 上での RubyGems のテストの修正で、バイナリモードで読み込んだファイルの内容は改行コードが CR+LF になってるので \r を消す処理を入れています。 [ruby-core:50388] [Feature #7427]

usa:r38066 2012-11-30 23:43:10 +0900

またまた Windows 上での rubygems のテストで executable の上書き確認のメッセージをチェックしているところで、メッセージが異なっているのでとりあえず正規表現によるマッチにしてテストを通るようにした、というように見えます。 rubygems 自体が問題あるのかも。

nagachika:r38067 2012-12-01 00:05:15 +0900

r38063 の ChangeLog エントリの typo 修正。

nagachika:r38068 2012-12-01 00:05:18 +0900

r38064 の ChangeLog エントリの typo 修正。

svn:r38069 2012-12-01 00:05:19 +0900

version.h の日付更新。

nagachika:r38070 2012-12-01 00:07:30 +0900

r38042 から r38044 にかけて ChangeLog の内容が重複して追加されていたのを削除しています。