QDeclarativePropertyCache::~QDeclarativePropertyCache()
{
clear();
-}
-void QDeclarativePropertyCache::clear()
-{
if (parent) parent->release();
parent = 0;
+}
- propertyIndexCacheStart = 0;
- methodIndexCacheStart = 0;
-
- propertyIndexCache.clear();
- methodIndexCache.clear();
- stringCache.clear();
+// This is inherited from QDeclarativeCleanup, so it should only clear the things
+// that are tied to the specific QDeclarativeEngine.
+void QDeclarativePropertyCache::clear()
+{
qPersistentDispose(constructor);
+ engine = 0;
}
QDeclarativePropertyCache::Data QDeclarativePropertyCache::create(const QMetaObject *metaObject,
{
Q_ASSERT(engine);
Q_ASSERT(metaObject);
-
- clear();
+ Q_ASSERT(stringCache.isEmpty());
// Optimization to prevent unnecessary reallocation of lists
propertyIndexCache.reserve(metaObject->propertyCount());
QDeclarativeEnginePrivate *ep = QDeclarativeEnginePrivate::get(engine);
QDeclarativeData *ddata = QDeclarativeData::get(obj);
- if (ddata && ddata->propertyCache && ddata->propertyCache->qmlEngine() == engine) // XXX aakenend
+ if (ddata && ddata->propertyCache)
cache = ddata->propertyCache;
if (!cache) {
cache = ep->cache(obj);
QDeclarativePropertyCache *cache = 0;
QDeclarativeData *ddata = QDeclarativeData::get(obj);
- if (ddata && ddata->propertyCache && ddata->propertyCache->qmlEngine() == engine)
+ if (ddata && ddata->propertyCache)
cache = ddata->propertyCache;
if (!cache) {
cache = enginePrivate->cache(obj);
#include <QDebug>
#include <QDeclarativeComponent>
#include <QDeclarativeNetworkAccessManagerFactory>
+#include <QDeclarativeExpression>
#ifdef Q_OS_SYMBIAN
// In Symbian OS test data is located in applications private dir
void clearComponentCache();
void outputWarningsToStandardError();
void objectOwnership();
+ void multipleEngines();
};
void tst_qdeclarativeengine::rootContext()
}
+// Test an object can be accessed by multiple engines
+void tst_qdeclarativeengine::multipleEngines()
+{
+ QObject o;
+ o.setObjectName("TestName");
+
+ // Simultaneous engines
+ {
+ QDeclarativeEngine engine1;
+ QDeclarativeEngine engine2;
+ engine1.rootContext()->setContextProperty("object", &o);
+ engine2.rootContext()->setContextProperty("object", &o);
+
+ QDeclarativeExpression expr1(engine1.rootContext(), 0, QString("object.objectName"));
+ QDeclarativeExpression expr2(engine2.rootContext(), 0, QString("object.objectName"));
+
+ QCOMPARE(expr1.evaluate().toString(), QString("TestName"));
+ QCOMPARE(expr2.evaluate().toString(), QString("TestName"));
+ }
+
+ // Serial engines
+ {
+ QDeclarativeEngine engine1;
+ engine1.rootContext()->setContextProperty("object", &o);
+ QDeclarativeExpression expr1(engine1.rootContext(), 0, QString("object.objectName"));
+ QCOMPARE(expr1.evaluate().toString(), QString("TestName"));
+ }
+ {
+ QDeclarativeEngine engine1;
+ engine1.rootContext()->setContextProperty("object", &o);
+ QDeclarativeExpression expr1(engine1.rootContext(), 0, QString("object.objectName"));
+ QCOMPARE(expr1.evaluate().toString(), QString("TestName"));
+ }
+}
+
QTEST_MAIN(tst_qdeclarativeengine)
#include "tst_qdeclarativeengine.moc"