diff options
author | Thomas Hartmann <Thomas.Hartmann@theqtcompany.com> | 2016-04-18 11:52:48 +0200 |
---|---|---|
committer | Tim Jenssen <tim.jenssen@theqtcompany.com> | 2016-04-18 18:22:00 +0000 |
commit | cf28f909da1145b8f4fbb92a3bf8353d5f397f97 (patch) | |
tree | cc67ac54c2f8c5dc35f13d694f0e86af8c01041b /src/quick/designer/qqmldesignermetaobject.cpp | |
parent | 35e2f29cde8dc8280b5ce1986533fca63f902d5e (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/qqmldesignermetaobject.cpp')
-rw-r--r-- | src/quick/designer/qqmldesignermetaobject.cpp | 17 |
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); } |