diff options
author | Simon Hausmann <simon.hausmann@qt.io> | 2016-06-03 13:44:24 +0200 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@qt.io> | 2016-06-03 13:24:14 +0000 |
commit | bfa87b7bd8f8fb94889fd99ee413e69bc17f9e81 (patch) | |
tree | 8adfbd2e25c06480be7e25c5b62d1f8fe6bd84d7 | |
parent | 8ea3763a22d4ae114eee0063ef1c3ce31ac1b44d (diff) |
Clean up property cache reference counting in QQmlVMEMetaObject
When the intercepting functionality of the VME meta-object was split into the
QQmlInterceptorMetaObject the property cache was moved as a member but the
manual refcounting remained in the QQmlVMEMetaObject constructor and
destructor. That's fragile and potential future sub-classes of the interceptor
would have to do the same refcounting. Instead let's just store a QQmlRefPointer
in the right place.
Similar logic applies to the QQmlDesignerMetaObject, which had a copy of the
property cache for now aparent reason.
Change-Id: I7f6d3917fc5ef1c4beb065525be10bb9c0fadcf3
Reviewed-by: Thomas Hartmann <Thomas.Hartmann@theqtcompany.com>
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
-rw-r--r-- | src/qml/qml/qqmlvmemetaobject.cpp | 4 | ||||
-rw-r--r-- | src/qml/qml/qqmlvmemetaobject_p.h | 2 | ||||
-rw-r--r-- | src/quick/designer/qqmldesignermetaobject.cpp | 19 | ||||
-rw-r--r-- | src/quick/designer/qqmldesignermetaobject_p.h | 1 |
4 files changed, 7 insertions, 19 deletions
diff --git a/src/qml/qml/qqmlvmemetaobject.cpp b/src/qml/qml/qqmlvmemetaobject.cpp index 8697a291e2..6907b26cd8 100644 --- a/src/qml/qml/qqmlvmemetaobject.cpp +++ b/src/qml/qml/qqmlvmemetaobject.cpp @@ -319,8 +319,6 @@ QQmlVMEMetaObject::QQmlVMEMetaObject(QObject *obj, ctxt(QQmlData::get(obj, true)->outerContext), aliasEndpoints(0), compilationUnit(qmlCompilationUnit), compiledObject(0) { - cache->addref(); - QQmlData::get(obj)->hasVMEMetaObject = true; if (compilationUnit && qmlObjectId >= 0) { @@ -345,8 +343,6 @@ QQmlVMEMetaObject::~QQmlVMEMetaObject() delete [] aliasEndpoints; qDeleteAll(varObjectGuards); - - cache->release(); } QV4::MemberData *QQmlVMEMetaObject::propertyAndMethodStorageAsMemberData() diff --git a/src/qml/qml/qqmlvmemetaobject_p.h b/src/qml/qml/qqmlvmemetaobject_p.h index 41f454eb62..5aa141d026 100644 --- a/src/qml/qml/qqmlvmemetaobject_p.h +++ b/src/qml/qml/qqmlvmemetaobject_p.h @@ -111,7 +111,7 @@ protected: public: QObject *object; - QQmlPropertyCache *cache; + QQmlRefPointer<QQmlPropertyCache> cache; QBiPointer<QDynamicMetaObjectData, const QMetaObject> parent; QQmlPropertyValueInterceptor *interceptors; diff --git a/src/quick/designer/qqmldesignermetaobject.cpp b/src/quick/designer/qqmldesignermetaobject.cpp index 23a29d5831..5e897218c5 100644 --- a/src/quick/designer/qqmldesignermetaobject.cpp +++ b/src/quick/designer/qqmldesignermetaobject.cpp @@ -120,13 +120,7 @@ void QQmlDesignerMetaObject::init(QObject *object, QQmlEngine *engine) QObjectPrivate *op = QObjectPrivate::get(object); op->metaObject = this; - m_cache = QQmlEnginePrivate::get(engine)->cache(this); - - if (m_cache != cache) { - m_cache->addref(); - cache->release(); - cache = m_cache; - } + cache = QQmlEnginePrivate::get(engine)->cache(this); nodeInstanceMetaObjectList.insert(this, true); hasAssignedMetaObjectData = true; @@ -135,8 +129,7 @@ void QQmlDesignerMetaObject::init(QObject *object, QQmlEngine *engine) QQmlDesignerMetaObject::QQmlDesignerMetaObject(QObject *object, QQmlEngine *engine) : QQmlVMEMetaObject(object, cacheForObject(object, engine), /*qml compilation unit*/nullptr, /*qmlObjectId*/-1), m_context(engine->contextForObject(object)), - m_data(new MetaPropertyData), - m_cache(0) + m_data(new MetaPropertyData) { init(object, engine); @@ -146,8 +139,8 @@ QQmlDesignerMetaObject::QQmlDesignerMetaObject(QObject *object, QQmlEngine *engi cache->setParent(ddata->propertyCache); cache->invalidate(engine, this); ddata->propertyCache->release(); - ddata->propertyCache = m_cache; - m_cache->addref(); + ddata->propertyCache = cache; + ddata->propertyCache->addref(); } } @@ -168,9 +161,9 @@ void QQmlDesignerMetaObject::createNewDynamicProperty(const QString &name) Q_UNUSED(id); //Updating cache - QQmlPropertyCache *oldParent = m_cache->parent(); + QQmlPropertyCache *oldParent = cache->parent(); QQmlEnginePrivate::get(m_context->engine())->cache(this)->invalidate(m_context->engine(), this); - m_cache->setParent(oldParent); + cache->setParent(oldParent); QQmlProperty property(myObject(), name, m_context); Q_ASSERT(property.isValid()); diff --git a/src/quick/designer/qqmldesignermetaobject_p.h b/src/quick/designer/qqmldesignermetaobject_p.h index a5402ccbc4..01512f6af0 100644 --- a/src/quick/designer/qqmldesignermetaobject_p.h +++ b/src/quick/designer/qqmldesignermetaobject_p.h @@ -101,7 +101,6 @@ private: QQmlOpenMetaObjectType *m_type; QScopedPointer<MetaPropertyData> m_data; //QAbstractDynamicMetaObject *m_parent; - QQmlPropertyCache *m_cache; friend class QQuickDesignerSupportProperties; }; |