From 4fe8f2ab89ace6e617a81c5e8568c3830135da20 Mon Sep 17 00:00:00 2001 From: Aaron Kennedy Date: Wed, 23 Dec 2009 14:17:55 +1000 Subject: Stop using QGuard This should allow QGuard to be removed from Qt and QObjectPrivate::ExtraData. Having QmlGuard inside QmlDeclarativeData reduces the number of new's, and creating QmlDeclarativeData is faster than QObjectPrivate::ExtraData anyway. --- .../graphicsitems/qmlgraphicsvisualitemmodel.cpp | 10 +++--- src/declarative/qml/qmlbindingvme_p.h | 3 +- src/declarative/qml/qmlcontext_p.h | 6 ++-- src/declarative/qml/qmlcontextscriptclass.cpp | 5 +-- src/declarative/qml/qmldeclarativedata_p.h | 36 ++++++++++++++++++---- src/declarative/qml/qmlengine.cpp | 20 ++++++------ src/declarative/qml/qmlexpression_p.h | 9 +++--- src/declarative/qml/qmllistscriptclass.cpp | 3 +- src/declarative/qml/qmlmetaproperty_p.h | 3 +- src/declarative/qml/qmlobjectscriptclass.cpp | 5 ++- src/declarative/qml/qmlvaluetypescriptclass.cpp | 3 +- src/declarative/qml/qmlvmemetaobject_p.h | 4 ++- src/declarative/util/qmlpropertychanges.cpp | 3 +- src/declarative/util/qmlstate_p_p.h | 6 ++-- src/declarative/util/qmlstateoperations.cpp | 5 +-- 15 files changed, 78 insertions(+), 43 deletions(-) diff --git a/src/declarative/graphicsitems/qmlgraphicsvisualitemmodel.cpp b/src/declarative/graphicsitems/qmlgraphicsvisualitemmodel.cpp index 017a60c..b482db7 100644 --- a/src/declarative/graphicsitems/qmlgraphicsvisualitemmodel.cpp +++ b/src/declarative/graphicsitems/qmlgraphicsvisualitemmodel.cpp @@ -52,6 +52,7 @@ #include #include #include +#include #include #include @@ -60,7 +61,6 @@ #include #include -#include QML_DECLARE_TYPE(QListModelInterface) @@ -277,9 +277,9 @@ public: return static_cast(QObjectPrivate::get(m)); } - QGuard m_listModelInterface; - QGuard m_abstractItemModel; - QGuard m_visualItemModel; + QmlGuard m_listModelInterface; + QmlGuard m_abstractItemModel; + QmlGuard m_visualItemModel; QString m_part; QmlComponent *m_delegate; @@ -434,7 +434,7 @@ Q_SIGNALS: private: friend class QmlGraphicsVisualDataModelDataMetaObject; int m_index; - QGuard m_model; + QmlGuard m_model; QmlGraphicsVisualDataModelDataMetaObject *m_meta; }; diff --git a/src/declarative/qml/qmlbindingvme_p.h b/src/declarative/qml/qmlbindingvme_p.h index ceaf2b3..4ef7d04 100644 --- a/src/declarative/qml/qmlbindingvme_p.h +++ b/src/declarative/qml/qmlbindingvme_p.h @@ -56,6 +56,7 @@ #include #include #include +#include "qmlguard_p.h" QT_BEGIN_HEADER @@ -73,7 +74,7 @@ public: int targetSlot; struct Subscription { - QGuard source; + QmlGuard source; int notifyIndex; }; Subscription *subscriptions; diff --git a/src/declarative/qml/qmlcontext_p.h b/src/declarative/qml/qmlcontext_p.h index 25f5600..bc8c357 100644 --- a/src/declarative/qml/qmlcontext_p.h +++ b/src/declarative/qml/qmlcontext_p.h @@ -65,7 +65,7 @@ #include #include -#include +#include "qmlguard_p.h" QT_BEGIN_NAMESPACE @@ -112,13 +112,13 @@ public: QmlDeclarativeData *contextObjects; - struct ContextGuard : public QGuard + struct ContextGuard : public QmlGuard { ContextGuard() : priv(0), bindings(0) {} QmlContextPrivate *priv; QmlBinding_Id *bindings; ContextGuard &operator=(QObject *obj) { - (QGuard&)*this = obj; return *this; + (QmlGuard&)*this = obj; return *this; } void objectDestroyed(QObject *) { priv->destroyed(this); } }; diff --git a/src/declarative/qml/qmlcontextscriptclass.cpp b/src/declarative/qml/qmlcontextscriptclass.cpp index 54a5ca3..588a397 100644 --- a/src/declarative/qml/qmlcontextscriptclass.cpp +++ b/src/declarative/qml/qmlcontextscriptclass.cpp @@ -44,14 +44,15 @@ #include "qmlengine_p.h" #include "qmlcontext_p.h" #include "qmltypenamescriptclass_p.h" +#include "qmlguard_p.h" QT_BEGIN_NAMESPACE struct ContextData : public QScriptDeclarativeClass::Object { ContextData() : isSharedContext(true) {} ContextData(QmlContext *c, QObject *o) : context(c), scopeObject(o), isSharedContext(false) {} - QGuard context; - QGuard scopeObject; + QmlGuard context; + QmlGuard scopeObject; bool isSharedContext; QmlContext *getContext(QmlEngine *engine) { diff --git a/src/declarative/qml/qmldeclarativedata_p.h b/src/declarative/qml/qmldeclarativedata_p.h index bdbb5c8..21111dd 100644 --- a/src/declarative/qml/qmldeclarativedata_p.h +++ b/src/declarative/qml/qmldeclarativedata_p.h @@ -54,8 +54,8 @@ // #include - #include +#include "qmlguard_p.h" QT_BEGIN_NAMESPACE @@ -66,7 +66,11 @@ class QmlPropertyCache; class QmlDeclarativeData : public QDeclarativeData { public: - QmlDeclarativeData(QmlContext *context = 0); + QmlDeclarativeData(QmlContext *ctxt = 0) + : context(ctxt), bindings(0), nextContextObject(0), prevContextObject(0), + bindingBitsSize(0), bindingBits(0), outerContext(0), lineNumber(0), + columnNumber(0), deferredComponent(0), deferredIdx(0), attachedProperties(0), + propertyCache(0), guards(0) {} virtual void destroyed(QObject *); @@ -95,12 +99,13 @@ public: QScriptValue scriptValue; QmlPropertyCache *propertyCache; + QmlGuard *guards; + static QmlDeclarativeData *get(const QObject *object, bool create = false) { - QObjectPrivate *priv = - QObjectPrivate::get(const_cast(object)); - if (priv && priv->declarativeData) { + QObjectPrivate *priv = QObjectPrivate::get(const_cast(object)); + if (priv->declarativeData) { return static_cast(priv->declarativeData); - } else if (create && priv) { + } else if (create) { priv->declarativeData = new QmlDeclarativeData; return static_cast(priv->declarativeData); } else { @@ -109,6 +114,25 @@ public: } }; +template +void QmlGuard::addGuard() +{ + QmlDeclarativeData *data = QmlDeclarativeData::get(o, true); + next = data->guards; + if (next) reinterpret_cast *>(next)->prev = &next; + data->guards = reinterpret_cast *>(this); + prev = &data->guards; +} + +template +void QmlGuard::remGuard() +{ + if (next) reinterpret_cast *>(next)->prev = prev; + *prev = next; + next = 0; + prev = 0; +} + QT_END_NAMESPACE #endif // QMLDECLARATIVEDATA_P_H diff --git a/src/declarative/qml/qmlengine.cpp b/src/declarative/qml/qmlengine.cpp index 988962b..0e9b7c4 100644 --- a/src/declarative/qml/qmlengine.cpp +++ b/src/declarative/qml/qmlengine.cpp @@ -549,15 +549,7 @@ QObject *qmlAttachedPropertiesObjectById(int id, const QObject *object, bool cre return rv; } -QmlDeclarativeData::QmlDeclarativeData(QmlContext *ctxt) -: context(ctxt), bindings(0), nextContextObject(0), prevContextObject(0), - bindingBitsSize(0), bindingBits(0), outerContext(0), lineNumber(0), - columnNumber(0), deferredComponent(0), deferredIdx(0), attachedProperties(0), - propertyCache(0) -{ -} - -void QmlDeclarativeData::destroyed(QObject * /*object*/) +void QmlDeclarativeData::destroyed(QObject *object) { if (deferredComponent) deferredComponent->release(); @@ -584,6 +576,16 @@ void QmlDeclarativeData::destroyed(QObject * /*object*/) if (propertyCache) propertyCache->release(); + QmlGuard *guard = guards; + while (guard) { + QmlGuard *g = guard; + guard = guard->next; + g->o = 0; + g->prev = 0; + g->next = 0; + g->objectDestroyed(object); + } + delete this; } diff --git a/src/declarative/qml/qmlexpression_p.h b/src/declarative/qml/qmlexpression_p.h index 57a3ce2..3f87b2f 100644 --- a/src/declarative/qml/qmlexpression_p.h +++ b/src/declarative/qml/qmlexpression_p.h @@ -57,11 +57,10 @@ #include "qmlbasicscript_p.h" #include "qmlengine_p.h" +#include "qmlguard_p.h" #include -#include - QT_BEGIN_NAMESPACE class QmlAbstractExpression @@ -109,15 +108,15 @@ public: QString url; // This is a QString for a reason. QUrls are slooooooow... int line; - struct SignalGuard : public QGuard { + struct SignalGuard : public QmlGuard { SignalGuard() : isDuplicate(false), notifyIndex(-1) {} SignalGuard &operator=(QObject *obj) { - QGuard::operator=(obj); + QmlGuard::operator=(obj); return *this; } SignalGuard &operator=(const SignalGuard &o) { - QGuard::operator=(o); + QmlGuard::operator=(o); isDuplicate = o.isDuplicate; notifyIndex = o.notifyIndex; return *this; diff --git a/src/declarative/qml/qmllistscriptclass.cpp b/src/declarative/qml/qmllistscriptclass.cpp index d93498d..f5ff2c0 100644 --- a/src/declarative/qml/qmllistscriptclass.cpp +++ b/src/declarative/qml/qmllistscriptclass.cpp @@ -42,11 +42,12 @@ #include "qmllistscriptclass_p.h" #include "qmlengine_p.h" +#include "qmlguard_p.h" QT_BEGIN_NAMESPACE struct ListData : public QScriptDeclarativeClass::Object { - QGuard object; + QmlGuard object; int propertyIdx; QmlListScriptClass::ListType type; }; diff --git a/src/declarative/qml/qmlmetaproperty_p.h b/src/declarative/qml/qmlmetaproperty_p.h index b4d72bb..97b5208 100644 --- a/src/declarative/qml/qmlmetaproperty_p.h +++ b/src/declarative/qml/qmlmetaproperty_p.h @@ -56,6 +56,7 @@ #include "qmlmetaproperty.h" #include "qmlpropertycache_p.h" +#include "qmlguard_p.h" #include @@ -77,7 +78,7 @@ public: QmlMetaProperty *q; QmlContext *context; - QGuard object; + QmlGuard object; bool isDefaultProperty:1; bool isNameCached:1; diff --git a/src/declarative/qml/qmlobjectscriptclass.cpp b/src/declarative/qml/qmlobjectscriptclass.cpp index 4488ba1..7f95b8f 100644 --- a/src/declarative/qml/qmlobjectscriptclass.cpp +++ b/src/declarative/qml/qmlobjectscriptclass.cpp @@ -47,16 +47,15 @@ #include "qmltypenamescriptclass_p.h" #include "qmllistscriptclass_p.h" #include "qmlbinding.h" +#include "qmlguard_p.h" #include -#include - QT_BEGIN_NAMESPACE struct ObjectData : public QScriptDeclarativeClass::Object { ObjectData(QObject *o, int t) : object(o), type(t) {} - QGuard object; + QmlGuard object; int type; }; diff --git a/src/declarative/qml/qmlvaluetypescriptclass.cpp b/src/declarative/qml/qmlvaluetypescriptclass.cpp index 57f999f..78580e3 100644 --- a/src/declarative/qml/qmlvaluetypescriptclass.cpp +++ b/src/declarative/qml/qmlvaluetypescriptclass.cpp @@ -42,12 +42,13 @@ #include "qmlvaluetypescriptclass_p.h" #include "qmlengine_p.h" +#include "qmlguard_p.h" QT_BEGIN_NAMESPACE struct QmlValueTypeReference : public QScriptDeclarativeClass::Object { QmlValueType *type; - QGuard object; + QmlGuard object; int property; }; diff --git a/src/declarative/qml/qmlvmemetaobject_p.h b/src/declarative/qml/qmlvmemetaobject_p.h index e737721..462f652 100644 --- a/src/declarative/qml/qmlvmemetaobject_p.h +++ b/src/declarative/qml/qmlvmemetaobject_p.h @@ -61,6 +61,8 @@ #include +#include "qmlguard_p.h" + QT_BEGIN_NAMESPACE #define QML_ALIAS_FLAG_PTR 0x00000001 @@ -118,7 +120,7 @@ protected: private: QObject *object; QmlRefCount *ref; - QGuard ctxt; + QmlGuard ctxt; const QmlVMEMetaData *metaData; int propOffset; diff --git a/src/declarative/util/qmlpropertychanges.cpp b/src/declarative/util/qmlpropertychanges.cpp index 48e026e..18f32ff 100644 --- a/src/declarative/util/qmlpropertychanges.cpp +++ b/src/declarative/util/qmlpropertychanges.cpp @@ -49,6 +49,7 @@ #include #include #include +#include #include @@ -127,7 +128,7 @@ public: QmlExpression *expression; QmlExpression *reverseExpression; QmlExpression *rewindExpression; - QGuard ownedExpression; + QmlGuard ownedExpression; virtual void execute() { ownedExpression = property.setSignalExpression(expression); diff --git a/src/declarative/util/qmlstate_p_p.h b/src/declarative/util/qmlstate_p_p.h index 04c5264..0ae72cd 100644 --- a/src/declarative/util/qmlstate_p_p.h +++ b/src/declarative/util/qmlstate_p_p.h @@ -58,6 +58,8 @@ #include "qmlanimation_p_p.h" #include "qmltransitionmanager_p_p.h" +#include + #include QT_BEGIN_NAMESPACE @@ -106,9 +108,9 @@ public: QmlBinding *when; class OperationList; - struct OperationGuard : public QGuard + struct OperationGuard : public QmlGuard { - OperationGuard(QObject *obj, OperationList *l) : list(l) { (QGuard&)*this = obj; } + OperationGuard(QObject *obj, OperationList *l) : list(l) { (QmlGuard&)*this = obj; } OperationList *list; void objectDestroyed(QmlStateOperation *) { // we assume priv will always be destroyed after objectDestroyed calls diff --git a/src/declarative/util/qmlstateoperations.cpp b/src/declarative/util/qmlstateoperations.cpp index ebbb5ee..df25e5b 100644 --- a/src/declarative/util/qmlstateoperations.cpp +++ b/src/declarative/util/qmlstateoperations.cpp @@ -47,6 +47,7 @@ #include #include #include +#include #include #include @@ -65,8 +66,8 @@ public: QmlGraphicsItem *target; QmlGraphicsItem *parent; - QGuard origParent; - QGuard origStackBefore; + QmlGuard origParent; + QmlGuard origStackBefore; QmlGraphicsItem *rewindParent; QmlGraphicsItem *rewindStackBefore; -- cgit v0.12