From: Wouter van Oortmerssen Date: Wed, 3 Sep 2014 18:30:35 +0000 (-0700) Subject: Fixed C++ codegen ignoring multiple padding scalars per field. X-Git-Tag: v1.0.2~4 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=766d0df797d00de5ffd9514c2d7c686d60fff221;p=platform%2Fupstream%2Fflatbuffers.git Fixed C++ codegen ignoring multiple padding scalars per field. Bug: 17373251, 17221979 Change-Id: Ib8b77835f0acd3290f0a5e7d0f683d9fdcbf7230 Tested: on Linux --- diff --git a/src/idl_gen_cpp.cpp b/src/idl_gen_cpp.cpp index b7fe8e1..1aeff87 100644 --- a/src/idl_gen_cpp.cpp +++ b/src/idl_gen_cpp.cpp @@ -347,6 +347,15 @@ static void GenTable(const Parser &parser, StructDef &struct_def, code += " return builder_.Finish();\n}\n\n"; } +static void GenPadding(const FieldDef &field, const std::function &f) { + if (field.padding) { + for (int i = 0; i < 4; i++) + if (static_cast(field.padding) & (1 << i)) + f((1 << i) * 8); + assert(!(field.padding & ~0xF)); + } +} + // Generate an accessor struct with constructor for a flatbuffers struct. static void GenStruct(const Parser &parser, StructDef &struct_def, std::string *code_ptr) { @@ -368,13 +377,10 @@ static void GenStruct(const Parser &parser, StructDef &struct_def, auto &field = **it; code += " " + GenTypeGet(parser, field.value.type, " ", "", " "); code += field.name + "_;\n"; - if (field.padding) { - for (int i = 0; i < 4; i++) - if (static_cast(field.padding) & (1 << i)) - code += " int" + NumToString((1 << i) * 8) + - "_t __padding" + NumToString(padding_id++) + ";\n"; - assert(!(field.padding & ~0xF)); - } + GenPadding(field, [&code, &padding_id](int bits) { + code += " int" + NumToString(bits) + + "_t __padding" + NumToString(padding_id++) + ";\n"; + }); } // Generate a constructor that takes all fields as arguments. @@ -399,8 +405,10 @@ static void GenStruct(const Parser &parser, StructDef &struct_def, code += "flatbuffers::EndianScalar(" + field.name + "))"; else code += field.name + ")"; - if (field.padding) + GenPadding(field, [&code, &padding_id](int bits) { + (void)bits; code += ", __padding" + NumToString(padding_id++) + "(0)"; + }); } code += " {"; padding_id = 0; @@ -408,8 +416,10 @@ static void GenStruct(const Parser &parser, StructDef &struct_def, it != struct_def.fields.vec.end(); ++it) { auto &field = **it; - if (field.padding) + GenPadding(field, [&code, &padding_id](int bits) { + (void)bits; code += " (void)__padding" + NumToString(padding_id++) + ";"; + }); } code += " }\n\n";