mirror of
https://github.com/google/flatbuffers.git
synced 2026-06-25 12:58:40 +00:00
[bfbs] fix deserializing nested struct (#5383)
This commit is contained in:
committed by
Wouter van Oortmerssen
parent
95004218f7
commit
4fdfe0d468
@@ -2955,14 +2955,13 @@ bool StructDef::Deserialize(Parser &parser, const reflection::Object *object) {
|
|||||||
return false;
|
return false;
|
||||||
DeserializeDoc(doc_comment, object->documentation());
|
DeserializeDoc(doc_comment, object->documentation());
|
||||||
name = parser.UnqualifiedName(object->name()->str());
|
name = parser.UnqualifiedName(object->name()->str());
|
||||||
fixed = object->is_struct();
|
|
||||||
minalign = object->minalign();
|
|
||||||
predecl = false;
|
predecl = false;
|
||||||
sortbysize = attributes.Lookup("original_order") == nullptr && !fixed;
|
sortbysize = attributes.Lookup("original_order") == nullptr && !fixed;
|
||||||
std::vector<uoffset_t> indexes =
|
std::vector<uoffset_t> indexes =
|
||||||
std::vector<uoffset_t>(object->fields()->size());
|
std::vector<uoffset_t>(object->fields()->size());
|
||||||
for (uoffset_t i = 0; i < object->fields()->size(); i++)
|
for (uoffset_t i = 0; i < object->fields()->size(); i++)
|
||||||
indexes[object->fields()->Get(i)->id()] = i;
|
indexes[object->fields()->Get(i)->id()] = i;
|
||||||
|
size_t tmp_struct_size = 0;
|
||||||
for (size_t i = 0; i < indexes.size(); i++) {
|
for (size_t i = 0; i < indexes.size(); i++) {
|
||||||
auto field = object->fields()->Get(indexes[i]);
|
auto field = object->fields()->Get(indexes[i]);
|
||||||
auto field_def = new FieldDef();
|
auto field_def = new FieldDef();
|
||||||
@@ -2978,14 +2977,14 @@ bool StructDef::Deserialize(Parser &parser, const reflection::Object *object) {
|
|||||||
i + 1 < indexes.size()
|
i + 1 < indexes.size()
|
||||||
? object->fields()->Get(indexes[i+1])
|
? object->fields()->Get(indexes[i+1])
|
||||||
: nullptr;
|
: nullptr;
|
||||||
bytesize += size;
|
tmp_struct_size += size;
|
||||||
field_def->padding =
|
field_def->padding =
|
||||||
next_field ? (next_field->offset() - field_def->value.offset) - size
|
next_field ? (next_field->offset() - field_def->value.offset) - size
|
||||||
: PaddingBytes(bytesize, minalign);
|
: PaddingBytes(tmp_struct_size, minalign);
|
||||||
bytesize += field_def->padding;
|
tmp_struct_size += field_def->padding;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
FLATBUFFERS_ASSERT(static_cast<int>(bytesize) == object->bytesize());
|
FLATBUFFERS_ASSERT(static_cast<int>(tmp_struct_size) == object->bytesize());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3264,6 +3263,9 @@ bool Parser::Deserialize(const reflection::Schema *schema) {
|
|||||||
for (auto it = schema->objects()->begin(); it != schema->objects()->end();
|
for (auto it = schema->objects()->begin(); it != schema->objects()->end();
|
||||||
++it) {
|
++it) {
|
||||||
auto struct_def = new StructDef();
|
auto struct_def = new StructDef();
|
||||||
|
struct_def->bytesize = it->bytesize();
|
||||||
|
struct_def->fixed = it->is_struct();
|
||||||
|
struct_def->minalign = it->minalign();
|
||||||
if (structs_.Add(it->name()->str(), struct_def)) {
|
if (structs_.Add(it->name()->str(), struct_def)) {
|
||||||
delete struct_def;
|
delete struct_def;
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
Reference in New Issue
Block a user