diff options
author | Aaron Kennedy <aaron.kennedy@nokia.com> | 2011-06-14 16:17:39 +1000 |
---|---|---|
committer | Aaron Kennedy <aaron.kennedy@nokia.com> | 2011-06-14 16:17:39 +1000 |
commit | 3ad5beee4c3fbbc855b84c8982c5458d634f1dee (patch) | |
tree | 7ddf1bcf379a16185c1c52f53bb689767122c1e9 /src/declarative/qml/qdeclarativepropertycache.cpp | |
parent | 7456055c2df733dbbe2ca5967f512c2555ca31d4 (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.cpp | 19 |
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 |