aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jsruntime/qv4estable.cpp
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2018-08-26 15:07:50 +0200
committerSimon Hausmann <simon.hausmann@qt.io>2018-08-28 21:45:45 +0000
commit464b878b973710077b2b92b1682d6f38c83554dd (patch)
tree2577a70c9809bebc3776a0e11422badfdd310c90 /src/qml/jsruntime/qv4estable.cpp
parentbead103138c0d9dff3c9f927c9c4e2f44ee7db4c (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.cpp22
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;
+}
+