Fixed C++ codegen ignoring multiple padding scalars per field.
authorWouter van Oortmerssen <wvo@google.com>
Wed, 3 Sep 2014 18:30:35 +0000 (11:30 -0700)
committerWouter van Oortmerssen <wvo@google.com>
Wed, 3 Sep 2014 18:34:47 +0000 (11:34 -0700)
Bug: 1737325117221979
Change-Id: Ib8b77835f0acd3290f0a5e7d0f683d9fdcbf7230
Tested: on Linux

src/idl_gen_cpp.cpp

index b7fe8e1..1aeff87 100644 (file)
@@ -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<void (int bits)> &f) {
+  if (field.padding) {
+    for (int i = 0; i < 4; i++)
+      if (static_cast<int>(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<int>(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";