void QQmlEnginePrivate::typeUnloaded(QQmlTypeData *typeData)
{
- unregisterCompositeType(typeData->compiledData()->root);
+ if (typeData && typeData->compiledData()) {
+ const QMetaObject *mo = typeData->compiledData()->root;
+ if (QQmlPropertyCache *pc = propertyCache.value(mo)) {
+ propertyCache.remove(mo);
+ pc->release();
+ }
+ unregisterCompositeType(mo);
+ }
}
bool QQmlEnginePrivate::isTypeLoaded(const QUrl &url) const
if (!typeData) {
typeData = new QQmlTypeData(url, None, this);
+ // TODO: if (compiledData == 0), is it safe to omit this insertion?
m_typeCache.insert(url, typeData);
QQmlDataLoader::load(typeData, mode);
}
TypeCache::Iterator iter = unneededTypes.last();
unneededTypes.removeLast();
+ QQmlTypeData *typeData = iter.value();
if (callback)
- (*callback)(arg, iter.value());
-
+ (*callback)(arg, typeData);
m_typeCache.erase(iter);
- iter.value()->release();
+ typeData->release();
}
}
void clearComponentCache();
void trimComponentCache();
void trimComponentCache_data();
+ void repeatedCompilation();
+ void failedCompilation();
+ void failedCompilation_data();
void outputWarningsToStandardError();
void objectOwnership();
void multipleEngines();
QTest::newRow("ScriptComponent") << "testScriptComponent.qml";
}
+void tst_qqmlengine::repeatedCompilation()
+{
+ QQmlEngine engine;
+
+ for (int i = 0; i < 100; ++i) {
+ engine.collectGarbage();
+ engine.trimComponentCache();
+
+ QQmlComponent component(&engine, testFileUrl("repeatedCompilation.qml"));
+ QVERIFY(component.isReady());
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object != 0);
+ QCOMPARE(object->property("success").toBool(), true);
+ }
+}
+
+void tst_qqmlengine::failedCompilation()
+{
+ QFETCH(QString, file);
+
+ QQmlEngine engine;
+
+ QQmlComponent component(&engine, testFileUrl(file));
+ QVERIFY(!component.isReady());
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object == 0);
+
+ engine.collectGarbage();
+ engine.trimComponentCache();
+ engine.clearComponentCache();
+}
+
+void tst_qqmlengine::failedCompilation_data()
+{
+ QTest::addColumn<QString>("file");
+
+ QTest::newRow("Invalid URL") << "failedCompilation.does.not.exist.qml";
+ QTest::newRow("Invalid content") << "failedCompilation.1.qml";
+}
+
static QStringList warnings;
static void msgHandler(QtMsgType, const char *warning)
{