summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@qt.io>2019-06-27 17:30:38 +0300
committerMiikka Heikkinen <miikka.heikkinen@qt.io>2019-06-28 09:09:36 +0300
commita0eef0c702b06e442db90a3b6ef1b488e67b63f5 (patch)
tree19410e4028e81bf2f400d9c88cfd6594aa2dfb04 /src
parent9dc9e3a881906d45ba18b660864d3c2674a9a0ba (diff)
Fix setting subpresentations via setAttribute
Splitting the stringtable to static and dynamic parts broke cases where the string that was registered dynamically had already been registered to static side of the string table. This resulted the same string having two handles referring to it, which made equality checking unreliable. Task-number: QT3DS-3722 Change-Id: I5bf5f42935794f57b6947b877211f17263305b0f Reviewed-by: Tomi Korpipää <tomi.korpipaa@qt.io> Reviewed-by: Jari Karppinen <jari.karppinen@qt.io> Reviewed-by: Antti Määttä <antti.maatta@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/foundation/StringTable.cpp35
1 files changed, 25 insertions, 10 deletions
diff --git a/src/foundation/StringTable.cpp b/src/foundation/StringTable.cpp
index f4dc574..7833639 100644
--- a/src/foundation/StringTable.cpp
+++ b/src/foundation/StringTable.cpp
@@ -319,6 +319,16 @@ public:
return theFind->second;
}
+ SCharAndHandle justFindStrDontRegister(SCharAndHash hashCode)
+ {
+ if (isTrivial(hashCode.m_Data))
+ return SCharAndHandle();
+ TMapType::iterator theFind = m_HashToStrMap.find(hashCode);
+ if (theFind == m_HashToStrMap.end())
+ return SCharAndHandle();
+ return theFind->second;
+ }
+
const CRegisteredString FindStr(SCharAndHash hashCode)
{
SCharAndHandle result = DoFindStr(hashCode);
@@ -657,18 +667,23 @@ public:
DynamicString *theStr = nullptr;
if (!handle) {
- if (m_dynamicFreeHandlesMap.isEmpty()) {
- handle = ++m_nextFreeDynamicHandle;
- theStr = new DynamicString;
+ handle = m_FileData.justFindStrDontRegister(str.constData()).m_Handle;
+ if (!handle) {
+ if (m_dynamicFreeHandlesMap.isEmpty()) {
+ handle = ++m_nextFreeDynamicHandle;
+ theStr = new DynamicString;
+ } else {
+ auto first = m_dynamicFreeHandlesMap.begin();
+ handle = first.key();
+ theStr = first.value();
+ m_dynamicFreeHandlesMap.erase(first);
+ }
+ theStr->str = str;
+ m_dynamicStringToHandleMap.insert(str, handle);
+ m_dynamicUsedHandlesMap.insert(handle, theStr);
} else {
- auto first = m_dynamicFreeHandlesMap.begin();
- handle = first.key();
- theStr = first.value();
- m_dynamicFreeHandlesMap.erase(first);
+ return CStringHandle::ISwearThisHasBeenRegistered(handle);
}
- theStr->str = str;
- m_dynamicStringToHandleMap.insert(str, handle);
- m_dynamicUsedHandlesMap.insert(handle, theStr);
} else {
theStr = m_dynamicUsedHandlesMap.value(handle);
}