From 8ed2a927e87a5a70a3a93c43e3ee0994a9eb98ff Mon Sep 17 00:00:00 2001 From: ocean Date: Sat, 17 Dec 2005 12:57:05 +0000 Subject: * ext/syck/rubyext.c (syck_emitter_reset): should initialize emitter->bonus->oid. otherwise rb_gc_mark crashes. * ext/syck/rubyext.c (syck_mark_parser): should mark anchor nodes because they hold ruby objects. (ie: rb_syck_bad_anchor_handler) git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9707 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ext/syck/rubyext.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) (limited to 'ext') diff --git a/ext/syck/rubyext.c b/ext/syck/rubyext.c index f9bb91bf47..c2e71b8b91 100644 --- a/ext/syck/rubyext.c +++ b/ext/syck/rubyext.c @@ -617,8 +617,7 @@ rb_syck_load_handler(p, n) /* * Create node, */ - obj = rb_funcall( resolver, s_node_import, - 1, Data_Wrap_Struct( cNode, syck_node_mark, NULL, n ) ); + obj = rb_funcall( resolver, s_node_import, 1, Data_Wrap_Struct( cNode, NULL, NULL, n ) ); /* * ID already set, let's alter the symbol table to accept the new object @@ -706,6 +705,13 @@ syck_set_model( p, input, model ) syck_parser_bad_anchor_handler( parser, rb_syck_bad_anchor_handler ); } +static int +syck_st_mark_nodes( char *key, SyckNode *n, char *arg ) +{ + if ( n != (void *)1 ) syck_node_mark( n ); + return ST_CONTINUE; +} + /* * mark parser nodes */ @@ -723,6 +729,14 @@ syck_mark_parser(parser) rb_gc_mark( bonus->proc ); rb_gc_mark( bonus->resolver ); } + if ( parser->anchors != NULL ) + { + st_foreach( parser->anchors, syck_st_mark_nodes, 0 ); + } + if ( parser->bad_anchors != NULL ) + { + st_foreach( parser->bad_anchors, syck_st_mark_nodes, 0 ); + } } /* @@ -2013,6 +2027,7 @@ syck_emitter_reset( argc, argv, self ) if ( bonus != NULL ) S_FREE( bonus ); bonus = S_ALLOC_N( struct emitter_xtra, 1 ); + bonus->oid = Qnil; bonus->port = rb_str_new2( "" ); bonus->data = hash = rb_hash_new(); -- cgit v1.2.3