summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorocean <ocean@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2006-01-16 01:29:58 +0000
committerocean <ocean@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2006-01-16 01:29:58 +0000
commitbfcae602603b2102e4a48e75e0ffc96f2006dfbb (patch)
tree537c74d113b17bbd1675db311a30f517ff72fd37
parent9a720a6c07f8db1084c8fde8da2829d09f6581c7 (diff)
* 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/branches/ruby_1_8@9835 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog6
-rw-r--r--ext/syck/emitter.c36
-rw-r--r--test/yaml/test_yaml.rb19
3 files changed, 40 insertions, 21 deletions
diff --git a/ChangeLog b/ChangeLog
index 5c637fe..e790bb8 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Mon Jan 16 10:26:23 2006 Hirokazu Yamamoto <ocean@m2.ccsnet.ne.jp>
+
+ * 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 05:37:06 2006 Tanaka Akira <akr@m17n.org>
* io.c (READ_DATA_PENDING, READ_DATA_PENDING_COUNT): defined
diff --git a/ext/syck/emitter.c b/ext/syck/emitter.c
index f5de4b8..9fe699f 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 78a0877..676310e 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__