From: nobu.nakada@... Date: 2003-02-25T22:15:47+09:00 Subject: [ruby-dev:19661] Re: SEGV at search_method in eval.c (PR#400) なかだです。 At Tue, 25 Feb 2003 16:34:54 +0900, NAKAMURA, Hiroshi wrote: > (gdb) p *tbl > $1 = {type = 0x400a9e00, num_bins = 11, num_entries = 4, bins = 0x90df4d8} > (gdb) x/11 tbl->bins > 0x90df4d8: 0x00000000 0x08d96b58 0x091091c0 0x00000000 > 0x90df4e8: 0x08cdaac8 0x00000000 0x00000000 0x00000000 > 0x90df4f8: 0x00000000 0x0813bce8 0x00000000 > (gdb) p *tbl->bins[1] > $2 = {hash = 10858, key = 0x2a6a
, > record = 0x40447b44 "?\200", next = 0x0} > (gdb) p *tbl->bins[2] > $3 = {hash = 10122, key = 0x278a
, > record = 0x4
, next = 0x0} > (gdb) p *tbl->bins[4] > $4 = {hash = 10850, key = 0x2a62
, > record = 0x4
, next = 0x0} > (gdb) p *tbl->bins[9] > $5 = {hash = 10866, key = 0x2a72
, > record = 0x40447b08 "\a", next = 0x0} これは正しそうに見えます。やはりgeneric_ivar_tbl自体は正しいも のの、そこから参照されるインスタンス変数がマークされていないと 見るべきでしょう。実際gc.c:rb_gc_mark()ではFL_EXIVARがセットさ れているときだけマークしていますが、このStringではフラグがセッ トされていないことが問題のようです。 if (FL_TEST(obj, FL_EXIVAR)) { rb_mark_generic_ivar((VALUE)obj); } > (gdb) p *(struct RString *)obj > $4 = {basic = {flags = 7, klass = 1076034740}, len = 10, > ptr = 0x81b9b30 "yield_call", orig = 0} ということでgeneric_ivar_tblとFL_EXIVARで探して行くと、ここがあ やしそうです。 Index: variable.c =================================================================== RCS file: //sharui/cvs/ruby/src/ruby/variable.c,v retrieving revision 1.29.2.21 diff -u -2 -p -r1.29.2.21 variable.c --- variable.c 16 Dec 2002 07:36:14 -0000 1.29.2.21 +++ variable.c 25 Feb 2003 13:15:17 -0000 @@ -913,4 +913,5 @@ rb_clone_generic_ivar(clone, obj) if (!generic_iv_tbl) return; if (st_lookup(generic_iv_tbl, obj, &tbl)) { + FL_SET(clone, FL_EXIVAR); st_add_direct(generic_iv_tbl, clone, st_copy(tbl)); } -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