From 464b878b973710077b2b92b1682d6f38c83554dd Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Sun, 26 Aug 2018 15:07:50 +0200 Subject: Implement support for WeakMap Change-Id: Id23e80fe5918ba7dc897568123bf3db4d35e9092 Reviewed-by: Simon Hausmann --- src/qml/memory/qv4mm.cpp | 19 +++++++++++++++++++ src/qml/memory/qv4mm_p.h | 3 +++ 2 files changed, 22 insertions(+) (limited to 'src/qml/memory') diff --git a/src/qml/memory/qv4mm.cpp b/src/qml/memory/qv4mm.cpp index 258fac57af..065204b5d3 100644 --- a/src/qml/memory/qv4mm.cpp +++ b/src/qml/memory/qv4mm.cpp @@ -61,6 +61,7 @@ #include #include "qv4alloca_p.h" #include "qv4profiling_p.h" +#include "qv4mapobject_p.h" //#define MM_STATS @@ -976,6 +977,18 @@ void MemoryManager::sweep(bool lastSweep, ClassDestroyStatsCallback classCountPt (*it) = Primitive::undefinedValue(); } + // remove objects from weak maps and sets + Heap::MapObject *map = weakMaps; + Heap::MapObject **lastMap = &weakMaps; + while (map) { + if (map->isMarked()) { + map->removeUnmarkedKeys(); + *lastMap = map; + lastMap = &map->nextWeakMap; + } + map = map->nextWeakMap; + } + // onDestruction handlers may have accessed other QObject wrappers and reset their value, so ensure // that they are all set to undefined. for (PersistentValueStorage::Iterator it = m_weakValues->begin(); it != m_weakValues->end(); ++it) { @@ -1179,6 +1192,12 @@ size_t MemoryManager::getLargeItemsMem() const return hugeItemAllocator.usedMem(); } +void MemoryManager::registerWeakMap(Heap::MapObject *map) +{ + map->nextWeakMap = weakMaps; + weakMaps = map; +} + MemoryManager::~MemoryManager() { delete m_persistentValues; diff --git a/src/qml/memory/qv4mm_p.h b/src/qml/memory/qv4mm_p.h index e3a011caf9..da162d2dfe 100644 --- a/src/qml/memory/qv4mm_p.h +++ b/src/qml/memory/qv4mm_p.h @@ -274,6 +274,8 @@ public: return static_cast(b); } + void registerWeakMap(Heap::MapObject *map); + protected: /// expects size to be aligned Heap::Base *allocString(std::size_t unmanagedSize); @@ -296,6 +298,7 @@ public: PersistentValueStorage *m_persistentValues; PersistentValueStorage *m_weakValues; QVector m_pendingFreedObjectWrapperValue; + Heap::MapObject *weakMaps = nullptr; std::size_t unmanagedHeapSize = 0; // the amount of bytes of heap that is not managed by the memory manager, but which is held onto by managed items. std::size_t unmanagedHeapSizeGCLimit; -- cgit v1.2.3