Faster check for revisioned properties.
authorMartin Jones <martin.jones@nokia.com>
Fri, 22 Jul 2011 07:23:16 +0000 (17:23 +1000)
committerQt by Nokia <qt-info@nokia.com>
Tue, 30 Aug 2011 11:18:28 +0000 (13:18 +0200)
Change-Id: I8122c15d0467019bcd333ca111d2b248c5ca2d91
Reviewed-on: http://codereview.qt.nokia.com/3774
Reviewed-by: Roberto Raggi <roberto.raggi@nokia.com>
Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com>

src/declarative/qml/qdeclarativemetatype.cpp

index 97b0391..a084bd3 100644 (file)
@@ -52,6 +52,8 @@
 #include <QtCore/qmetaobject.h>
 #include <QtCore/qbitarray.h>
 #include <QtCore/qreadwritelock.h>
+#include <QtCore/private/qmetaobject_p.h>
+
 #include <qmetatype.h>
 #include <qobjectdefs.h>
 #include <qdatetime.h>
@@ -398,6 +400,24 @@ static void clone(QMetaObjectBuilder &builder, const QMetaObject *mo,
     }
 }
 
+static bool isPropertyRevisioned(const QMetaObject *mo, int index)
+{
+    int i = index;
+    i -= mo->propertyOffset();
+    if (i < 0 && mo->d.superdata)
+        return isPropertyRevisioned(mo->d.superdata, index);
+
+    const QMetaObjectPrivate *mop = reinterpret_cast<const QMetaObjectPrivate*>(mo->d.data);
+    if (i >= 0 && i < mop->propertyCount) {
+        int handle = mop->propertyData + 3*i;
+        int flags = mo->d.data[handle + 2];
+
+        return (flags & Revisioned);
+    }
+
+    return false;
+}
+
 void QDeclarativeTypePrivate::init() const
 {
     if (m_isSetup) return;
@@ -451,7 +471,7 @@ void QDeclarativeTypePrivate::init() const
             mo = m_metaObjects.first().metaObject;
 
         for (int ii = 0; !m_containsRevisionedAttributes && ii < mo->propertyCount(); ++ii) {
-            if (mo->property(ii).revision() != 0)
+            if (isPropertyRevisioned(mo, ii))
                 m_containsRevisionedAttributes = true;
         }