Kaynağa Gözat

Fixed `DynamicJsonBuffer::clear()` not resetting allocation size (fixes #561)

Benoit Blanchon 8 yıl önce
ebeveyn
işleme
57defe00ee

+ 5 - 0
CHANGELOG.md

@@ -1,6 +1,11 @@
 ArduinoJson: change log
 =======================
 
+HEAD
+----
+
+* Fixed `DynamicJsonBuffer::clear()` not resetting allocation size (issue #561)
+
 v5.11.1
 -------
 

+ 8 - 12
src/ArduinoJson/DynamicJsonBuffer.hpp

@@ -52,7 +52,7 @@ class DynamicJsonBufferBase
       : _head(NULL), _nextBlockCapacity(initialSize) {}
 
   ~DynamicJsonBufferBase() {
-    freeAllBlocks();
+    clear();
   }
 
   // Gets the number of bytes occupied in the buffer
@@ -71,7 +71,13 @@ class DynamicJsonBufferBase
   // Resets the buffer.
   // USE WITH CAUTION: this invalidates all previously allocated data
   void clear() {
-    freeAllBlocks();
+    Block* currentBlock = _head;
+    while (currentBlock != NULL) {
+      _nextBlockCapacity = currentBlock->capacity;
+      Block* nextBlock = currentBlock->next;
+      _allocator.deallocate(currentBlock);
+      currentBlock = nextBlock;
+    }
     _head = 0;
   }
 
@@ -144,16 +150,6 @@ class DynamicJsonBufferBase
     return true;
   }
 
-  void freeAllBlocks() {
-    Block* currentBlock = _head;
-
-    while (currentBlock != NULL) {
-      Block* nextBlock = currentBlock->next;
-      _allocator.deallocate(currentBlock);
-      currentBlock = nextBlock;
-    }
-  }
-
   TAllocator _allocator;
   Block* _head;
   size_t _nextBlockCapacity;

+ 2 - 2
test/DynamicJsonBuffer/alloc.cpp

@@ -46,7 +46,7 @@ TEST_CASE("DynamicJsonBuffer::alloc()") {
     REQUIRE(allocatorLog.str() == "A1A2FF");
   }
 
-  SECTION("Keeps increasing allocation size after clear") {
+  SECTION("Resets allocation size after clear()") {
     allocatorLog.str("");
     {
       DynamicJsonBufferBase<SpyingAllocator> buffer(1);
@@ -55,7 +55,7 @@ TEST_CASE("DynamicJsonBuffer::alloc()") {
       buffer.clear();
       buffer.alloc(1);
     }
-    REQUIRE(allocatorLog.str() == "A1A2FFA4F");
+    REQUIRE(allocatorLog.str() == "A1A2FFA1F");
   }
 
   SECTION("Makes a big allocation when needed") {