ruby-trunk-changes r37948 - r38001

今日もたくさんの変更がありました。 大きいところは RubyGems 2.0 のマージ、MiniTest 4.3.2 のマージがありました。また Refinement のパフォーマンス改善(仕様も変わっている?)の変更もありました(が、どうもうまく動かないみたい)。
その他 TracePoint のメソッド名変更、profiler や debugger 用の C API の変更/追加、 Thread::Backtrace の改名、GC.stat の項目追加など VM まわりの変更もいろいろありました。
リリースを前にしてこのところ大量の変更が入っています。preview1 が出てからいっそう開発が活発になっているような気がしますね。

svn:r37948 2012-11-29 02:56:50 +0900

version.h の日付更新。

nagachika:r37949 2012-11-29 03:09:34 +0900

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

ko1:r37950 2012-11-29 04:46:44 +0900

バックトレース情報を保持するクラス RubyVM::Backtrace を Thread::Backtrace へ名前空間を移動しています。

tenderlove:r37951 2012-11-29 05:20:50 +0900

DTrace の probe の function-entry や function-return という名称を method-entry, method-return にそれぞれ変更しています。

ko1:r37952 2012-11-29 05:30:01 +0900

vm_backtrace.c の関数名の変更や再利用するリファクタリング

kosaki:r37953 2012-11-29 06:54:52 +0900

Thread の終了時に SystemExit 例外を捕捉したら $SAFE (th->safe_level) をチェックしていましたが SystemExit の発生時にチェックしているため不要なので条件分岐を消しています。

kosaki:r37954 2012-11-29 06:55:03 +0900

同じくスレッドの終了時の重複して不要なコードを削除。 th->errinfo と rb_errinfo() は同じことなので rb_errinfo() の代入のほうを削除しています。

kosaki:r37955 2012-11-29 06:55:14 +0900

thread_start_func_2() は新しく Thread を作る時に使われるけどメインスレッドでは使われないので、カレントスレッドがメインスレッドでないことをチェックしている分岐は不要なので消して、念のため rb_bug() で最初にメインスレッドから呼ばれたら落とすようにしています。

kosaki:r37956 2012-11-29 06:55:26 +0900

thread_start_func_2() の処理の順番を多少入れ替えています。 naive そうな部分ですが kosaki さんが small cleanups とだけ書いて入れているからには動作にはあまり影響のない変更なのでしょう。

ko1:r37957 2012-11-29 09:12:49 +0900

