summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAaron Kennedy <aaron.kennedy@nokia.com>2009-11-09 01:33:14 (GMT)
committerDavid Boddie <dboddie@trolltech.com>2009-11-11 16:06:45 (GMT)
commitd4e310005a2fbd34b36c46431bc4ad6c18011466 (patch)
tree6d4f9451f259ef00f1eb9b342ff7b9176b594751 /src
parent0a4adee8f1947beaac38a21b1eb8b031b4cdbc52 (diff)
downloadQt-d4e310005a2fbd34b36c46431bc4ad6c18011466.zip
Qt-d4e310005a2fbd34b36c46431bc4ad6c18011466.tar.gz
Qt-d4e310005a2fbd34b36c46431bc4ad6c18011466.tar.bz2
During a GC mark the scope chain of QScriptContexts
It appears that simply being in the scope chain of an existant frame isn't sufficient to be marked. This can lead to a QScriptContext scope chain that contains a JSObject that has been collected. For example, this code: QScriptContext *ctxt = engine->pushContext(); ctxt.pushScope(engine->newObject()); previouslyCreatedFunctionObject.call(); // causes a GC can lead to the object added to the scope chain to have become invalid. This leads to hilarity later on. Reviewed-by: Kent Hansen
Diffstat (limited to 'src')
-rw-r--r--src/script/api/qscriptengine.cpp18
1 files changed, 18 insertions, 0 deletions
diff --git a/src/script/api/qscriptengine.cpp b/src/script/api/qscriptengine.cpp
index 2b60a46..f41b4e2 100644
--- a/src/script/api/qscriptengine.cpp
+++ b/src/script/api/qscriptengine.cpp
@@ -1093,6 +1093,8 @@ void QScriptEnginePrivate::setContextFlags(JSC::ExecState *exec, uint flags)
void QScriptEnginePrivate::mark(JSC::MarkStack& markStack)
{
+ Q_Q(QScriptEngine);
+
markStack.append(originalGlobalObject());
markStack.append(globalObject());
if (originalGlobalObjectProxy)
@@ -1130,6 +1132,22 @@ void QScriptEnginePrivate::mark(JSC::MarkStack& markStack)
markStack.append((*it)->prototype);
}
}
+
+ {
+ QScriptContext *context = q->currentContext();
+
+ while (context) {
+ JSC::ScopeChainNode *node = frameForContext(context)->scopeChain();
+ JSC::ScopeChainIterator it(node);
+ for (it = node->begin(); it != node->end(); ++it) {
+ JSC::JSObject *object = *it;
+ if (object)
+ markStack.append(object);
+ }
+
+ context = context->parentContext();
+ }
+ }
}
bool QScriptEnginePrivate::isCollecting() const