ruby-trunk-changes r44101 - r44124

今日も多彩なコミットがありました。 RGenGC のチェック機能の強化(デバッグ用)や DTrace の probes にメソッドキャッシュクリアのイベントを追加したり、拡張ライブラリ curses の削除の後始末や OpenSSL::Digest::Digest を deprecate にしたりなどの変更がありました。

zzak:r44101 2013-12-10 04:56:45 +0900

拡張ライブラリ openssl の OpenSSL::Digest::Digest を new したら警告が出力されるようにして rdoc コメントにも deprecated であることを追記しています。 https://github.com/ruby/ruby/pull/446

drbrain:r44102 2013-12-10 06:16:19 +0900

ext/.document から RDoc のドキュメント化対象から昨日削除した curses を削除しています。

tmm1:r44103 2013-12-10 07:50:44 +0900

DTrace の probes にメソッドキャッシュのクリアのイベントを追加しています。 ruby::method-cache-clear でグローバルとクラス毎のメソッドキャッシュのクリアの両方で呼ばれるそうです。 [ruby-core:58750] [Bug #9190]

nobu:r44104 2013-12-10 10:51:06 +0900

r44103 で新規追加されたファイルの svn property を設定しています。

tmm1:r44105 2013-12-10 11:26:09 +0900

拡張ライブラリ objspace の ObjectSpace.dump_all で文字列のダンプの時に fstring のフラグも表示するようにしています。また RGenGC 関連の旧世代フラグ、remember set に入っているフラグ(shady)、Write Barrier で保護されているフラグ(normal)なども表示するようにしています。3世代GC も有効になっているとさらに infant と young のフラグも追加されます。
で、このために gc.c に追加したフラグ取得用の関数の宣言を internal.h に追加して ext/objspace/objspace_dump.c から使っているのですが、あれ、internal.h って添付されている拡張ライブラリから使えるものなんでしたっけ? と思ったら他にも pty などが使っていましたね。 でもなんとなく気になって internal.h が導入された初期の変更をさらってみていたら r31691 で rb_classext_t の宣言が internal.h に隠されたために拡張ライブラリの openssl が RCLASS_SUPER() が使えなくなって別の公開関数 rb_class_superclass() を使うようになったという経緯などがあり、拡張ライブラリから使っていいのかどうなのか若干曖昧になっている気がします。 まあ`objspace は特別'と言われたらあっさり納得しますけど(pty は?)。

tmm1:r44106 2013-12-10 12:25:28 +0900

gc.c で static 関数名 objspaec_allrefs_destruct() の objspaec -> objspace と typo 修正しています。

nobu:r44107 2013-12-10 14:02:17 +0900

WeakMap#inspect で生成される文字列の参照とオブジェクトの関係が反転した value => key の表示になっていたのを修正しています。

nobu:r44108 2013-12-10 14:17:19 +0900

ObjectSpace.define_finalizer や WeakMap#[]= でオブジェクトが即値や NODE など通常の GC 対象のオブジェクトでない時に例外を発生させるのを finalizer の設定前にチェックするようにしています。 ChangeLog の関数名は wmap_aset() だけになっていますがもう少し広範に変更されていますね。

tmm1:r44109 2013-12-10 14:46:48 +0900

RGENGC_CHECK_MODE というのをオンにしてコンパイルした時にオブジェクトの参照情報をより完全にチェックして Write Barrier 漏れの検出能力を上げているそうです。RGenGC 自体のデバッグ用機能の強化ですね。 [ruby-core:58959] [Bug #9226]

ko1:r44110 2013-12-10 15:21:52 +0900

これも RGENGC_CHECK_MODE が有効な時だけの変更みたいですがチェック途中で一部 GC.disable して GC を止めていたのをより上位の関数で停止しておくようにしています。

nobu:r44111 2013-12-10 15:26:05 +0900

gc.c の行末の空白除去。

ko1:r44112 2013-12-10 15:44:35 +0900

RGENGC_CHECK_MODE の数値とチェック内容の対応を少し変更して、3 の上に 4を追加して全ての参照をダンプするのは 4 で実施するようにしています。その他のモード毎のチェック内容はコメントを参照してみてください。

ko1:r44113 2013-12-10 15:47:15 +0900

r44109 の対応がどうも不完全だったみたいで allrefs_add() で struct allrefs::references にオブジェクトへの参照情報があったら常に 0 を返すようにしています。あーこれややこしいですね。参照されているオブジェクト毎に allrefs::references に linked list があって、その要素にその参照元の root object が配列で格納されているという関係なんですね。しばらくなんかおかしいと思って見返しましたが確かに間違ってたっぽい。

tmm1:r44114 2013-12-10 15:58:48 +0900

r44113 の修正を受けて gc.c の reflist_add() の追加済みかどうかのチェックは不要だったので削除しています。ここでチェックしていたのは参照されているオブジェクトの参照元が既に登録済みかであって、必要だったのは参照されているオブジェクトが登録済みかというチェックでした。 まあここも RGENGC_CHECK_MODE が有効な時だけ関係する部分だと思います。

nobu:r44115 2013-12-10 16:16:01 +0900

r44101 で deprecate として警告が出るようにした OpenSSL::Digest::Digest を使っているところが openssl とそのテストに存在していたので、OpenSSL::Digest およびその子クラスを利用するようにしています。

nobu:r44116 2013-12-10 16:16:03 +0900

ext/openssl/lib/openssl/digest.rb で OpenSSL::Digest の子クラス (SHA1 とか MD5 とか)のメソッド定義をしているところで initialize の引数の数をチェックしているところを define_method に渡す Proc オブジェクトを lambda にすることで自動的にチェックされるようにしています。

nobu:r44117 2013-12-10 16:16:06 +0900

ruby_xrealloc2() の内容を ruby_sized_xrealloc2() という名称で切り出して、更に objspace_xrealloc() を利用するようにして ruby_sized_xrealloc2() を使うと元の確保サイズを考慮して malloc_increase を正確に管理できるようにしています。

nobu:r44118 2013-12-10 16:16:08 +0900

WeakMap#[]= の実装で st_lookup() と st_insert() を使っていたところを st_update() を使うようにリファクタリングしています。

nobu:r44119 2013-12-10 17:21:33 +0900

WeakMap で内部的に Array オブジェクトをバッファとして利用していたのを GC 負荷の軽減のため直接 ruby_xmalloc2() や ruby_sized_xrealloc2() で確保した C の配列を利用するように変更しています。 Array の便利関数(たぶん主に rb_ary_delete_same()) を使いたいために Array を使っていたのだと思いますが性能のためにやめたっぽいです。

hsbt:r44120 2013-12-10 18:22:32 +0900

マニュアルページ man/ruby.1 に RAA へのリンクが残っていたので https://www.ruby-toolbox.com へのリンクでおきかえています。

a_matsuda:r44121 2013-12-10 20:22:13 +0900

拡張ライブラリ curses の削除に伴ない doc/contributing.rdoc, doc/contributors.rdoc, doc/maintainers.rdoc, doc/standard_library.rdoc などから対応する記述を削除しています。また doc/syntax/modules_and_classes.rdoc で namespace の用例として Curses が挙げられていたのでこれも IRB でおきかえています。 また encoding.c の rb_enc_default_internal() の rdoc コメントで変換対象となる入力ソースとして Curses が挙げられていたのでこれも削除しています。 さすが typo の達人、見逃しませんね。

nobu:r44122 2013-12-10 20:26:05 +0900

doc/maintainers.rdoc と doc/contributors.rdoc の svn property の設定。追加された時に変更されてなかったんですね。

nobu:r44123 2013-12-10 23:02:14 +0900

test-all 用のユーティリティ集 test/ruby/envutil.rb の assert_separately で ensure 節を使って例外を標準出力経由で親プロセスに渡すようにしていたのを END{ } ブロックを使って終了時の処理で出力するように変更しています。 例外の捕捉に失敗した時のためということなのですが、ensure では捕捉できなくて END {} ならできるってどういう場合なんでしょ。 rb_fatal() とかのことですかね。

nobu:r44124 2013-12-10 23:02:16 +0900

lambda の無限再帰でマシンスタックのオーバフローを起こすテストで子プロセスでオーバフローを起こさせているのですが、なぜかこれが子プロセス内で捕捉されなくて親プロセスに伝播することがあるらしくて、とりあえず rescue して無視するようにしているそうです。
先の r44123 で捕捉できないっていうのもこの原因不明の現象のことっぽいですね。