aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/qml/qqmlvmemetaobject.cpp
diff options
context:
space:
mode:
authorAaron Kennedy <aaron.kennedy@nokia.com>2012-05-14 11:12:00 +0100
committerQt by Nokia <qt-info@nokia.com>2012-05-15 17:33:43 +0200
commit9e0b57b9a94c82d747e36260115050d912d6f576 (patch)
tree69f905d28fa150e53bace282250cc00ef488e94d /src/qml/qml/qqmlvmemetaobject.cpp
parent13c7ee8def0822aeffecbb0753a2ffec62d898f0 (diff)
More efficient property interceptor implementation
The initial implementation vastly overestimated the number of interceptors that would exist. Change-Id: Ieddc55306e5976a9373a2b468013936240228992 Reviewed-by: Michael Brasser <michael.brasser@nokia.com>
Diffstat (limited to 'src/qml/qml/qqmlvmemetaobject.cpp')
-rw-r--r--src/qml/qml/qqmlvmemetaobject.cpp26
1 files changed, 13 insertions, 13 deletions
diff --git a/src/qml/qml/qqmlvmemetaobject.cpp b/src/qml/qml/qqmlvmemetaobject.cpp
index 001ed790d3..01a4737e2f 100644
--- a/src/qml/qml/qqmlvmemetaobject.cpp
+++ b/src/qml/qml/qqmlvmemetaobject.cpp
@@ -487,7 +487,7 @@ QQmlVMEMetaObject::QQmlVMEMetaObject(QObject *obj,
: QV8GCCallback::Node(GcPrologueCallback), object(obj), compiledData(cdata),
ctxt(QQmlData::get(obj, true)->outerContext), metaData(meta), data(0),
aliasEndpoints(0), firstVarPropertyIndex(-1), varPropertiesInitialized(false),
- v8methods(0), parent(0)
+ interceptors(0), v8methods(0), parent(0)
{
compiledData->addref();
@@ -540,14 +540,14 @@ QQmlVMEMetaObject::~QQmlVMEMetaObject()
int QQmlVMEMetaObject::metaCall(QMetaObject::Call c, int _id, void **a)
{
int id = _id;
- if(c == QMetaObject::WriteProperty) {
- int flags = *reinterpret_cast<int*>(a[3]);
- if (!(flags & QQmlPropertyPrivate::BypassInterceptor)
- && !aInterceptors.isEmpty()
- && aInterceptors.testBit(id)) {
- QPair<int, QQmlPropertyValueInterceptor*> pair = interceptors.value(id);
- int valueIndex = pair.first;
- QQmlPropertyValueInterceptor *vi = pair.second;
+ if (c == QMetaObject::WriteProperty && interceptors &&
+ !(*reinterpret_cast<int*>(a[3]) & QQmlPropertyPrivate::BypassInterceptor)) {
+
+ for (QQmlPropertyValueInterceptor *vi = interceptors; vi; vi = vi->m_next) {
+ if (vi->m_coreIndex != id)
+ continue;
+
+ int valueIndex = vi->m_valueTypeCoreIndex;
int type = property(id).userType();
if (type != QVariant::Invalid) {
@@ -1000,10 +1000,10 @@ void QQmlVMEMetaObject::list_clear(QQmlListProperty<QObject> *prop)
void QQmlVMEMetaObject::registerInterceptor(int index, int valueIndex, QQmlPropertyValueInterceptor *interceptor)
{
- if (aInterceptors.isEmpty())
- aInterceptors.resize(propertyCount() + metaData->propertyCount);
- aInterceptors.setBit(index);
- interceptors.insert(index, qMakePair(valueIndex, interceptor));
+ interceptor->m_coreIndex = index;
+ interceptor->m_valueTypeCoreIndex = valueIndex;
+ interceptor->m_next = interceptors;
+ interceptors = interceptor;
}
int QQmlVMEMetaObject::vmeMethodLineNumber(int index)