diff options
author | Jason McDonald <jason.mcdonald@nokia.com> | 2011-02-16 11:58:01 (GMT) |
---|---|---|
committer | Jason McDonald <jason.mcdonald@nokia.com> | 2011-02-16 11:58:01 (GMT) |
commit | 079f85dc421dc13d26f70851ecf4c360c3b6c93d (patch) | |
tree | 6cd47707a6b8e672e20ab1c38cffecce12f39f17 | |
parent | aea6acdc3dc0a499011e7778d4fa783bc193afe0 (diff) | |
download | Qt-079f85dc421dc13d26f70851ecf4c360c3b6c93d.zip Qt-079f85dc421dc13d26f70851ecf4c360c3b6c93d.tar.gz Qt-079f85dc421dc13d26f70851ecf4c360c3b6c93d.tar.bz2 |
Don't leak ScopeChainNode's
Create a sub-scope of the global scope chain, rather than a completely new scope
chain. Leaks are difficult to autotest, but an autotest for
QScriptDeclarativeClass::pushCleanContext() was added to ensure its behavior doesn't
regress. To reproduce the leak (prior to this change) use:
while (true) {
QScriptDeclarativeClass::pushCleanContext(&engine);
engine.popContext();
}
Change-Id: I41ac61ea1664da569eb329c8276f2a0bb6d2f1f7
Task-number: QTBUG-17166
Reviewed-by: Martin Jones
(cherry picked from commit 3bc6f8d8dd630cd0298e27fc4b7430d2bf73a232)
Conflicts:
tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp
-rw-r--r-- | src/script/api/qscriptengine.cpp | 4 |
1 files changed, 1 insertions, 3 deletions
diff --git a/src/script/api/qscriptengine.cpp b/src/script/api/qscriptengine.cpp index 478fdaa..d3e5f2f 100644 --- a/src/script/api/qscriptengine.cpp +++ b/src/script/api/qscriptengine.cpp @@ -2762,9 +2762,7 @@ JSC::CallFrame *QScriptEnginePrivate::pushContext(JSC::CallFrame *exec, JSC::JSV if (!clearScopeChain) { newCallFrame->init(0, /*vPC=*/0, exec->scopeChain(), exec, flags | ShouldRestoreCallFrame, argc, callee); } else { - JSC::JSObject *jscObject = originalGlobalObject(); - JSC::ScopeChainNode *scn = new JSC::ScopeChainNode(0, jscObject, &exec->globalData(), exec->lexicalGlobalObject(), jscObject); - newCallFrame->init(0, /*vPC=*/0, scn, exec, flags | ShouldRestoreCallFrame, argc, callee); + newCallFrame->init(0, /*vPC=*/0, globalExec()->scopeChain(), exec, flags | ShouldRestoreCallFrame, argc, callee); } } else { setContextFlags(newCallFrame, flags); |