summaryrefslogtreecommitdiff
path: root/src/3rdparty/javascriptcore/JavaScriptCore/runtime
diff options
context:
space:
mode:
authorKent Hansen <kent.hansen@nokia.com>2012-06-28 15:29:22 +0200
committerQt by Nokia <qt-info@nokia.com>2012-07-03 19:30:46 +0200
commit378416af7542e34196908896c9a69573b995adb0 (patch)
tree750186a60e69cf0e9335b23ce3e1ca245f176de2 /src/3rdparty/javascriptcore/JavaScriptCore/runtime
parentb9a5e257882c6418e28a82b9af1e9a6ac3044aea (diff)
downloadqtscript-378416af7542e34196908896c9a69573b995adb0.tar.gz
Ensure QObject wrappers are garbage-collected if appropriate
Address the "###" comment. When QScriptEngine::newQObject() is called with the option PreferExistingWrapperObject, the resulting wrapper object is cached by the engine, in case it will be needed later (e.g., by a subsequent newQObject() call for the same QObject, with the same wrap options). But if a QObject wrapper object is only referenced by the QtScript internals (i.e., not reachable from the JSC stack/heap, or kept in a QScriptValue), the wrapper should not be kept alive if the ownership is ScriptOwnership, or if the ownership is AutoOwnership and the C++ object has no parent. If the wrapper is marked in that case, it won't get collected, and hence the C++ object will be kept alive, too. In practice, QtScript appears to leak memory (the objects will only be destroyed when the engine is destroyed). Our copy of JSC doesn't have a concept of weak references; the ClientData callback in the JSC markRoots() function (which causes QScriptEnginePrivate::mark() to be called) was moved to the end. This enables the wrapper and connection marking logic to determine whether a wrapper can be safely discarded (if it hasn't been marked by JSC by this point, it must be a weak reference). Task-number: QTBUG-21993 Change-Id: I61f6aafc91f080b80d3f5859148e645b80d9b653 Reviewed-by: Olivier Goffart <ogoffart@woboq.com>
Diffstat (limited to 'src/3rdparty/javascriptcore/JavaScriptCore/runtime')
-rw-r--r--src/3rdparty/javascriptcore/JavaScriptCore/runtime/Collector.cpp10
1 files changed, 5 insertions, 5 deletions
diff --git a/src/3rdparty/javascriptcore/JavaScriptCore/runtime/Collector.cpp b/src/3rdparty/javascriptcore/JavaScriptCore/runtime/Collector.cpp
index 36269ff..d5adbd7 100644
--- a/src/3rdparty/javascriptcore/JavaScriptCore/runtime/Collector.cpp
+++ b/src/3rdparty/javascriptcore/JavaScriptCore/runtime/Collector.cpp
@@ -1151,11 +1151,6 @@ void Heap::markRoots()
// Mark explicitly registered roots.
markProtectedObjects(markStack);
-#if QT_BUILD_SCRIPT_LIB
- if (m_globalData->clientData)
- m_globalData->clientData->mark(markStack);
-#endif
-
// Mark misc. other roots.
if (m_markListSet && m_markListSet->size())
MarkedArgumentBuffer::markLists(markStack, *m_markListSet);
@@ -1167,6 +1162,11 @@ void Heap::markRoots()
if (m_globalData->firstStringifierToMark)
JSONObject::markStringifiers(markStack, m_globalData->firstStringifierToMark);
+#if QT_BUILD_SCRIPT_LIB
+ if (m_globalData->clientData)
+ m_globalData->clientData->mark(markStack);
+#endif
+
markStack.drain();
markStack.compact();