Skip to content

Commit 93e0a9e

Browse files
committed
Update StringBuffer
1 parent da21f46 commit 93e0a9e

File tree

3 files changed

+43
-17
lines changed

3 files changed

+43
-17
lines changed

extras/tests/MsgPackDeserializer/deserializeArray.cpp

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,11 @@
55
#include <ArduinoJson.h>
66
#include <catch.hpp>
77

8+
#include "Allocators.hpp"
9+
810
TEST_CASE("deserialize MsgPack array") {
9-
JsonDocument doc;
11+
SpyingAllocator spy;
12+
JsonDocument doc(&spy);
1013

1114
SECTION("fixarray") {
1215
SECTION("empty") {
@@ -30,6 +33,24 @@ TEST_CASE("deserialize MsgPack array") {
3033
REQUIRE(array[0] == 1);
3134
REQUIRE(array[1] == 2);
3235
}
36+
37+
SECTION("tiny strings") {
38+
DeserializationError error =
39+
deserializeMsgPack(doc, "\x92\xA3xxx\xA3yyy");
40+
41+
REQUIRE(error == DeserializationError::Ok);
42+
REQUIRE(doc.is<JsonArray>());
43+
REQUIRE(doc.size() == 2);
44+
REQUIRE(doc[0] == "xxx");
45+
REQUIRE(doc[1] == "yyy");
46+
REQUIRE(spy.log() == AllocatorLog{
47+
Allocate(sizeofPool()),
48+
Allocate(sizeofString("xxx")),
49+
// Buffer is reused for the next string
50+
Deallocate(sizeofString("xxx")),
51+
Reallocate(sizeofPool(), sizeofPool(2)),
52+
});
53+
}
3354
}
3455

3556
SECTION("array 16") {

extras/tests/MsgPackDeserializer/deserializeVariant.cpp

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -348,28 +348,31 @@ TEST_CASE("deserializeMsgPack() under memory constaints") {
348348
SECTION("{}") {
349349
checkError(0, "\x80", DeserializationError::Ok);
350350
}
351-
SECTION("{H:1}") {
352-
checkError(1, "\x81\xA1H\x01", DeserializationError::NoMemory);
353-
checkError(2, "\x81\xA1H\x01", DeserializationError::Ok);
351+
SECTION("{Hello:1}") {
352+
checkError(1, "\x81\xA5Hello\x01", DeserializationError::NoMemory);
353+
checkError(2, "\x81\xA5Hello\x01", DeserializationError::Ok);
354354
}
355-
SECTION("{H:1,W:2}") {
356-
checkError(2, "\x82\xA1H\x01\xA1W\x02", DeserializationError::NoMemory);
357-
checkError(3, "\x82\xA1H\x01\xA1W\x02", DeserializationError::Ok);
355+
SECTION("{Hello:1,World:2}") {
356+
checkError(2, "\x82\xA5Hello\x01\xA5World\x02",
357+
DeserializationError::NoMemory);
358+
checkError(3, "\x82\xA5Hello\x01\xA5World\x02", DeserializationError::Ok);
358359
}
359360
}
360361

361362
SECTION("map 16") {
362363
SECTION("{}") {
363364
checkError(0, "\xDE\x00\x00", DeserializationError::Ok);
364365
}
365-
SECTION("{H:1}") {
366-
checkError(1, "\xDE\x00\x01\xA1H\x01", DeserializationError::NoMemory);
367-
checkError(2, "\xDE\x00\x01\xA1H\x01", DeserializationError::Ok);
366+
SECTION("{Hello:1}") {
367+
checkError(1, "\xDE\x00\x01\xA5Hello\x01",
368+
DeserializationError::NoMemory);
369+
checkError(2, "\xDE\x00\x01\xA5Hello\x01", DeserializationError::Ok);
368370
}
369-
SECTION("{H:1,W:2}") {
370-
checkError(2, "\xDE\x00\x02\xA1H\x01\xA1W\x02",
371+
SECTION("{Hello:1,World:2}") {
372+
checkError(2, "\xDE\x00\x02\xA5Hello\x01\xA5World\x02",
371373
DeserializationError::NoMemory);
372-
checkError(3, "\xDE\x00\x02\xA1H\x01\xA1W\x02", DeserializationError::Ok);
374+
checkError(3, "\xDE\x00\x02\xA5Hello\x01\xA5World\x02",
375+
DeserializationError::Ok);
373376
}
374377
}
375378

@@ -382,8 +385,8 @@ TEST_CASE("deserializeMsgPack() under memory constaints") {
382385
DeserializationError::NoMemory);
383386
checkError(2, "\xDF\x00\x00\x00\x01\xA1H\x01", DeserializationError::Ok);
384387
}
385-
SECTION("{H:1,W:2}") {
386-
checkError(2, "\xDF\x00\x00\x00\x02\xA1H\x01\xA1W\x02",
388+
SECTION("{Hello:1,World:2}") {
389+
checkError(2, "\xDF\x00\x00\x00\x02\xA5Hello\x01\xA5World\x02",
387390
DeserializationError::NoMemory);
388391
checkError(3, "\xDF\x00\x00\x00\x02\xA1H\x01\xA1W\x02",
389392
DeserializationError::Ok);

src/ArduinoJson/Memory/StringBuffer.hpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,14 @@ class StringBuffer {
3434

3535
JsonString str() const {
3636
ARDUINOJSON_ASSERT(node_ != nullptr);
37-
3837
return JsonString(node_->data, node_->length);
3938
}
4039

4140
void save(VariantData* data) {
42-
data->setOwnedString(commitStringNode());
41+
if (size_ <= tinyStringMaxLength)
42+
data->setTinyString(node_->data, static_cast<uint8_t>(size_));
43+
else
44+
data->setOwnedString(commitStringNode());
4345
}
4446

4547
void saveRaw(VariantData* data) {

0 commit comments

Comments
 (0)