From: "H.Yamamoto" Date: 2005-12-20T11:58:06+09:00 Subject: [ruby-dev:28068] Re: ruby 1.8 dumps core 山本です。 >> まだ未整理ですが、こんな感じでどうでしょうか。私の環境では >> SEGV もエラーもなくなりました。 > >とりあえずこちらの環境では SEGV します。 >#0 0xb7d8b733 in syck_node_mark (n=0x814a110) at rubyext.c:1407 >1407 for ( i = 0; i < n->data.pairs->idx; i++ ) ううむ、落ちなくなったと思って削ったコードがまずかったでしょうか。 でも、data.paris は syck_map_alloc で初期化されているし、解放済み のノードでなければ NULL にならないはずなんですよね・・・ とりあえずこれでどうでしょうか。これで駄目だと、私のところでは 動くようになったこともあって、デバッグは難しそうです。 # 明示的に syck_free_node したノードが ruby オブジェクトの中に残るので、 # syck_free_node も GC に任せるようにした。 Index: rubyext.c =================================================================== RCS file: /src/ruby/ext/syck/rubyext.c,v retrieving revision 1.61 diff -u -w -b -p -r1.61 rubyext.c --- rubyext.c 19 Dec 2005 14:13:27 -0000 1.61 +++ rubyext.c 20 Dec 2005 02:46:20 -0000 @@ -1783,7 +1783,7 @@ syck_node_transform( self ) SyckNode *n; SyckNode *orig_n; Data_Get_Struct(self, SyckNode, orig_n); - t = Data_Wrap_Struct( cNode, syck_node_mark, NULL, 0 ); + t = Data_Wrap_Struct( cNode, syck_node_mark, syck_free_node, 0 ); switch (orig_n->kind) { @@ -1824,9 +1824,7 @@ syck_node_transform( self ) n->anchor = syck_strndup( orig_n->anchor, strlen( orig_n->anchor ) ); } n->id = t; - t = rb_funcall( oDefaultResolver, s_node_import, 1, t ); - syck_free_node( n ); - return t; + return rb_funcall( oDefaultResolver, s_node_import, 1, t ); }