From 599e927590662c3e59cbc9c2e22f808a1bf92e90 Mon Sep 17 00:00:00 2001 From: Benoit Blanchon Date: Fri, 12 Nov 2021 16:55:41 +0100 Subject: [PATCH] Fix `JsonVariant::memoryUsage()` for raw strings --- CHANGELOG.md | 1 + extras/tests/JsonVariant/memoryUsage.cpp | 4 +++- src/ArduinoJson/Variant/VariantData.hpp | 4 +++- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 13a7ead5..7979579e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ HEAD * Add `as()` and `is()` * Add safe bool idiom in `JsonString` * Remove `DeserializationError == bool` and `DeserializationError != bool` +* Fix `JsonVariant::memoryUsage()` for raw strings v6.18.5 (2021-09-28) ------- diff --git a/extras/tests/JsonVariant/memoryUsage.cpp b/extras/tests/JsonVariant/memoryUsage.cpp index 9c5c6fd8..5637f113 100644 --- a/extras/tests/JsonVariant/memoryUsage.cpp +++ b/extras/tests/JsonVariant/memoryUsage.cpp @@ -30,10 +30,12 @@ TEST_CASE("JsonVariant::memoryUsage()") { SECTION("returns size of owned string") { var.set(std::string("hello")); REQUIRE(var.memoryUsage() == 6); + REQUIRE(var.memoryUsage() == doc.memoryUsage()); } SECTION("returns size of owned raw") { var.set(serialized(std::string("hello"))); - REQUIRE(var.memoryUsage() == 5); + REQUIRE(var.memoryUsage() == 6); + REQUIRE(var.memoryUsage() == doc.memoryUsage()); } } diff --git a/src/ArduinoJson/Variant/VariantData.hpp b/src/ArduinoJson/Variant/VariantData.hpp index 5627c51d..cd0b3277 100644 --- a/src/ArduinoJson/Variant/VariantData.hpp +++ b/src/ArduinoJson/Variant/VariantData.hpp @@ -257,7 +257,9 @@ class VariantData { case VALUE_IS_OWNED_STRING: return strlen(_content.asString) + 1; case VALUE_IS_OWNED_RAW: - return _content.asRaw.size; + // We always add a zero at the end: the deduplication function uses it + // to detect the beginning of the next string. + return _content.asRaw.size + 1; case VALUE_IS_OBJECT: case VALUE_IS_ARRAY: return _content.asCollection.memoryUsage();