summaryrefslogtreecommitdiff
path: root/src/script/bridge/qscriptqobject_p.h
diff options
context:
space:
mode:
authorKent Hansen <kent.hansen@nokia.com>2012-08-02 14:27:40 +0200
committerQt by Nokia <qt-info@nokia.com>2012-08-09 15:07:51 +0200
commitd7bba09f263a522d36fd4a704e6667e7a9efd297 (patch)
tree0e48c019ea1016995a979a59c185f219d60ddfb8 /src/script/bridge/qscriptqobject_p.h
parentc07a9fe847f536d1090c6876ed516baa8607b786 (diff)
downloadqtscript-d7bba09f263a522d36fd4a704e6667e7a9efd297.tar.gz
Fix GC issues related to QObject connections and ownership
Issue 1: Even if a sender object was only weakly referenced, the connection's slot function would still get marked. If the slot was a closure, its scope could hold a reference to the sender object, so by marking the closure, the sender would get marked, too - even if there were no other references to the closure outside of the QObject connection structure. This would cause the sender object to stay alive, rather than being garbage-collected (i.e., it leaked). Issue 2: It's possible that a closure used as a slot in a connection for one QObject holds the only reference to another QObject that has connections of its own. In that case, if the first object is explicitly referenced, the second object (and its connections) should get marked. But depending on the order in which the connections were marked, the second object might get treated incorrectly. This commit solves both issues by introducing an iterative scheme for marking connections. The first pass marks only connections whose sender object is referenced elsewhere in the JS environment. The second pass marks connections whose sender object is referenced by slots of the connections marked in the first pass. And so on, until no more connections should be marked. At that point, any remaining unmarked connections are effectively dead (belonging to QObjects that can be reclaimed by the GC). Task-number: QTBUG-26590 Change-Id: I50aa66f7fe407a6827b6f2a12e027275a2fb4655 Reviewed-by: Simon Hausmann <simon.hausmann@nokia.com>
Diffstat (limited to 'src/script/bridge/qscriptqobject_p.h')
-rw-r--r--src/script/bridge/qscriptqobject_p.h4
1 files changed, 3 insertions, 1 deletions
diff --git a/src/script/bridge/qscriptqobject_p.h b/src/script/bridge/qscriptqobject_p.h
index 55ed0f7..992b03c 100644
--- a/src/script/bridge/qscriptqobject_p.h
+++ b/src/script/bridge/qscriptqobject_p.h
@@ -183,7 +183,9 @@ public:
QScriptEngine::ValueOwnership ownership,
const QScriptEngine::QObjectWrapOptions &options);
- void mark(JSC::MarkStack&);
+ void clearConnectionMarkBits();
+ int markConnections(JSC::MarkStack&);
+ void markWrappers(JSC::MarkStack&);
private:
QScriptEnginePrivate *engine;