From d54f7b05e8b2e516451fb50c816cec311db570bf Mon Sep 17 00:00:00 2001 From: ocean Date: Mon, 16 Jan 2006 01:29:58 +0000 Subject: * ext/syck/emitter.c (syck_emit_seq, syck_emit_map, syck_emit_item): should output complex key mark even if map's key is empty seq/map. [ruby-core:7129] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9835 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 6 ++++++ ext/syck/emitter.c | 36 +++++++++++++++--------------------- test/yaml/test_yaml.rb | 19 +++++++++++++++++++ 3 files changed, 40 insertions(+), 21 deletions(-) diff --git a/ChangeLog b/ChangeLog index 92ea36d57a..3b3fc06a16 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Mon Jan 16 10:13:38 2006 Hirokazu Yamamoto + + * ext/syck/emitter.c (syck_emit_seq, syck_emit_map, syck_emit_item): + should output complex key mark even if map's key is empty seq/map. + [ruby-core:7129] + Sat Jan 14 03:38:54 2006 Hirokazu Yamamoto * file.c (rb_file_s_chmod): avoid warning where sizeof(int) != diff --git a/ext/syck/emitter.c b/ext/syck/emitter.c index f5de4b841a..9fe699f9ed 100644 --- a/ext/syck/emitter.c +++ b/ext/syck/emitter.c @@ -1003,6 +1003,11 @@ void syck_emit_seq( SyckEmitter *e, char *tag, enum seq_style style ) syck_emitter_write( e, "[", 1 ); lvl->status = syck_lvl_iseq; } else { + /* complex key */ + if ( parent->status == syck_lvl_map && parent->ncount % 2 == 1 ) { + syck_emitter_write( e, "? ", 2 ); + parent->status = syck_lvl_mapx; + } lvl->status = syck_lvl_seq; } } @@ -1019,6 +1024,11 @@ void syck_emit_map( SyckEmitter *e, char *tag, enum map_style style ) syck_emitter_write( e, "{", 1 ); lvl->status = syck_lvl_imap; } else { + /* complex key */ + if ( parent->status == syck_lvl_map && parent->ncount % 2 == 1 ) { + syck_emitter_write( e, "? ", 2 ); + parent->status = syck_lvl_mapx; + } lvl->status = syck_lvl_map; } } @@ -1036,18 +1046,11 @@ void syck_emit_item( SyckEmitter *e, st_data_t n ) { SyckLevel *parent = syck_emitter_parent_level( e ); - /* seq-in-map shortcut */ - if ( parent->status == syck_lvl_map && lvl->ncount == 0 ) { - /* complex key */ - if ( parent->ncount % 2 == 1 ) { - syck_emitter_write( e, "?", 1 ); - parent->status = syck_lvl_mapx; - /* shortcut -- the lvl->anctag check should be unneccesary but - * there is a nasty shift/reduce in the parser on this point and - * i'm not ready to tickle it. */ - } else if ( lvl->anctag == 0 ) { - lvl->spaces = parent->spaces; - } + /* seq-in-map shortcut -- the lvl->anctag check should be unneccesary but + * there is a nasty shift/reduce in the parser on this point and + * i'm not ready to tickle it. */ + if ( lvl->anctag == 0 && parent->status == syck_lvl_map && lvl->ncount == 0 ) { + lvl->spaces = parent->spaces; } /* seq-in-seq shortcut */ @@ -1080,15 +1083,6 @@ void syck_emit_item( SyckEmitter *e, st_data_t n ) { SyckLevel *parent = syck_emitter_parent_level( e ); - /* map-in-map */ - if ( parent->status == syck_lvl_map && lvl->ncount == 0 ) { - /* complex key */ - if ( parent->ncount % 2 == 1 ) { - syck_emitter_write( e, "?", 1 ); - parent->status = syck_lvl_mapx; - } - } - /* map-in-seq shortcut */ if ( lvl->anctag == 0 && parent->status == syck_lvl_seq && lvl->ncount == 0 ) { int spcs = ( lvl->spaces - parent->spaces ) - 2; diff --git a/test/yaml/test_yaml.rb b/test/yaml/test_yaml.rb index 78a0877300..676310e6fc 100644 --- a/test/yaml/test_yaml.rb +++ b/test/yaml/test_yaml.rb @@ -1253,6 +1253,25 @@ EOY assert_cycle(NumericTest.new(3)) # Subclass of Numeric end + # + # Test empty map/seq in map cycle + # + def test_empty_map_key + # + # empty seq as key + # + o = YAML.load({[]=>""}.to_yaml) + assert_equal(Hash, o.class) + assert_equal([[]], o.keys) + + # + # empty map as key + # + o = YAML.load({{}=>""}.to_yaml) + assert_equal(Hash, o.class) + assert_equal([{}], o.keys) + end + end if $0 == __FILE__ -- cgit v1.2.3