summaryrefslogtreecommitdiffstats
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
commitddc5114c139dfdb2fa091c4d33bd6a8e1caccf6f (patch)
tree11daa976f272d9be052fec1c168d4d7f6bd569ca /ext/syck
parent1053568652409a12a5befc70c929ce9ab4e8cf12 (diff)
downloadruby-ddc5114c139dfdb2fa091c4d33bd6a8e1caccf6f.tar.gz
ruby-ddc5114c139dfdb2fa091c4d33bd6a8e1caccf6f.tar.xz
ruby-ddc5114c139dfdb2fa091c4d33bd6a8e1caccf6f.zip
* 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: http://svn.ruby-lang.org/repos/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 f9bb91bf4..c2e71b8b9 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();