From: Chikanaga Tomoyuki Date: 2007-02-27T12:47:32+09:00 Subject: [ruby-dev:30436] Re: ruby-1.8 で SEGV 日本コントロールシステム(株)の近永と申します。 よろしくおねがいします。 書き忘れていましたが、[ruby-dev:30433]の差分は 1.8.6-preview2 に 対するものです。 それで、試しに eval.c を修正したバージョンで走らせていたのですが、 どうも見当外れだったようで、また *** glibc detected *** : double free or corruption (fasttop): 0x09fc9108 *** というメッセージを出してしまいました。 それに make test-all で コアダンプしてしまったので、どうやらかえって バグを入れてしまったみたいです。 やっぱり的外れだったようです。 確認不足のまま投稿してしまい申し訳ありませんでした。 昨日の修正は差し戻して引き続き調査していきます。 -- 日本コントロールシステム(株) 近永 智之 On Mon, 26 Feb 2007 18:12:48 +0900 Chikanaga Tomoyuki wrote: > 日本コントロールシステム(株)の近永と申します。 > よろしくおねがいします。 > > [ruby-dev:30404] の件の続報です。 > まだ思うように再現させられず四苦八苦していますが、struct SCOPE のあたりが > 怪しいと考えて eval.c を読んでいてすこしひっかかるところを発見しました。 > > proc_invoke でスコープのコピーをしている所で、flags をコピーしていない点が > 気になりました。 > 全体を把握していないので、0クリアのままでいいのか、コピーすべきか > はっきり分らないのですが、SCOPE_DONT_RECYCLE 等が消えてしまうと > よくないような気がします。 > どうでしょうか。 > > 的外れな指摘でしたら申し訳ありません。 > > もしここだったら、特異クラスに対する module_eval 内でブロック渡しの > define_method を使っているところがあるので、そこが問題なのだろうと > 推測してこれから再現スクリプトを探索してみようと思いますが、取り急ぎ > 報告させて頂きました。 > > --- eval.c.orig 2007-02-19 18:28:43.000000000 +0900 > +++ eval.c 2007-02-26 17:28:49.000000000 +0900 > @@ -8547,11 +8547,12 @@ > if (klass) _block.frame.last_class = klass; > _block.frame.argc = RARRAY(tmp)->len; > _block.frame.flags = ruby_frame->flags; > - if (_block.frame.argc && (ruby_frame->flags & FRAME_DMETH)) { > + if (_block.frame.argc && DMETHOD_P()) { > NEWOBJ(scope, struct SCOPE); > OBJSETUP(scope, tmp, T_SCOPE); > scope->local_tbl = _block.scope->local_tbl; > scope->local_vars = _block.scope->local_vars; > + scope->flags = _block.scope->flags; > _block.scope = scope; > } > /* modify current frame */ > > -- > 日本コントロールシステム(株) > 近永 智之 > >