diff options
author | Lars Knoll <lars.knoll@qt.io> | 2018-08-26 15:07:50 +0200 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@qt.io> | 2018-08-28 21:45:45 +0000 |
commit | 464b878b973710077b2b92b1682d6f38c83554dd (patch) | |
tree | 2577a70c9809bebc3776a0e11422badfdd310c90 /src/qml/jsruntime/qv4estable.cpp | |
parent | bead103138c0d9dff3c9f927c9c4e2f44ee7db4c (diff) |
Implement support for WeakMap
Change-Id: Id23e80fe5918ba7dc897568123bf3db4d35e9092
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Diffstat (limited to 'src/qml/jsruntime/qv4estable.cpp')
-rw-r--r-- | src/qml/jsruntime/qv4estable.cpp | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/src/qml/jsruntime/qv4estable.cpp b/src/qml/jsruntime/qv4estable.cpp index 55b7407000..4b0eddb989 100644 --- a/src/qml/jsruntime/qv4estable.cpp +++ b/src/qml/jsruntime/qv4estable.cpp @@ -38,6 +38,7 @@ ****************************************************************************/ #include "qv4estable_p.h" +#include "qv4object_p.h" using namespace QV4; @@ -67,10 +68,11 @@ ESTable::~ESTable() m_values = nullptr; } -void ESTable::markObjects(MarkStack *s) +void ESTable::markObjects(MarkStack *s, bool isWeakMap) { for (uint i = 0; i < m_size; ++i) { - m_keys[i].mark(s); + if (!isWeakMap) + m_keys[i].mark(s); m_values[i].mark(s); } } @@ -179,3 +181,19 @@ void ESTable::iterate(uint idx, Value *key, Value *value) *value = m_values[idx]; } +void ESTable::removeUnmarkedKeys() +{ + uint idx = 0; + uint toIdx = 0; + for (; idx < m_size; ++idx) { + Q_ASSERT(m_keys[idx].isObject()); + Object &o = static_cast<Object &>(m_keys[idx]); + if (o.d()->isMarked()) { + m_keys[toIdx] = m_keys[idx]; + m_values[toIdx] = m_values[idx]; + ++toIdx; + } + } + m_size = toIdx; +} + |