ruby-trunk-changes r43845 - r43859

今日は RubyGems の更新で Gemfile の :git や :path オプションの扱いの修正や File.readlink の不具合修正、TracePoint の internal なイベントのフック呼び出しの仕様変更などがありました。

drbrain:r43845 2013-11-26 04:14:49 +0900

RubyGems の最新版をマージしています。主に Gemfile で :git や :path オプションで git リポジトリやローカルのパスから gem パッケージを直接インストールする時のパスの扱いのバグを修正しているそうです。

svn:r43846 2013-11-26 04:14:57 +0900

version.h の日付更新。

tmm1:r43847 2013-11-26 06:46:00 +0900

NEWS ファイルに拡張ライブラリ objspace の新規メソッド ObjectSpace.after_gc_start_hook= と ObjectSpace.after_gc_end_hook= の追記しています。 また ObjectSpace.dump_all の rdoc 用コメントを出力先の省略時は出力したファイルパスを返していたのが r43679 で File オブジェクトを返すようにしたのに追随させています。

nobu:r43848 2013-11-26 10:57:55 +0900

r43841 で bigdecimal の gemspec ファイルから date の指定を削除したのを revert して、ついでに svn の $Date:: キーワード置換を利用するようにしています。 svn や git のリポジトリから直接チェックアウトしたソースツリーからインストールする時は大丈夫だけどリリースパッケージからインストールすると何か問題があるそうです。多分 gem の date がインストール時のものになってしまうのだと思いますがパッケージ版との差異はよくわかりませんでした。

nobu:r43849 2013-11-26 11:20:10 +0900

ext/bigdecimal/bigdecimal.gemspec の svn property 設定。svn のキーワード置換を有効にするために svn:keywords を設定しているようです。

nobu:r43850 2013-11-26 11:23:13 +0900

r43849 に続いて ext/bigdecimal/bigdecimal.gemspec の svn property を設定。肝心の Date が svn:keywords に追加されていなかったので追加しているようです。

glass:r43851 2013-11-26 11:45:53 +0900

ruby_atomic.h で atomic 操作のために使っていた __sync_xxx() のビルトイン関数は最新の GCC ではもう legacy になっているそうで、__atomic_xxx ビルトイン関数をチェックしてこちらが利用可能だったら使うように configure のチェックとマクロ定義を追加しています。コンパイラの進化は速いなぁ。

tmm1:r43852 2013-11-26 14:27:22 +0900

拡張ライブラリ objspace の ObjectSpace.dump_all で文字列オブジェクトのダンプ時に JSON としてパースできるようにコントロール文字は \uXXX エンコーディングして出力するようにしています。また rdoc 用コメントに :output オプションに File オブジェクトを直接渡す呼び方についても追記しています。

nobu:r43853 2013-11-26 16:30:37 +0900

File.readlink の実装で readlink(2) のバッファが足りない時にバッファとして使っている文字列オブジェクトのサイズを伸長する処理が抜けていたので rb_str_set_len() の呼び出しを追加しています。 メモリ領域の確保は rb_str_modify_expand() で行なわれていたので1度は拡張できていたのですが String のサイズをセットしていなかったので、多分 200 bytes → 400 bytes の伸長のところで 300bytes しか確保されなくてメモリエラーを起す可能性があったと思います。 [ruby-core:58592] [Bug #9157]

ko1:r43854 2013-11-26 17:41:44 +0900

TracePoint のイベントには C API から呼ばれた時だけ設定できる internal なイベントがいくつかありますが、通常のイベントとこの internal なイベントを同時に指定してコールバックを登録しようおすると TypeError が発生するようにしています。将来的に internal なイベントに対して特別扱いする処理を入れたいとのこと。ところで NEWS ファイルに追記されている (such as RUBY_EVENT_CALL, RUBY_EVENT_RETURN) は両方とも通常のイベントなのでは……と思ったけどこのかっこの部分がその前の "normal events" の具体例なんですね。internal なイベントと通常のイベントのペアの例だとパースしてしまって、一瞬間違ってると思ってしまいました。

ko1:r43855 2013-11-26 18:42:04 +0900

TracePoint のコールバック実行時の rb_thread_t::errinfo の保護とコールバック実行中に再度コールバックが呼ばれた時のチェックを通常のイベントと internal なイベントで変更しているようです。例外情報は internal なイベントでは復旧させないようにしていています。おそらく internal なイベントのコールバックは C 実装であることが前提になっているので、そこで大域脱出を起こすようなコードはサポートしないとすることで高速に呼び出せるようにしているのではないかと推測します。 ChangeLog には再入のチェック(イベントのコールバック中に別のイベントのコールバックを実行しないようにするチェック?)についてもなにやら書かれているのですが、通常のイベントのフックの実行中は他のフックは実行しないようにしていたのですが、internal なイベントのフックは呼び出すようにしているそうです。

ko1:r43856 2013-11-26 19:26:41 +0900

拡張ライブラリ objspace の ObjectSpace.trace_object_allocations_start のコールバックに渡す class_path に対象の Class が freeze されていたら渡さないようにしています。rb_class_path() の結果を渡しているのですが、この関数は結果を cache するためにインスタンス変数に結果を格納するために freeze しているかのチェックがあり、freeze されている Class に対して呼ぶと例外が発生してしまうため。これは当座の対応でこの目的のための class path を取得する関数を実装して対応する予定とのこと。

ko1:r43857 2013-11-26 19:30:42 +0900

make run.gdb ターゲットで gdb の起動時に実行するコマンドに set breakpoint pending on を追加しています。この設定は break コマンドで breakpoint を設定する時に拡張ライブラリの関数などでまだロードされていない時に警告が出るのを抑制してくれるというものみたいです。

ko1:r43858 2013-11-26 20:03:57 +0900

r43645 で追加された TracePoint の :a_call と :a_return イベントのテストケースを追加しています。 [ruby-core:58395] [Feature #9120]

nobu:r43859 2013-11-26 22:43:40 +0900

Object#hash によるハッシュ値を Hash で利用する時に相互参照しているオブジェクトがお互いの hash メソッドの戻り値を元にハッシュ値を計算しようとすると無限再帰に陥る現象があったので、hash メソッドの呼び出し時に再帰を検出してエラーを起こすようにしています。 [ruby-core:58567] [Bug #9151]