ruby-trunk-changes r37077 - r37088

今日は CGIhtml5 用タグ生成機能の追加、マシンスタックのオーバフロー検出の改善、GC の mark 処理の修正後に SEGV する問題についての修正、YARV の統計情報を取得できるようにするデバッグ用機能の追加など盛り沢山でした。

xibbar:r37077 2012-10-04 11:20:55 +0900

CGI.new のオプション :tag_maker に "html5" という値を受け付けて、html5 のタグ生成ができるようにしています。 CGI::HTML5 という Module を追加しています。 [ruby-core:45812] [Feature #6637]

svn:r37078 2012-10-04 11:21:00 +0900

version.h の日付更新。

nobu:r37079 2012-10-04 11:39:34 +0900

マシンスタックのスタックオーバフローを検出するために作る余白のサイズを決定する係数(スタックサイズを 5 で割る)がコードに直書きされていたのを、RUBY_STACK_SPACE_RATIO というマクロ定数にしています。

nobu:r37080 2012-10-04 11:43:30 +0900

マシンスタックのサイズを前述の余白を加味して計算していたところをメモリ pagesize でアライメントするようにして、スタックオーバフローの検出をより正確にできるようにしているそうです。 オーバフローして SEGV が発生した時に SystemStackOverflow かどうか判断しているのは thread_pthread.c の ruby_stack_overflowed_p() のところで、ここの計算は特に pagesize に依存しないような気もしますが、どうしてでしょう。 [ruby-dev:46174] [Bug #7084]

nobu:r37081 2012-10-04 16:23:41 +0900

gc.c のメモリ管理に関する定数を定数マクロではなく enum として定義するようにしています。デバッグ用とあるので gdb などのデバッガで名前でアクセスしたいということでしょう。

nobu:r37082 2012-10-04 16:31:31 +0900

gc.c の gc_marks() から昨日の r37075 で導入したヒープ上に置いたスタックを利用した(再帰しない)マーク処理のループを gc_mark_stacked_objects() という関数に切り出して、 rb_objspace_call_finalizer() でファイナライザ実行前に finalizer_table からの参照を mark するようにしています。コメントから察するに、ファイナライザ(が設定されているオブジェクト?)から参照されているオブジェクトがファイナライザを実行する前に sweep されてしまうと((ファイナライザが実行されるということはそのオブジェクトは参照がなくなって sweep されようとしているわけなので、そのオブジェクトが参照しているオブジェクトも sweep 対象になっている可能性があります) SEGV が発生する恐れがあるので、ここで mark しておこうということではないかと思われます。

nari:r37083 2012-10-04 17:34:20 +0900

直前の r37082 で finalizer_table からの参照を mark する処理は rb_objspace_call_finalizer() の冒頭に挿入されましたが、処理の中で mark_tbl() を呼んでいるところがあるのでその下に gc_mark_stacked_objects() で参照先全てを mark するように呼び出し位置を移動しています。
うーん、しかし rest_sweep() という呼び出しがあるのですが、この後に移動してしまって大丈夫なんでしょうか。

ko1:r37084 2012-10-04 19:00:56 +0900

TracePoint(r36773 で導入された set_trace_func を代替する新しい機能)のテストメソッドの重複していたものを削除しています。

ko1:r37085 2012-10-04 21:31:05 +0900

VM_COLLECT_USAGE_DETAILS というマクロを非0に定義すると YARV の命令/オペランド/レジスタの利用状況を集計する機能を追加しているようです。
どうも情報の収集自体はこれまでもしていたようで、それを RubyVM::USAGE_ANALYSIS_{INSN, INSN_BIGRAM, REGS} といった定数でアクセスできるようにしたということのようです。

ko1:r37086 2012-10-04 21:48:35 +0900

直前の r37085 で統計情報を格納する Hash に要素を追加する時に rb_hash_aset() を呼んでいましたが、 $SAFE のチェックが入るということで st_insert() を直接呼ぶようにしています。

ko1:r37087 2012-10-04 22:52:20 +0900

YARV の getlocal/setlocal というローカル変数のセット/取得を行う命令を削除して、getdynamic/setdymanic を getlocal/setlocal と改名して置き換えています。元の getlocal/setlocal は getdynamic/setdynamic の特別なケースとして扱える(ブロックのネストの最も外側の level が指定されたらローカル変数を取得する)ので命令を統合しているようです。

nari:r37088 2012-10-04 23:48:02 +0900

gc.c の初期化処理 init_heap() 内でマーク処理用のスタックのメモリ確保を sigaltstack(2) 用のメモリ確保の前に移動しています。 こうすると 32bit 環境で signal handler でのスタックオーバフローが回避されるんだそうですが、理由はよくわからないということで、なんかたまたまのような気がしますね…… [ruby-dev:46200] [Feature #7095]