ruby-trunk-changes r43306 - r43343

今日は内部的に利用されるメモリ管理用の関数で解放されるメモリサイズも管理して確保しているメモリ量をより正確に把握できるようにする変更や RubyGems の再修正、GCデバッグ用の ObjectSpace のメソッド追加、Tsort のクラスメソッド版の API の追加などたくさん変更がありました。

zzak:r43306 2013-10-16 22:36:19 +0900

拡張ライブラリ io/nonblock の初期化関数 Init_nonblock() で rb_cIO を一旦ローカル変数に代入して参照していたのをやめています。多分 RDoc での認識のためだと思われます。

nobu:r43307 2013-10-16 22:50:29 +0900

Windows 版で psapi というライブラリでコンソールエミュレーションした時の対応で r43131 の続きみたいです。 pspapi.h が存在する時だけ #include するようにしているようです。

kazu:r43308 2013-10-16 23:11:44 +0900

r43300 と 43301 の ChangeLog エントリの typo 修正。

nobu:r43309 2013-10-16 23:39:53 +0900

r40755 で tool/ifchange に追加した --keep という拡張子をつけてバックアップするオプションを win32/ifchange.bat にも追加しています。

ko1:r43310 2013-10-17 05:21:04 +0900

拡張ライブラリ objspace に ObjectSpace.trace_object_allocations_debug_start というメソッドを追加しています。GCデバッグ用に ObjectSpace.trace_object_allocations_start を呼び出しておいて r43303 で追加した rb_bug() で実行するフック関数を追加する rb_bug_reporter_add() を利用してインタプリタの異常終了時にオブジェクトの確保情報を表示するようにしています。 "[BUG] ... is T_NONE" みたいな GC 絡みの不具合があった時にこれを使うと有用な情報が得られるかもしれないのでやってみて、とのこと。

svn:r43311 2013-10-17 05:21:10 +0900

version.h の日付更新。

ko1:r43312 2013-10-17 05:32:28 +0900

rb_bug() のフック関数を登録する rb_bug_reporter_add() で既に登録できる関数の上限を越えてたら rb_bug() で異常終了させていましたがこれを戻り値でエラーを返すようにしています。正常時の戻り値を登録済みの bug_reporter 数から 1 固定にしていますが、>0 なのは確実だと思うのでこれは元のままでもよかったような。

ko1:r43313 2013-10-17 05:41:49 +0900

全てのオブジェクトをイテレーションする objspace_each_objects() でヒープが全て free なスロットだった時に callback 関数を呼ばないようにしていたのを常に呼ぶように変更しています。

zzak:r43314 2013-10-17 05:54:23 +0900

拡張ライブラリ io/nonblock に IO#nonblock?, IO#nonblock=, IO#nonblock 等のメソッドの rdoc 用コメントを追加しています。 https://github.com/ruby/ruby/pull/418

zzak:r43315 2013-10-17 07:01:27 +0900

ext/date/date_core.c の rdoc 用コメントの文法の修正(単数形複数形の変更)。 https://github.com/documenting-ruby/ruby/pull/16

zzak:r43316 2013-10-17 07:12:43 +0900

ext/curses/curses.c の rdoc 用コメントの空白や改行位置などの体裁の修正。 https://github.com/ruby/ruby/pull/420

drbrain:r43317 2013-10-17 07:37:39 +0900

RubyGems の最新版(master ブランチの commit hash 2abce58)をマージしています。 sdoc.gem と json.gem がインストールされている時にエラーが発生するのを修正しているとのこと。

ko1:r43318 2013-10-17 08:09:41 +0900

r43310 で追加した拡張ライブラリ objspace の ObjectSpace.trace_object_allocations_debug_start でセットする TracePoint のオブジェクト確保時のイベントのフックで、収集しているオブジェクト確保の情報で生きていることになっている RVALUE のスロットが新規オブジェクトとして渡されてたら rb_bug() で異常終了させていたのを一旦無効にしています。 LazySweep で mark はされなかったけどまだ free されていないオブジェクトの場合でしょうかね。でも新しいオブジェクトとして使われる前にはさすがに free されるはずですね。……と思ったら r43327 で理由がわかってコメントが追記されています。

nobu:r43319 2013-10-17 08:12:02 +0900

r43307 で Windows 版の psapi.h というヘッダのチェックをしていたところで HAVE_SPAPI_H が未定義の時は win32/Makefile.sub であらかじめ 0 にセットしておくことで判定部分を if $(HAVE_PSAPI_H) でチェックできるようにしています。

nobu:r43320 2013-10-17 08:36:15 +0900

r43319 の条件判定が反転していたのを修正。

nobu:r43321 2013-10-17 10:10:35 +0900

r43303 で追加されたテストのファイルの svn property 設定。

nobu:r43322 2013-10-17 10:38:04 +0900

r43303 で追加したテスト ext/-test-/bug_reporter/bug_reporter.c のコンパイル時の警告除去のため明示的なキャストを追加しています。

drbrain:r43323 2013-10-17 11:08:53 +0900

更に RubyGems の最新版(master ブランチの commit hash 941c21a)をマージしています。削除したメソッドのために Bundler が動かなくなっていたのを修正するため一部復旧させているそうです。

