Fixed C++ codegen ignoring multiple padding scalars per field.
Bug: 17373251, 17221979 Change-Id: Ib8b77835f0acd3290f0a5e7d0f683d9fdcbf7230 Tested: on Linux
This commit is contained in:
parent
4507594812
commit
766d0df797
|
@ -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";
|
||||
|
||||
|
|
Loading…
Reference in New Issue