summaryrefslogtreecommitdiff
path: root/src/script/api/qscriptengine.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/script/api/qscriptengine.cpp')
-rw-r--r--src/script/api/qscriptengine.cpp40
1 files changed, 32 insertions, 8 deletions
diff --git a/src/script/api/qscriptengine.cpp b/src/script/api/qscriptengine.cpp
index 8f8c86d..d8eaf3f 100644
--- a/src/script/api/qscriptengine.cpp
+++ b/src/script/api/qscriptengine.cpp
@@ -1307,14 +1307,7 @@ void QScriptEnginePrivate::mark(JSC::MarkStack& markStack)
}
#ifndef QT_NO_QOBJECT
- markStack.drain(); // make sure everything is marked before marking qobject data
- {
- QHash<QObject*, QScript::QObjectData*>::const_iterator it;
- for (it = m_qobjectData.constBegin(); it != m_qobjectData.constEnd(); ++it) {
- QScript::QObjectData *qdata = it.value();
- qdata->mark(markStack);
- }
- }
+ markQObjectData(markStack);
#endif
}
@@ -1417,6 +1410,37 @@ JSC::JSValue QScriptEnginePrivate::evaluateHelper(JSC::ExecState *exec, intptr_t
#ifndef QT_NO_QOBJECT
+void QScriptEnginePrivate::markQObjectData(JSC::MarkStack& markStack)
+{
+ QHash<QObject*, QScript::QObjectData*>::const_iterator it;
+ // 1. Clear connection mark bits for all objects
+ for (it = m_qobjectData.constBegin(); it != m_qobjectData.constEnd(); ++it) {
+ QScript::QObjectData *qdata = it.value();
+ qdata->clearConnectionMarkBits();
+ }
+
+ // 2. Iterate until no more connections are marked
+ int markedCount;
+ do {
+ // Drain the stack to ensure mark bits are set; this is used to determine
+ // whether a connection's sender object is weakly referenced
+ markStack.drain();
+
+ markedCount = 0;
+ for (it = m_qobjectData.constBegin(); it != m_qobjectData.constEnd(); ++it) {
+ QScript::QObjectData *qdata = it.value();
+ markedCount += qdata->markConnections(markStack);
+ }
+ } while (markedCount > 0);
+ markStack.drain(); // One last time before marking wrappers
+
+ // 3. Mark all wrappers
+ for (it = m_qobjectData.constBegin(); it != m_qobjectData.constEnd(); ++it) {
+ QScript::QObjectData *qdata = it.value();
+ qdata->markWrappers(markStack);
+ }
+}
+
JSC::JSValue QScriptEnginePrivate::newQObject(
QObject *object, QScriptEngine::ValueOwnership ownership,
const QScriptEngine::QObjectWrapOptions &options)