nobu:r43324 2013-10-17 11:56:22 +0900

configure で FIRSTMAKEFILE という変数に複数のファイルをコロン区切りで渡した時に対応しているそうです。 cygwinmingw の環境ではこの変数がセットされていたみたいです。

nobu:r43325 2013-10-17 11:57:44 +0900

r43307 での win32/setup.mak の行末の空白を除去。

akr:r43326 2013-10-17 12:32:15 +0900

標準添付ライブラリ tsort の TSort#each_strongly_connected_component_from と同様の処理をイテレータメソッドの指定を受けて行うクラスメソッド TSort.each_strongly_connected_component_from を追加しています。イテレータメソッド部分は Proc オブジェクトでもいいみたいです(call メソッドで呼び出している)。

ko1:r43327 2013-10-17 14:07:21 +0900

r43310 と r43318 でオブジェクト生成時のフックの newobj_i() で回収されていないはずのオブジェクトが再利用されているように見えているケースは TracePoint の FREEOBJ イベントが rb_suppress_tracing() で抑制されているあいだに解放されたオブジェクトについては呼ばれないのでありえるので、その旨コメントを書いています。

nobu:r43328 2013-10-17 14:21:38 +0900

win32/file.c の rb_file_expand_path_internal() で一時的に確保されたバッファのエラー時の解放漏れでメモリリークが発生していたのを修正しています。

nobu:r43329 2013-10-17 14:40:57 +0900

r43324 の続きで configure の $FIRSTMAKEFILE の設定についての修正のようです。configure.in よくわからないです。 non-GNU-make の場合の修正だそうですけど。

ko1:r43330 2013-10-17 16:57:03 +0900

ruby_xsizedrealloc() と ruby_xsizedfree() というコアで使う用の関数を追加して malloc() 系のメモリ確保による GC 実行のしきい値の計算がこの関数を使ってメモリ確保したらより正確にできるようにしています。 [ruby-core:57667] [Feature #8985]

nobu:r43331 2013-10-17 17:11:21 +0900

Windows 版でコンソールエミュレートの判定に psapi というライブラリを使うのをやめて WriteConsoleW() と kernel32.dll の ModuleHandle が一致するかをチェックするという力技を使うように変更しています。

ko1:r43332 2013-10-17 17:35:06 +0900

r43330 で導入した ruby_xsizedfree() と ruby_xsizedrealloc() を array.c と string.c で利用するようにしています。

ko1:r43333 2013-10-17 17:41:23 +0900

ruby_xsizedfree() と ruby_xsizedrealloc() をそれぞれ rb_sized_free() と rb_sized_realloc() に改名しています。

shugo:r43334 2013-10-17 17:44:26 +0900

undef したメソッドを Refinements で上書き定義した時にメソッドエントリ取得処理の考慮漏れで SEGV が発生していたのを修正しています。

ko1:r43335 2013-10-17 18:49:58 +0900

r43332 で string.c に導入した STR_HEAP_SIZE() というマクロで文字列オブジェクトの capacity サイズを返していたのを終端文字サイズ(TERM_LEN()) を含めるようにしています。終端文字ぶんって capacity には含まれてないんでしたっけ。

ko1:r43336 2013-10-17 18:51:41 +0900

rb_sized_xfree() や rb_sized_xrealloc() で渡されたメモリサイズが確保時に渡されたサイズと異なっている時にエラーメッセージを stderr に出力するようにしています。

nobu:r43337 2013-10-17 19:51:35 +0900

テスト用のユーティリティ集 test/ruby/envutil.rb の EnvUtil#assert_no_memory_leak で子プロセス起動のための引数の先頭に環境変数の設定が Hash で渡せるようにしています。また EnvUtil.invoke_ruby へのオプションも渡せるようにキーワードrest引数を追加しています。

nobu:r43338 2013-10-17 19:51:37 +0900

test/ruby/envutil.rb のオプション引数(Hash で渡される引数)を受けとるのにキーワード remain 引数(**opt のように表記する)を使うように書き換えています。

nobu:r43339 2013-10-17 21:49:16 +0900

rb_bug() のフック関数登録 API 用の拡張ライブラリのソース ext/-test-/bug_reporter/bug_reporter.c でコンパイル時の警告除去のために明示的なキャストを追加しています。

akr:r43340 2013-10-17 21:55:27 +0900

標準添付ライブラリ tsort の TSort#tsort, #tsort_each, #strongly_connected_components, #each_strongly_connected_component, #each_strongly_connected_component_from などのメソッドの rdoc 用コメントにサンプルコードを追記しています。

nobu:r43341 2013-10-17 22:44:47 +0900

r43340 の変更の行末の空白除去。

akr:r43342 2013-10-18 00:59:40 +0900

標準添付ライブラリ tsort で r43326 の TSort#each_strongly_connected_component_from のクラスメソッド版の追加に続いて TSort#tsort, #tsort_each, #strongly_connected_components, #each_strongly_connected_component などのメソッドも traversal 用のメソッドを引数に受け取るクラスメソッド版を追加しています。 NEWS ファイルにも追記されています。

svn:r43343 2013-10-18 00:59:45 +0900

version.h の日付更新。