From 3a73ccf02767c4117e8fe603aad64c2f287e09d7 Mon Sep 17 00:00:00 2001 From: Benoit Blanchon Date: Thu, 25 May 2023 09:54:52 +0200 Subject: [PATCH] Move string copy logic into `VariantData::setString()` --- src/ArduinoJson/Json/JsonDeserializer.hpp | 2 +- .../MsgPack/MsgPackDeserializer.hpp | 2 +- src/ArduinoJson/Variant/ConverterImpl.hpp | 2 +- src/ArduinoJson/Variant/VariantData.hpp | 21 +++++++++++++++++-- src/ArduinoJson/Variant/VariantFunctions.hpp | 18 ++-------------- 5 files changed, 24 insertions(+), 21 deletions(-) diff --git a/src/ArduinoJson/Json/JsonDeserializer.hpp b/src/ArduinoJson/Json/JsonDeserializer.hpp index 9602496a..dcea5778 100644 --- a/src/ArduinoJson/Json/JsonDeserializer.hpp +++ b/src/ArduinoJson/Json/JsonDeserializer.hpp @@ -394,7 +394,7 @@ class JsonDeserializer { if (err) return err; - variant.setString(stringBuilder_.save()); + variant.setOwnedString(stringBuilder_.save()); return DeserializationError::Ok; } diff --git a/src/ArduinoJson/MsgPack/MsgPackDeserializer.hpp b/src/ArduinoJson/MsgPack/MsgPackDeserializer.hpp index 7c4ece52..21af5bac 100644 --- a/src/ArduinoJson/MsgPack/MsgPackDeserializer.hpp +++ b/src/ArduinoJson/MsgPack/MsgPackDeserializer.hpp @@ -370,7 +370,7 @@ class MsgPackDeserializer { if (err) return err; - variant->setString(stringBuilder_.save()); + variant->setOwnedString(stringBuilder_.save()); return DeserializationError::Ok; } diff --git a/src/ArduinoJson/Variant/ConverterImpl.hpp b/src/ArduinoJson/Variant/ConverterImpl.hpp index c71dbaae..7845767e 100644 --- a/src/ArduinoJson/Variant/ConverterImpl.hpp +++ b/src/ArduinoJson/Variant/ConverterImpl.hpp @@ -227,7 +227,7 @@ inline void convertToJson(const ::Printable& src, JsonVariant dst) { data->setNull(); return; } - data->setString(print.save()); + data->setOwnedString(print.save()); } #endif diff --git a/src/ArduinoJson/Variant/VariantData.hpp b/src/ArduinoJson/Variant/VariantData.hpp index ba6545d6..6c396fc6 100644 --- a/src/ArduinoJson/Variant/VariantData.hpp +++ b/src/ArduinoJson/Variant/VariantData.hpp @@ -304,13 +304,30 @@ class VariantData { setRawString(s); } - void setString(const char* s) { + template + void setString(TAdaptedString value, MemoryPool* pool) { + setNull(pool); + + if (value.isNull()) + return; + + if (value.isLinked()) { + setLinkedString(value.data()); + return; + } + + auto dup = pool->saveString(value); + if (dup) + setOwnedString(dup); + } + + void setLinkedString(const char* s) { ARDUINOJSON_ASSERT(s); setType(VALUE_IS_LINKED_STRING); content_.asLinkedString = s; } - void setString(StringNode* s) { + void setOwnedString(StringNode* s) { ARDUINOJSON_ASSERT(s); setType(VALUE_IS_OWNED_STRING); content_.asOwnedString = s; diff --git a/src/ArduinoJson/Variant/VariantFunctions.hpp b/src/ArduinoJson/Variant/VariantFunctions.hpp index f6745d02..14ece189 100644 --- a/src/ArduinoJson/Variant/VariantFunctions.hpp +++ b/src/ArduinoJson/Variant/VariantFunctions.hpp @@ -47,7 +47,7 @@ inline bool variantCopyFrom(VariantData* dst, const VariantData* src, auto dup = pool->saveString(str); if (!dup) return false; - dst->setString(dup); + dst->setOwnedString(dup); return true; } case VALUE_IS_RAW_STRING: { @@ -95,21 +95,7 @@ inline void variantSetString(VariantData* var, TAdaptedString value, MemoryPool* pool) { if (!var) return; - var->setNull(pool); - - if (value.isNull()) - return; - - if (value.isLinked()) { - var->setString(value.data()); - return; - } - - auto dup = pool->saveString(value); - if (dup) - var->setString(dup); - else - var->setNull(); + var->setString(value, pool); } template