diff options
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; +} + |