From: Tomoyuki Chikanaga Date: 2011-01-18T22:10:26+09:00 Subject: [ruby-dev:43065] [Ruby 1.9-Bug#4238] GC.stress 下で OptionParser で設定のない引数をパースさせると core チケット #4238 が更新されました。 (by Tomoyuki Chikanaga) 以下のように proc_call() に GC 除けを追加することで、わたしの環境では OptionParser を使った例も、 縮小版も SEGV が起きなくなりました(ruby 1.9.3dev (2011-01-18 trunk 30590) [i686-linux], gcc-4.3.3 optflags=-O3)。 いかがでしょうか。 diff --git a/proc.c b/proc.c index 9ecf626..18c7393 100644 --- a/proc.c +++ b/proc.c @@ -543,16 +543,16 @@ proc_call(int argc, VALUE *argv, VALUE procval) rb_proc_t *proc; rb_block_t *blockptr = 0; rb_iseq_t *iseq; + VALUE passed_procval; GetProcPtr(procval, proc); iseq = proc->block.iseq; if (BUILTIN_TYPE(iseq) == T_NODE || iseq->arg_block != -1) { if (rb_block_given_p()) { - rb_proc_t *proc; - VALUE procval; - procval = rb_block_proc(); - GetProcPtr(procval, proc); - blockptr = &proc->block; + rb_proc_t *passed_proc; + RB_GC_GUARD(passed_procval) = rb_block_proc(); + GetProcPtr(passed_procval, passed_proc); + blockptr = &passed_proc->block; } } ---------------------------------------- http://redmine.ruby-lang.org/issues/show/4238 ---------------------------------------- http://redmine.ruby-lang.org