caller_location や backtrace_location の取得する開始位置のインデックスに負の数を指定して末尾(スタックトレースとしては底のほうというか呼び元のほう)から数えた指定を受け付けるようにしています。 [ruby-core:50092] [Feature #7434]

ko1:r37958 2012-11-29 09:48:16 +0900

r37886 で追加された プロセス終了時に実行される ruby_cleanup() でメインスレッドのステータスを THREAD_KILLED にして非同期例外が呼ばれるのを防ぐようにしている位置を rb_thread_terminate_all() のできるだけ直前に移動しています。

naruse:r37959 2012-11-29 09:52:51 +0900

thread.c の do_select() という関数の変数 result のコンパイラの未初期化変数の警告を抑制するためにマクロ UNINITIALIZED_VAR() を使うようにしています。

naruse:r37960 2012-11-29 10:11:47 +0900

r37953 でスレッド終了時に SystemExit だったら $SAFE (safe_level) をチェックするのをやめたのを revert して、やっぱりチェックして 4以上だったら SecurityError を発生させるようにしています。 FreeBSDMac OS X でテストが失敗していたとのこと。

ko1:r37961 2012-11-29 10:26:38 +0900

vm_backtrace.c の vm_backtrace_to_ary() で変数の型の修正(int -> long)。

ko1:r37962 2012-11-29 10:30:42 +0900

vm_backtrace.c で他にも backtrace の level とインデックスの引数の型を int -> long に変更しています。

kosaki:r37963 2012-11-29 11:09:36 +0900

r37953 で消して r37960 で revert された Thread 終了時の $SAFE (safe_mode) のチェックを削る変更の再修正。 2つ目の if の条件の safe_level も削ったために $SAFE == 4 で終了した時の errinfo のクリアが抜けていたので条件分岐を整理して safe_level のチェックと SystemExit で終了しているかのチェックに分解しています。

kosaki:r37964 2012-11-29 11:50:11 +0900

r37956 で small cleanups とだけ書いて thread_start_func_2() の中の処理順序を変更していたのを revert しています。何か問題があったんでしょうか。

nobu:r37965 2012-11-29 11:58:31 +0900

主に lib/rdoc/ 以下のファイルの行末の空白除去。

nobu:r37966 2012-11-29 11:58:34 +0900

拡張ライブラリ dl のテストでは当然 require "dl" しないといけないわけですが r37910 で deprecated の警告が出るようになったので $VEREBOSE = nil で警告を抑制して require するようにしています。

ryan:r37967 2012-11-29 12:23:11 +0900

標準添付ライブラリ minitest の 4.3.2 (r8026) をマージしています。3.4.0 → 4.3.2 のバージョンアップ。並列テスト実行が入っているっぽいです。 詳細は minitest のリリースノートを参照のこと。 参考URL: https://github.com/seattlerb/minitest/blob/master/History.txt

nobu:r37968 2012-11-29 12:24:21 +0900

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

nobu:r37969 2012-11-29 13:39:09 +0900

DTrace のテストで dtrace コマンド をスクリプト毎にチェックしていたのを test/dtrace/helper.rb でモジュール定義するところで一度チェックして、他はそのモジュールの defined? で判定するようにしています。 また Process.euid == 0 (つまり root ユーザ?)をチェックして skip していたのを、同じく黙ってモジュールの定義をやめて skip を増やすのでなくテストケース自体定義されないようにしています。 dtrace の実行には root 権限が必要なんですね。

ko1:r37970 2012-11-29 14:05:19 +0900

GC.stat が返す情報に項目を追加しています。

  • total_allocated_object
    • 確保されたオブジェクトの総数(通算)
  • total_freed_object
    • GC で回収されたオブジェクトの総数(通算)

これらは通算なのでどんどん増えていく一方(そしていずれ overflow して 0 に戻る)というカウンタです。total_allocated_object - total_freed_object でまだ生きているオブジェクトの数が計算できるのでこれを用いて objspace_live_num() という関数を実装して、 rb_objspace_t の live_num メンバは削除しています。

ko1:r37971 2012-11-29 14:29:22 +0900

GC.stat で返す Hash のキーとなる Symbol を毎回 rb_intern() を呼ばずに最初に呼ばれた時に static 変数に作っておいたものを使いまわすようにしています。 GC.stat の高速化のため。

ko1:r37972 2012-11-29 14:52:27 +0900

TracePoint#klass を TracePoint#defined_class に改名しています。 [ruby-core:50187] [Feature #6895]

ko1:r37973 2012-11-29 14:57:35 +0900

TracePoint#id を TracePoint#method_id に改名しています。

naruse:r37974 2012-11-29 15:19:05 +0900

minitest のテストで $VERBOSE をセットするテストケースの ensure 節で元に戻す処理が、テストケースが skip されているため nil に変更されてしまって後続のテストに影響していたので nil だったら書き戻さないようにしています。 -W0 の時は $VERBOSE=nil なのでこれだと戻らなくなることになりそうです。

ko1:r37975 2012-11-29 15:43:31 +0900

include/ruby/debug.h で公開している rb_tracepoint_attr_*() という API を rb_tracearg_*() という引数を VALUE 型から struct rb_trace_arg_struct * に変更した API に変えています。 VALUE からの構造体ポインタの取り出しの手間を省いて効率的にしているのでしょう。 rb_tracepoint_attr_*() も接頭語の rb_ を削って static 関数として残っています(メソッドの定義に使うため)。
これらの公開 API は debugger, profiler から利用するために提供されているもので、いずれドキュメントが書かれるそうです。

drbrain:r37976 2012-11-29 15:52:18 +0900

RubyGems 2.0 がマージされました。Gem::Version == "2.0.a" となっています。1.8.24 -> 2.0.a のメジャーアップデートです。詳細はリリースノートを……と言いたいところなのですが https://github.com/rubygems/rubygems/blob/master/History.txt は 1.8.24 までの変更点しか記述されていませんね。変更点は膨大なので読めませんが、SSL 証明書が追加されていたりするのでセキュリティの強化などがありそうです。 nahi さんが 証明書の未検証や https -> http のリダイレクトの禁止といった修正のコミットをされていますね。
また tool/change_maker.rb でソースファイルに不正な UTF-8 文字が含まれている場合の対処として diff コマンドの結果を ASCII-8BIT として扱うようにしています。

usa:r37977 2012-11-29 15:54:53 +0900

拡張ライブラリ psych の extconf.rb に --enable-bundled-libyaml というオプションを追加して、システムの libyaml が見付かった時でも psych に同梱されている libyaml のソースを利用するように指示できるようにしています。

naruse:r37978 2012-11-29 16:01:46 +0900

rdoc のテストで -W0 オプションをつけて $VERBOSE = nil の状態だと失敗するテスト(警告が出ることをチェックするのに $VERBOSE = nil だと出ない)のために RDoc::TestCase#verbose_capture_io というヘルパーを定義してそれを利用するようにしています。

ko1:r37979 2012-11-29 16:05:27 +0900

rb_debug_inspector_{open,frame_binding_get,frame_class_get,frame_iseq_get,backtrace_locations} といったデバッガ向けの公開 API を追加しています。 rb_debug_inspector_open() にコールバック関数を渡すとrb_debug_inspector_t にデバッガ用の情報を作って渡して呼び出してくれて、その中で他の API を使ってフレームの情報等を取り出せる、というような使いかたみたいです。詳しくはこれも解説が書かれるでしょう、きっと。

ko1:r37980 2012-11-29 16:15:30 +0900

vm_backtrace.c の rb_debug_inspector_open() で int 型のメンバに代入するために配列サイズを取得するので型をそろえてコンパイラの警告を抑制するため RARRAY_LENINT() に変更しています。

drbrain:r37981 2012-11-29 16:18:26 +0900

lib/rubygems/test_case.rb に rubygems のテストの時に鍵の情報を読み込む処理が書かれていて、実際の実行環境で呼ばれると Errno::ENOENT になるので rescue でガードしています。テスト用ならテストコードのほうに書けばいいのに。

drbrain:r37982 2012-11-29 17:04:04 +0900

rubygems のテストで鍵の情報を読み込むファイルパスの解決がソースツリー以外でのビルドを考慮していなかったのを修正しているようです。

nobu:r37983 2012-11-29 17:10:23 +0900

lib/rubygems と rdoc のテストと rubygems のテストと vm_backtrace.c の行末の空白除去。一ヶ所 vm_backtrace.c には空行の削除もありますね。

nobu:r37984 2012-11-29 17:11:10 +0900

拡張ライブラリ io/wait のテストで Errno::EWOULDBLOCK の rescue が漏れていたのを修正しています。環境によっては Errno::EWOULDBLOCK は Errno::EAGAIN と同じですが異なる環境(Windows/MinGW)もあるようです。 [ruby-core:49894] [Bug #7420]

nobu:r37985 2012-11-29 17:12:29 +0900

tool/generic_erb.rb, tool/id2token.rb に MinGW 用に --path-separator というオプションを追加しています。 また tool/vpath.rb というツールを tool/instruction.rb から切り出して新規作成しています。ビルドプロセスに関するツールだと思いますが詳しい内容は見ていません。

nobu:r37986 2012-11-29 17:13:16 +0900

DTrace のテストで root 権限が必要なところは sudo ($SUDO) コマンドが使えるかもチェックして、使えるようなら sudo つきで dtrace コマンドを実行するようにしています。

zzak:r37987 2012-11-29 17:15:53 +0900

GC モジュール、GC::Profiler, ObjectSpace, ObjectSpace::WeakMap (つまり gc.c の) rdoc の追記、修正です。 [ruby-core:50245] [Bug #7449]

drbrain:r37988 2012-11-29 17:22:04 +0900

lib/tracer.rb で -r オプションでロードした時だけ Tracer.on を実行するようにするためのチェックで custom_require.rb がバックトレースに現れるのでそれを除去しているのを RubyGems 2.0 で custom_require.rb が rubygems/core_ext/kernel_require.rb に変わったので修正しています。
なんか見覚えがあると思ったら自分が対処して、require まわりが変わったらまた壊れそうだなぁと言ってた部分ですね。つまり RubyGems 2.0 を 1.9 以前で使うとまた Tracer.on が壊れますね。 参考: http://d.hatena.ne.jp/nagachika/20110629/ruby_trunk_changes_32273_32285

naruse:r37989 2012-11-29 17:34:52 +0900

lib/rubygems.rb 詳細はわかりませんが Kernel#gem メソッドが未定義の時に rubygems.rb の Gem.load_yaml で処理を抜けるようにしています。 --disable-gems をつけて起動して起動時に rubygems がロードされない時にある順序で require すると落ちることがあるようです。どこかで require が足りないとかでしょうか。

nobu:r37990 2012-11-29 17:45:13 +0900

定数を再代入した時の警告に名前空間がフルパスで表示されるようにしています。 [ruby-dev:46239] [Feature #7190]

nobu:r37991 2012-11-29 19:15:16 +0900

Hash のリテラルでキーと値の組合せがずれておかしな Hash ができてしまうことがあるそうでその対処なのですが、ビルドが通ってないらしくてすぐ revert されています。 [ruby-dev:46658] [Bug #7466]

naruse:r37992 2012-11-29 20:09:34 +0900

r37991 を revert しています。ビルドできなかったみたいですね。

shugo:r37993 2012-11-29 21:50:10 +0900

Refinement 関連の変更です。コミットログから読み取ると メソッドの種別に VM_METHOD_TYPE_REFINED というのを追加して refine したモジュールで定義したメソッドはこの種別のメソッドエントリを作るようにして、そこから上書きする対象のメソッドエントリへの参照を持つようにしているようです。メソッド探索の方法を変更してパフォーマンスへの影響を抑えるようにしているみたいです。
しかしこの変更からテストが通らない環境があるみたいなので再修正もしくは revert されるかもしれません。

nahi:r37994 2012-11-29 22:24:42 +0900

拡張ライブラリ openssl のテストに、CTR モードの OpenSSL::Cipher のテストを追加しています。 openssl 1.0.1 以降でサポートされているモードなので例外メッセージをチェックして "unsupported cipher algorithm" が含まれていたら無視するようにしています。 バージョンでチェックしたほうがいいんじゃないでしょうか。 [ruby-core:35293] [Bug #4408]

nahi:r37995 2012-11-29 22:25:47 +0900

r37994 の ChangeLog のエントリにチケットの参照を追記しています。

ngoto:r37996 2012-11-29 22:54:02 +0900

拡張ライブラリ openssl のテストが sparc64 上で失敗するのを修正。バイト列として 1byte のバッファを渡すのに int へのポインタを char * にキャストをして渡すという不具合でした。これはひどい[ruby-core:50292] [Bug #7463]

kazu:r37997 2012-11-30 01:55:23 +0900

r37907, r37971, r37975, r37979, r37994 の ChangeLog エントリの typo やインデント修正。

svn:r37998 2012-11-30 01:55:28 +0900

version.h の日付更新。

kazu:r37999 2012-11-30 02:05:17 +0900

r37820 の ChangeLogtypo 修正。

naruse:r38000 2012-11-30 02:35:29 +0900

r37991 の Hash リテラルが壊れる不具合修正をやりなおしています。 r37991 は修正方法は合ってて assert() の入れかたが間違っていたみたいですね。 どうも key => value の key はリテラルvalueリテラルじゃない(正確には AST で NODE_LIT で表現されるリテラルじゃない)時に key までで一旦切れて Hash にマージされて、その時に端数になった最後の key が捨てられてそこから value -> key とずれてしまうみたいですね。っていってもそんな Hash リテラルいくらでもあると思うので発生条件はもう少し複雑だと思いますが。ハッシュの要素数が大きい時に通るのかなぁ。 [ruby-dev:46658] [Bug #7466]
[追記]なかださんに条件を教えていただきました。「ハッシュの要素が129以上で、129個目以降のvalueに非NODE_LITがあり、それ以前がすべてNODE_LITのとき」とのこと。意外になかなかそういうハッシュリテラルはないんですねぇ。[/追記]

tenderlove:r38001 2012-11-30 02:55:54 +0900

DTrace 対応の RUBY_DTRACE_METHOD_RETURN_HOOK() にカレントスレッドを渡す th 引数を追加して、 klass を省略した時に現在のメソッドが取得できるようにしています。そうして例外でメソッドから抜ける時も METHOD_RETURN のプローブを追加しています。