aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/designer
diff options
context:
space:
mode:
authorThomas Hartmann <Thomas.Hartmann@theqtcompany.com>2016-04-18 11:52:48 +0200
committerTim Jenssen <tim.jenssen@theqtcompany.com>2016-04-18 18:22:00 +0000
commitcf28f909da1145b8f4fbb92a3bf8353d5f397f97 (patch)
treecc67ac54c2f8c5dc35f13d694f0e86af8c01041b /src/quick/designer
parent35e2f29cde8dc8280b5ce1986533fca63f902d5e (diff)
QQmlDesignerMetaObject: Fixing reference counting
We have to overwrite the cache of QQmlInterceptorMetaObject, but we messed up the reference counting. The same applies for QQmlData. When overwriting the old cache we have to call release on the old cache and increase the reference count on the new cache, because it is released in the destructors of QmlData and QQmlInterceptorMetaObject. Change-Id: Iecdbe8d474092906344d4e5a74278f5d8120b5ef Reviewed-by: Tim Jenssen <tim.jenssen@theqtcompany.com> Reviewed-by: Simon Hausmann <simon.hausmann@theqtcompany.com>
Diffstat (limited to 'src/quick/designer')
-rw-r--r--src/quick/designer/qqmldesignermetaobject.cpp17
1 files changed, 10 insertions, 7 deletions
diff --git a/src/quick/designer/qqmldesignermetaobject.cpp b/src/quick/designer/qqmldesignermetaobject.cpp
index 76c94b242d..9ee814e1a6 100644
--- a/src/quick/designer/qqmldesignermetaobject.cpp
+++ b/src/quick/designer/qqmldesignermetaobject.cpp
@@ -134,9 +134,13 @@ void QQmlDesignerMetaObject::init(QObject *object, QQmlEngine *engine)
QObjectPrivate *op = QObjectPrivate::get(object);
op->metaObject = this;
- //create cache
- cache = m_cache = QQmlEnginePrivate::get(engine)->cache(this);
- cache->addref();
+ m_cache = QQmlEnginePrivate::get(engine)->cache(this);
+
+ if (m_cache != cache) {
+ m_cache->addref();
+ cache->release();
+ cache = m_cache;
+ }
//If our parent is not a VMEMetaObject we just se the flag to false again
if (constructedMetaData(metaData))
@@ -160,17 +164,16 @@ QQmlDesignerMetaObject::QQmlDesignerMetaObject(QObject *object, QQmlEngine *engi
if (ddata && ddata->propertyCache) {
cache->setParent(ddata->propertyCache);
cache->invalidate(engine, this);
+ ddata->propertyCache->release();
ddata->propertyCache = m_cache;
+ m_cache->addref();
}
}
QQmlDesignerMetaObject::~QQmlDesignerMetaObject()
{
- if (cache->count() > 1) // qml is crashing because the property cache is not removed from the engine
- cache->release();
- else
- m_type->release();
+ m_type->release();
nodeInstanceMetaObjectList.remove(this);
}