summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJedrzej Nowacki <jedrzej.nowacki@nokia.com>2011-05-13 12:32:28 +0200
committerJedrzej Nowacki <jedrzej.nowacki@nokia.com>2011-05-25 10:55:10 +0200
commit0c2df7df1efa698def81101e90cc04c9a6f7829a (patch)
tree9348b9c96fd31f0cd742340c95a067a1c4778424
parent336a97ce81e362d5138c48f81421e4a43fce9e10 (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.cpp32
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();