From: Chikanaga Tomoyuki Date: 2007-02-26T18:12:48+09:00 Subject: [ruby-dev:30433] Re: ruby-1.8 で SEGV 日本コントロールシステム(株)の近永と申します。 よろしくおねがいします。 [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 */ -- 日本コントロールシステム(株) 近永 智之