From 0b47e69d4d6cb6905388f28760a6a90e96380a82 Mon Sep 17 00:00:00 2001 From: Wouter van Oortmerssen Date: Tue, 12 Aug 2014 16:20:13 -0700 Subject: [PATCH] Parser now allows empty tables in JSON Bug: 16870719 Change-Id: Ia5fdce49a67b1aa621ab1e37a815e2a3293257b6 Tested: on Linux --- src/idl_gen_text.cpp | 3 +-- src/idl_parser.cpp | 2 +- tests/monster_test.fbs | 1 + tests/monster_test_generated.h | 12 +++++++++--- tests/monsterdata_test.golden | 4 +++- 5 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/idl_gen_text.cpp b/src/idl_gen_text.cpp index fc833c132..a9e2f6c7a 100644 --- a/src/idl_gen_text.cpp +++ b/src/idl_gen_text.cpp @@ -191,7 +191,6 @@ static void GenStruct(const StructDef &struct_def, const Table *table, std::string *_text) { std::string &text = *_text; text += "{"; - text += NewLine(opts.indent_step); int fieldout = 0; StructDef *union_sd = nullptr; for (auto it = struct_def.fields.vec.begin(); @@ -202,8 +201,8 @@ static void GenStruct(const StructDef &struct_def, const Table *table, // The field is present. if (fieldout++) { text += ","; - text += NewLine(opts.indent_step); } + text += NewLine(opts.indent_step); text.append(indent + opts.indent_step, ' '); OutputIdentifier(fd.name, opts, _text); text += ": "; diff --git a/src/idl_parser.cpp b/src/idl_parser.cpp index 74d988774..e8896113d 100644 --- a/src/idl_parser.cpp +++ b/src/idl_parser.cpp @@ -420,7 +420,7 @@ void Parser::SerializeStruct(const StructDef &struct_def, const Value &val) { uoffset_t Parser::ParseTable(const StructDef &struct_def) { Expect('{'); size_t fieldn = 0; - for (;;) { + if (!IsNext('}')) for (;;) { std::string name = attribute_; if (!IsNext(kTokenStringConstant)) Expect(kTokenIdentifier); auto field = struct_def.fields.Lookup(name); diff --git a/tests/monster_test.fbs b/tests/monster_test.fbs index bdf4aaeae..800618f4e 100755 --- a/tests/monster_test.fbs +++ b/tests/monster_test.fbs @@ -33,6 +33,7 @@ table Monster { test:Any (id: 8); test4:[Test] (id: 9); testnestedflatbuffer:[ubyte] (id:13, nested_flatbuffer: "Monster"); + testempty:Monster (id:14); } root_type Monster; diff --git a/tests/monster_test_generated.h b/tests/monster_test_generated.h index 42dc4189a..a2a029280 100755 --- a/tests/monster_test_generated.h +++ b/tests/monster_test_generated.h @@ -95,6 +95,7 @@ struct Monster : private flatbuffers::Table { const Monster *enemy() const { return GetPointer(28); } const flatbuffers::Vector *testnestedflatbuffer() const { return GetPointer *>(30); } const Monster *testnestedflatbuffer_nested_root() { return flatbuffers::GetRoot(testnestedflatbuffer()->Data()); } + const Monster *testempty() const { return GetPointer(32); } bool Verify(const flatbuffers::Verifier &verifier) const { return VerifyTable(verifier) && VerifyField(verifier, 4 /* pos */) && @@ -119,7 +120,9 @@ struct Monster : private flatbuffers::Table { VerifyField(verifier, 28 /* enemy */) && verifier.VerifyTable(enemy()) && VerifyField(verifier, 30 /* testnestedflatbuffer */) && - verifier.Verify(testnestedflatbuffer()); + verifier.Verify(testnestedflatbuffer()) && + VerifyField(verifier, 32 /* testempty */) && + verifier.VerifyTable(testempty()); } }; @@ -139,9 +142,10 @@ struct MonsterBuilder { void add_testarrayoftables(flatbuffers::Offset>> testarrayoftables) { fbb_.AddOffset(26, testarrayoftables); } void add_enemy(flatbuffers::Offset enemy) { fbb_.AddOffset(28, enemy); } void add_testnestedflatbuffer(flatbuffers::Offset> testnestedflatbuffer) { fbb_.AddOffset(30, testnestedflatbuffer); } + void add_testempty(flatbuffers::Offset testempty) { fbb_.AddOffset(32, testempty); } MonsterBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); } MonsterBuilder &operator=(const MonsterBuilder &); - flatbuffers::Offset Finish() { return flatbuffers::Offset(fbb_.EndTable(start_, 14)); } + flatbuffers::Offset Finish() { return flatbuffers::Offset(fbb_.EndTable(start_, 15)); } }; inline flatbuffers::Offset CreateMonster(flatbuffers::FlatBufferBuilder &_fbb, @@ -157,8 +161,10 @@ inline flatbuffers::Offset CreateMonster(flatbuffers::FlatBufferBuilder flatbuffers::Offset>> testarrayofstring = 0, flatbuffers::Offset>> testarrayoftables = 0, flatbuffers::Offset enemy = 0, - flatbuffers::Offset> testnestedflatbuffer = 0) { + flatbuffers::Offset> testnestedflatbuffer = 0, + flatbuffers::Offset testempty = 0) { MonsterBuilder builder_(_fbb); + builder_.add_testempty(testempty); builder_.add_testnestedflatbuffer(testnestedflatbuffer); builder_.add_enemy(enemy); builder_.add_testarrayoftables(testarrayoftables); diff --git a/tests/monsterdata_test.golden b/tests/monsterdata_test.golden index a738caec4..ca63f4285 100644 --- a/tests/monsterdata_test.golden +++ b/tests/monsterdata_test.golden @@ -36,5 +36,7 @@ testarrayofstring: [ "test1", "test2" - ] + ], + testempty: { + } }