mirror of
https://github.com/google/flatbuffers.git
synced 2026-06-26 15:22:40 +00:00
Fixed C++ codegen ignoring multiple padding scalars per field.
Bug: 17373251, 17221979 Change-Id: Ib8b77835f0acd3290f0a5e7d0f683d9fdcbf7230 Tested: on Linux
This commit is contained in:
@@ -347,6 +347,15 @@ static void GenTable(const Parser &parser, StructDef &struct_def,
|
|||||||
code += " return builder_.Finish();\n}\n\n";
|
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.
|
// Generate an accessor struct with constructor for a flatbuffers struct.
|
||||||
static void GenStruct(const Parser &parser, StructDef &struct_def,
|
static void GenStruct(const Parser &parser, StructDef &struct_def,
|
||||||
std::string *code_ptr) {
|
std::string *code_ptr) {
|
||||||
@@ -368,13 +377,10 @@ static void GenStruct(const Parser &parser, StructDef &struct_def,
|
|||||||
auto &field = **it;
|
auto &field = **it;
|
||||||
code += " " + GenTypeGet(parser, field.value.type, " ", "", " ");
|
code += " " + GenTypeGet(parser, field.value.type, " ", "", " ");
|
||||||
code += field.name + "_;\n";
|
code += field.name + "_;\n";
|
||||||
if (field.padding) {
|
GenPadding(field, [&code, &padding_id](int bits) {
|
||||||
for (int i = 0; i < 4; i++)
|
code += " int" + NumToString(bits) +
|
||||||
if (static_cast<int>(field.padding) & (1 << i))
|
"_t __padding" + NumToString(padding_id++) + ";\n";
|
||||||
code += " int" + NumToString((1 << i) * 8) +
|
});
|
||||||
"_t __padding" + NumToString(padding_id++) + ";\n";
|
|
||||||
assert(!(field.padding & ~0xF));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Generate a constructor that takes all fields as arguments.
|
// 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 + "))";
|
code += "flatbuffers::EndianScalar(" + field.name + "))";
|
||||||
else
|
else
|
||||||
code += field.name + ")";
|
code += field.name + ")";
|
||||||
if (field.padding)
|
GenPadding(field, [&code, &padding_id](int bits) {
|
||||||
|
(void)bits;
|
||||||
code += ", __padding" + NumToString(padding_id++) + "(0)";
|
code += ", __padding" + NumToString(padding_id++) + "(0)";
|
||||||
|
});
|
||||||
}
|
}
|
||||||
code += " {";
|
code += " {";
|
||||||
padding_id = 0;
|
padding_id = 0;
|
||||||
@@ -408,8 +416,10 @@ static void GenStruct(const Parser &parser, StructDef &struct_def,
|
|||||||
it != struct_def.fields.vec.end();
|
it != struct_def.fields.vec.end();
|
||||||
++it) {
|
++it) {
|
||||||
auto &field = **it;
|
auto &field = **it;
|
||||||
if (field.padding)
|
GenPadding(field, [&code, &padding_id](int bits) {
|
||||||
|
(void)bits;
|
||||||
code += " (void)__padding" + NumToString(padding_id++) + ";";
|
code += " (void)__padding" + NumToString(padding_id++) + ";";
|
||||||
|
});
|
||||||
}
|
}
|
||||||
code += " }\n\n";
|
code += " }\n\n";
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user