aboutsummaryrefslogtreecommitdiffstats
path: root/src/declarative/qml/qdeclarativepropertycache.cpp
diff options
context:
space:
mode:
authorAaron Kennedy <aaron.kennedy@nokia.com>2011-06-14 16:17:39 +1000
committerAaron Kennedy <aaron.kennedy@nokia.com>2011-06-14 16:17:39 +1000
commit3ad5beee4c3fbbc855b84c8982c5458d634f1dee (patch)
tree7ddf1bcf379a16185c1c52f53bb689767122c1e9 /src/declarative/qml/qdeclarativepropertycache.cpp
parent7456055c2df733dbbe2ca5967f512c2555ca31d4 (diff)
Performance improvements
There are two main changes here. First, where possible, we mark properties as "IsDirect" which means that they exist in a C++ QMetaObject (as opposed to a dynamic meta object), which allows us to call QObject::qt_metacall() directly, bypassing any dynamic meta object stuff. The second change is to use an ascii string comparator in V8 where possible. V8 stores ASCII string internally as ASCII strings, and asking it to compare them to a UTF16 string requires a conversion.
Diffstat (limited to 'src/declarative/qml/qdeclarativepropertycache.cpp')
-rw-r--r--src/declarative/qml/qdeclarativepropertycache.cpp19
1 files changed, 19 insertions, 0 deletions
diff --git a/src/declarative/qml/qdeclarativepropertycache.cpp b/src/declarative/qml/qdeclarativepropertycache.cpp
index ace76166ee..6a4cf4f710 100644
--- a/src/declarative/qml/qdeclarativepropertycache.cpp
+++ b/src/declarative/qml/qdeclarativepropertycache.cpp
@@ -44,6 +44,9 @@
#include "private/qdeclarativeengine_p.h"
#include "private/qdeclarativebinding_p.h"
#include "private/qv8engine_p.h"
+
+#include <private/qmetaobject_p.h>
+
#include <QtCore/qdebug.h>
Q_DECLARE_METATYPE(QScriptValue)
@@ -252,6 +255,8 @@ void QDeclarativePropertyCache::append(QDeclarativeEngine *engine, const QMetaOb
qPersistentDispose(constructor); // Now invalid
+ bool dynamicMetaObject = isDynamicMetaObject(metaObject);
+
allowedRevisionCache.append(0);
QDeclarativeEnginePrivate *enginePriv = QDeclarativeEnginePrivate::get(engine);
@@ -279,6 +284,9 @@ void QDeclarativePropertyCache::append(QDeclarativeEngine *engine, const QMetaOb
else if (m.methodType() == QMetaMethod::Signal)
data->flags |= signalFlags;
+ if (!dynamicMetaObject)
+ data->flags |= Data::IsDirect;
+
data->metaObjectOffset = allowedRevisionCache.count() - 1;
if (stringCache.contains(methodName)) {
@@ -312,6 +320,9 @@ void QDeclarativePropertyCache::append(QDeclarativeEngine *engine, const QMetaOb
data->load(p, engine);
data->flags |= propertyFlags;
+ if (!dynamicMetaObject)
+ data->flags |= Data::IsDirect;
+
data->metaObjectOffset = allowedRevisionCache.count() - 1;
if (stringCache.contains(propName)) {
@@ -477,4 +488,12 @@ QDeclarativePropertyCache::property(QDeclarativeEngine *engine, QObject *obj,
return rv;
}
+static inline const QMetaObjectPrivate *priv(const uint* data)
+{ return reinterpret_cast<const QMetaObjectPrivate*>(data); }
+
+bool QDeclarativePropertyCache::isDynamicMetaObject(const QMetaObject *mo)
+{
+ return priv(mo->d.data)->revision >= 3 && priv(mo->d.data)->flags & DynamicMetaObject;
+}
+
QT_END_NAMESPACE