Fixed "linked" strings incorrectly marked as "owned" (fixes #1318)

This commit is contained in:
Benoit Blanchon
2020-07-24 22:25:56 +02:00
parent 6dc36125c2
commit 4df29fbac1
9 changed files with 75 additions and 74 deletions

View File

@@ -101,7 +101,7 @@ class VariantData {
case VALUE_IS_OBJECT:
return toObject().copyFrom(src._content.asCollection, pool);
case VALUE_IS_OWNED_STRING:
return setOwnedString(RamStringAdapter(src._content.asString), pool);
return setString(RamStringAdapter(src._content.asString), pool);
case VALUE_IS_OWNED_RAW:
return setOwnedRaw(
serialized(src._content.asRaw.data, src._content.asRaw.size), pool);
@@ -238,27 +238,24 @@ class VariantData {
_content.asInteger = value;
}
void setLinkedString(const char *value) {
if (value) {
setType(VALUE_IS_LINKED_STRING);
_content.asString = value;
} else {
setType(VALUE_IS_NULL);
}
}
void setNull() {
setType(VALUE_IS_NULL);
}
void setOwnedString(not_null<const char *> s) {
void setString(not_null<const char *> s, storage_policies::store_by_copy) {
setType(VALUE_IS_OWNED_STRING);
_content.asString = s.get();
}
bool setOwnedString(const char *s) {
void setString(not_null<const char *> s, storage_policies::store_by_address) {
setType(VALUE_IS_LINKED_STRING);
_content.asString = s.get();
}
template <typename TStoragePolicy>
bool setString(const char *s, TStoragePolicy storage_policy) {
if (s) {
setOwnedString(make_not_null(s));
setString(make_not_null(s), storage_policy);
return true;
} else {
setType(VALUE_IS_NULL);
@@ -267,8 +264,30 @@ class VariantData {
}
template <typename TAdaptedString>
bool setOwnedString(TAdaptedString value, MemoryPool *pool) {
return setOwnedString(pool->saveString(value));
bool setString(TAdaptedString value, MemoryPool *pool) {
return setString(value, pool, typename TAdaptedString::storage_policy());
}
template <typename TAdaptedString>
inline bool setString(TAdaptedString value, MemoryPool *pool,
storage_policies::decide_at_runtime) {
if (value.isStatic())
return setString(value, pool, storage_policies::store_by_address());
else
return setString(value, pool, storage_policies::store_by_copy());
}
template <typename TAdaptedString>
inline bool setString(TAdaptedString value, MemoryPool *,
storage_policies::store_by_address) {
return setString(value.data(), storage_policies::store_by_address());
}
template <typename TAdaptedString>
inline bool setString(TAdaptedString value, MemoryPool *pool,
storage_policies::store_by_copy) {
return setString(pool->saveString(value),
storage_policies::store_by_copy());
}
CollectionData &toArray() {