mirror of
https://github.com/google/flatbuffers.git
synced 2026-07-01 11:31:37 +00:00
Correct calculation of vector element size (#5831)
Number of elements on the stack shouldn't affect the calculation of ElemWidth(). Variable 'start' needs to be subtracted from the loop variable 'i' to make indexing zero-based. There is an additional unit test to pack nested vectors. Size of the packed buffer *without* this fix is 798 and only 664 bytes *with* the fix.
This commit is contained in:
@@ -1522,7 +1522,8 @@ class Builder FLATBUFFERS_FINAL_CLASS {
|
|||||||
Type vector_type = FBT_KEY;
|
Type vector_type = FBT_KEY;
|
||||||
// Check bit widths and types for all elements.
|
// Check bit widths and types for all elements.
|
||||||
for (size_t i = start; i < stack_.size(); i += step) {
|
for (size_t i = start; i < stack_.size(); i += step) {
|
||||||
auto elem_width = stack_[i].ElemWidth(buf_.size(), i + prefix_elems);
|
auto elem_width =
|
||||||
|
stack_[i].ElemWidth(buf_.size(), i - start + prefix_elems);
|
||||||
bit_width = (std::max)(bit_width, elem_width);
|
bit_width = (std::max)(bit_width, elem_width);
|
||||||
if (typed) {
|
if (typed) {
|
||||||
if (i == start) {
|
if (i == start) {
|
||||||
|
|||||||
@@ -2885,6 +2885,17 @@ void FlexBuffersTest() {
|
|||||||
// And from FlexBuffer back to JSON:
|
// And from FlexBuffer back to JSON:
|
||||||
auto jsonback = jroot.ToString();
|
auto jsonback = jroot.ToString();
|
||||||
TEST_EQ_STR(jsontest, jsonback.c_str());
|
TEST_EQ_STR(jsontest, jsonback.c_str());
|
||||||
|
|
||||||
|
slb.Clear();
|
||||||
|
slb.Vector([&]() {
|
||||||
|
for (int i = 0; i < 130; ++i) slb.Add(static_cast<uint8_t>(255));
|
||||||
|
slb.Vector([&]() {
|
||||||
|
for (int i = 0; i < 130; ++i) slb.Add(static_cast<uint8_t>(255));
|
||||||
|
slb.Vector([] {});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
slb.Finish();
|
||||||
|
TEST_EQ(slb.GetSize(), 664);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FlexBuffersDeprecatedTest() {
|
void FlexBuffersDeprecatedTest() {
|
||||||
|
|||||||
Reference in New Issue
Block a user