From: nobu.nokada@... Date: 2004-08-12T15:11:15+09:00 Subject: [syck] non-ascii byte and allocator Hi, Since July 4, syck fails to load yaml which contains non-ascii byte (MSB is set). And I consider that Syck::Parser and Syck::Emitter should define allocators. # diff with -w Index: ext/syck/bytecode.c =================================================================== RCS file: /cvs/ruby/src/ruby/ext/syck/bytecode.c,v retrieving revision 1.6 diff -U2 -p -d -w -r1.6 bytecode.c --- ext/syck/bytecode.c 15 Jul 2004 05:04:48 -0000 1.6 +++ ext/syck/bytecode.c 12 Aug 2004 02:27:18 -0000 @@ -18,5 +18,5 @@ * They do my bidding... */ -#define YYCTYPE char +#define YYCTYPE unsigned char #define YYCURSOR parser->cursor #define YYMARKER parser->marker Index: ext/syck/implicit.c =================================================================== RCS file: /cvs/ruby/src/ruby/ext/syck/implicit.c,v retrieving revision 1.16 diff -U2 -p -d -w -r1.16 implicit.c --- ext/syck/implicit.c 7 Aug 2004 15:34:39 -0000 1.16 +++ ext/syck/implicit.c 12 Aug 2004 02:27:22 -0000 @@ -13,5 +13,5 @@ #include "syck.h" -#define YYCTYPE char +#define YYCTYPE unsigned char #define YYCURSOR cursor #define YYMARKER marker Index: ext/syck/rubyext.c =================================================================== RCS file: /cvs/ruby/src/ruby/ext/syck/rubyext.c,v retrieving revision 1.43 diff -U2 -p -d -w -r1.43 rubyext.c --- ext/syck/rubyext.c 7 Aug 2004 15:34:39 -0000 1.43 +++ ext/syck/rubyext.c 10 Aug 2004 08:36:05 -0000 @@ -780,23 +780,13 @@ syck_mark_parser(parser) */ VALUE -syck_parser_new(argc, argv, class) - int argc; - VALUE *argv; +syck_parser_s_alloc(class) VALUE class; { - VALUE pobj, options, init_argv[1]; + VALUE pobj; SyckParser *parser = syck_new_parser(); - rb_scan_args(argc, argv, "01", &options); pobj = Data_Wrap_Struct( class, syck_mark_parser, syck_free_parser, parser ); - syck_parser_set_root_on_error( parser, Qnil ); - if ( ! rb_obj_is_instance_of( options, rb_cHash ) ) - { - options = rb_hash_new(); - } - init_argv[0] = options; - rb_obj_call_init(pobj, 1, init_argv); return pobj; } @@ -806,7 +796,18 @@ syck_parser_new(argc, argv, class) */ static VALUE -syck_parser_initialize( self, options ) - VALUE self, options; +syck_parser_initialize(argc, argv, self) + int argc; + VALUE *argv; + VALUE self; +{ + VALUE options; + + if (rb_scan_args(argc, argv, "01", &options) == 0) { + options = rb_hash_new(); + } + else { + Check_Type(options, T_HASH); + } rb_ivar_set(self, s_options, options); return self; @@ -1305,12 +1306,9 @@ syck_mark_emitter(emitter) */ VALUE -syck_emitter_new(argc, argv, class) - int argc; - VALUE *argv; +syck_emitter_s_alloc(class) VALUE class; { - VALUE pobj, options, init_argv[1]; + VALUE pobj; SyckEmitter *emitter = syck_new_emitter(); - rb_scan_args(argc, argv, "01", &options); pobj = Data_Wrap_Struct( class, syck_mark_emitter, syck_free_emitter, emitter ); @@ -1319,10 +1317,4 @@ syck_emitter_new(argc, argv, class) emitter->bonus = (void *)rb_str_new2( "" ); - if ( ! rb_obj_is_instance_of( options, rb_cHash ) ) - { - options = rb_hash_new(); - } - init_argv[0] = options; - rb_obj_call_init(pobj, 1, init_argv); return pobj; } @@ -1332,7 +1324,18 @@ syck_emitter_new(argc, argv, class) */ static VALUE -syck_emitter_initialize( self, options ) - VALUE self, options; +syck_emitter_initialize(argc, argv, self) + int argc; + VALUE *argv; + VALUE self; +{ + VALUE options; + + if (rb_scan_args(argc, argv, "01", &options) == 0) { + options = rb_hash_new(); + } + else { + Check_Type(options, T_HASH); + } rb_ivar_set(self, s_options, options); return self; @@ -1513,6 +1516,6 @@ Init_syck() cParser = rb_define_class_under( rb_syck, "Parser", rb_cObject ); rb_define_attr( cParser, "options", 1, 1 ); - rb_define_singleton_method( cParser, "new", syck_parser_new, -1 ); - rb_define_method(cParser, "initialize", syck_parser_initialize, 1); + rb_define_alloc_func( cParser, syck_parser_s_alloc ); + rb_define_method(cParser, "initialize", syck_parser_initialize, -1); rb_define_method(cParser, "load", syck_parser_load, -1); rb_define_method(cParser, "load_documents", syck_parser_load_documents, -1); @@ -1569,6 +1572,6 @@ Init_syck() */ cEmitter = rb_define_class_under( rb_syck, "Emitter", rb_cObject ); - rb_define_singleton_method( cEmitter, "new", syck_emitter_new, -1 ); - rb_define_method( cEmitter, "initialize", syck_emitter_initialize, 1 ); + rb_define_alloc_func( cEmitter, syck_emitter_s_alloc ); + rb_define_method( cEmitter, "initialize", syck_emitter_initialize, -1 ); rb_define_method( cEmitter, "level", syck_emitter_level_m, 0 ); rb_define_method( cEmitter, "write", syck_emitter_write_m, 1 ); Index: ext/syck/token.c =================================================================== RCS file: /cvs/ruby/src/ruby/ext/syck/token.c,v retrieving revision 1.33 diff -U2 -p -d -w -r1.33 token.c --- ext/syck/token.c 7 Aug 2004 15:34:39 -0000 1.33 +++ ext/syck/token.c 12 Aug 2004 02:26:59 -0000 @@ -21,5 +21,5 @@ * They do my bidding... */ -#define YYCTYPE char +#define YYCTYPE unsigned char #define YYCURSOR parser->cursor #define YYMARKER parser->marker -- Nobu Nakada