From: Nobuyoshi Nakada Date: 2008-08-06T17:17:30+09:00 Subject: [ruby-dev:35780] Re: [Ruby 1.9 - Bug #369] (Open) Ruby 1.9.0-3で R なかだです。 At Wed, 6 Aug 2008 16:06:04 +0900, wanabe wrote in [ruby-dev:35778]: > 2008/07/29 18:28 Akira Matsuda : > > Ruby1.9にてRuby on Railsの中のactionpackのテストを走らせると、終了後にcoreを吐きながらアボートします。 > > Rubyのバージョンは1.9.0-3で、Railsはgitリポジトリ上の報告時現在のedgeバージョンにて再現可能です。 > > また、OSはOSX LeopardおよびDebian etchにて再現済みです。 > > 以下で発生するSEGVと同様なのではないかと思います。 > ファイナライザが複数定義されているとき、すでにdfreeが呼ばれた > オブジェクトを参照すると起きる問題のようです。 > > $ ./ruby -ve ' > a1,a2,b1,b2=Array.new(4){""} > ObjectSpace.define_finalizer(b2,proc{p :b2}) > ObjectSpace.define_finalizer(b1,proc{p :b1, b1}) > > ObjectSpace.define_finalizer(a2,proc{p :a2, a1}) > ObjectSpace.define_finalizer(a1,proc{p :a1}) > ' > ruby 1.9.0 (2008-08-06 revision 18383) [i386-mingw32] > :a1 > :a2 > [2014068] > :b1 > -e:4: [BUG] Segmentation fault 本当にRailsにそういったコードがあるとすると、いったい何をしたい んでしょうか。これらのファイナライザは、対象オブジェクト自身を参 照しているので、どれも呼ばれないというのが正しい動作だと思います。 Index: gc.c =================================================================== --- gc.c (revision 18386) +++ gc.c (working copy) @@ -2092,5 +2092,5 @@ chain_finalized_object(st_data_t key, st { RVALUE *p = (RVALUE *)key, **final_list = (RVALUE **)arg; - if (p->as.basic.flags & FL_FINALIZE) { + if ((p->as.basic.flags & (FL_FINALIZE|FL_MARK)) == FL_FINALIZE) { if (BUILTIN_TYPE(p) != T_DEFERRED) { p->as.free.flags = FL_MARK | T_DEFERRED; /* remain marked */ @@ -2116,4 +2116,5 @@ rb_gc_call_finalizer_at_exit(void) deferred_final_list = 0; finalize_list(objspace, p); + mark_tbl(objspace, finalizer_table, 0); st_foreach(finalizer_table, chain_finalized_object, (st_data_t)&deferred_final_list); -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