summaryrefslogtreecommitdiff
path: root/ext/syck
diff options
context:
space:
mode:
authorocean <ocean@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2005-12-17 12:57:05 +0000
committerocean <ocean@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2005-12-17 12:57:05 +0000
commit8ed2a927e87a5a70a3a93c43e3ee0994a9eb98ff (patch)
tree11daa976f272d9be052fec1c168d4d7f6bd569ca /ext/syck
parent74a077aabafad5dc6b7526e7df509212e4976264 (diff)
* 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
Diffstat (limited to 'ext/syck')
-rw-r--r--ext/syck/rubyext.c19
1 files changed, 17 insertions, 2 deletions
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();