diff options
author | Jedrzej Nowacki <jedrzej.nowacki@nokia.com> | 2011-05-13 12:32:28 +0200 |
---|---|---|
committer | Jedrzej Nowacki <jedrzej.nowacki@nokia.com> | 2011-05-25 10:55:10 +0200 |
commit | 0c2df7df1efa698def81101e90cc04c9a6f7829a (patch) | |
tree | 9348b9c96fd31f0cd742340c95a067a1c4778424 | |
parent | 336a97ce81e362d5138c48f81421e4a43fce9e10 (diff) |
Fix QScriptEnginePrivate destructor.
All contexts should be destroyed before internal Isolate object.
Dispose m_scriptClassToStringTemplate in ~QScriptEnignePrivate
Add missing invalidation code for QScriptables and qt_dataId.
Reviewed-by: Olivier Goffart
Reviewed-by: Gabriel de Dietrich
-rw-r--r-- | src/script/api/qscriptengine.cpp | 32 |
1 files changed, 24 insertions, 8 deletions
diff --git a/src/script/api/qscriptengine.cpp b/src/script/api/qscriptengine.cpp index 201dca9..7620274 100644 --- a/src/script/api/qscriptengine.cpp +++ b/src/script/api/qscriptengine.cpp @@ -819,17 +819,33 @@ QScriptEnginePrivate::~QScriptEnginePrivate() invalidateAllScripts(); invalidateAllValues(); invalidateAllString(); + invalidateAllScriptable(); - // FIXME Do we really need to dispose all persistent handlers before context destruction? - m_variantTemplate.Dispose(); - m_metaObjectTemplate.Dispose(); - m_abortResult.Dispose(); + { // destroy all connection to JS values + QHash<const QObject *, v8::Persistent<v8::Object> >::const_iterator i = m_connectedObjects.constBegin(); + for(; i != m_connectedObjects.constEnd(); ++i) { + // we use const_iterator which would block us form calling Dispose + v8::Persistent<v8::Object>(i.value()).Dispose(); + } + m_connectedObjects.clear(); + } + + { // destroy all templates for different classes + m_variantTemplate.Dispose(); + m_metaObjectTemplate.Dispose(); - ClassTemplateHash::iterator i = m_qtClassTemplates.begin(); - for (; i != m_qtClassTemplates.end(); ++i) { - (*i).Dispose(); + ClassTemplateHash::iterator i = m_qtClassTemplates.begin(); + for (; i != m_qtClassTemplates.end(); ++i) { + (*i).Dispose(); + } + m_qtClassTemplates.clear(); + m_scriptClassToStringTemplate.Dispose(); + m_qobjectBaseTemplate.Dispose(); } - m_qobjectBaseTemplate.Dispose(); + + m_abortResult.Dispose(); + m_qtDataId.Dispose(); + m_baseQsContext.reset(); m_typeInfos.clear(); clearExceptions(); |