summaryrefslogtreecommitdiff
path: root/ext/syck/rubyext.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/syck/rubyext.c')
-rw-r--r--ext/syck/rubyext.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/ext/syck/rubyext.c b/ext/syck/rubyext.c
index 854762c591..a87edad11f 100644
--- a/ext/syck/rubyext.c
+++ b/ext/syck/rubyext.c
@@ -1025,7 +1025,12 @@ rb_syck_output_handler( emitter, str, len )
char *str;
long len;
{
- rb_str_cat( (VALUE)emitter->bonus, str, len );
+ VALUE dest = (VALUE)emitter->bonus;
+ if ( rb_respond_to( dest, rb_intern("to_str") ) ) {
+ rb_str_cat( dest, str, len );
+ } else {
+ rb_io_write( dest, rb_str_new( str, len ) );
+ }
}
/*
@@ -1035,7 +1040,7 @@ static void
syck_mark_emitter(emitter)
SyckEmitter *emitter;
{
- rb_gc_mark( emitter->ignore_id );
+ rb_gc_mark(emitter->ignore_id);
if ( emitter->bonus != NULL )
{
rb_gc_mark( (VALUE)emitter->bonus );
@@ -1104,7 +1109,7 @@ syck_emitter_flush_m( self )
SyckEmitter *emitter;
Data_Get_Struct(self, SyckEmitter, emitter);
- syck_emitter_flush( emitter );
+ syck_emitter_flush( emitter, 0 );
return self;
}
@@ -1171,7 +1176,7 @@ syck_emitter_end_object( self, oid )
if ( emitter->level < 0 )
{
- syck_emitter_flush( emitter );
+ syck_emitter_flush( emitter, 0 );
}
return (VALUE)emitter->bonus;
}