diff options
author | Aaron Kennedy <aaron.kennedy@nokia.com> | 2011-11-28 16:04:33 +0000 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2011-12-05 15:33:30 +0100 |
commit | 5ac2990688c7da6ce872bccc5c08129267887d68 (patch) | |
tree | 4099c1f9e415dc3efda5ea97385a5a76824375c6 /src/declarative/qml/v8/qv8sequencewrapper_p_p.h | |
parent | 5c9179b19776808acecab4805b10932dc4f9511a (diff) |
Introduce more generic fast property handling
Also reduce the number of direct calls to qt_metacall().
Change-Id: I04cd6e516a3e61058548309a19fe0b830f15c93f
Reviewed-by: Roberto Raggi <roberto.raggi@nokia.com>
Diffstat (limited to 'src/declarative/qml/v8/qv8sequencewrapper_p_p.h')
-rw-r--r-- | src/declarative/qml/v8/qv8sequencewrapper_p_p.h | 45 |
1 files changed, 26 insertions, 19 deletions
diff --git a/src/declarative/qml/v8/qv8sequencewrapper_p_p.h b/src/declarative/qml/v8/qv8sequencewrapper_p_p.h index a947d52013..1861ea69e6 100644 --- a/src/declarative/qml/v8/qv8sequencewrapper_p_p.h +++ b/src/declarative/qml/v8/qv8sequencewrapper_p_p.h @@ -254,8 +254,7 @@ static QString convertUrlToString(QV8Engine *, const QUrl &v) if (objectType == QV8SequenceResource::Reference) { \ if (!object) \ return QVariant(); \ - void *a[] = { &c, 0 }; \ - QMetaObject::metacall(object, QMetaObject::ReadProperty, propertyIndex, a); \ + loadReference(); \ } \ return QVariant::fromValue<SequenceType>(c); \ } \ @@ -283,8 +282,7 @@ static QString convertUrlToString(QV8Engine *, const QUrl &v) if (objectType == QV8SequenceResource::Reference) { \ if (!object) \ return 0; \ - void *a[] = { &c, 0 }; \ - QMetaObject::metacall(object, QMetaObject::ReadProperty, propertyIndex, a); \ + loadReference(); \ } \ return c.count(); \ } \ @@ -335,8 +333,7 @@ static QString convertUrlToString(QV8Engine *, const QUrl &v) if (objectType == QV8SequenceResource::Reference) { \ if (!object) \ return v8::Undefined(); \ - void *a[] = { &c, 0 }; \ - QMetaObject::metacall(object, QMetaObject::ReadProperty, propertyIndex, a); \ + loadReference(); \ } \ /* modify the sequence */ \ SequenceElementType elementValue = ConversionFromV8fn(engine, value); \ @@ -353,13 +350,9 @@ static QString convertUrlToString(QV8Engine *, const QUrl &v) } \ c.append(elementValue); \ } \ - if (objectType == QV8SequenceResource::Reference) { \ - /* write back. already checked that object is non-null, so skip that check here. */ \ - int status = -1; \ - QDeclarativePropertyPrivate::WriteFlags flags = QDeclarativePropertyPrivate::DontRemoveBinding; \ - void *a[] = { &c, 0, &status, &flags }; \ - QMetaObject::metacall(object, QMetaObject::WriteProperty, propertyIndex, a); \ - } \ + /* write back. already checked that object is non-null, so skip that check here. */ \ + if (objectType == QV8SequenceResource::Reference) \ + storeReference(); \ return value; \ } \ v8::Handle<v8::Value> indexedGetter(quint32 index) \ @@ -367,8 +360,7 @@ static QString convertUrlToString(QV8Engine *, const QUrl &v) if (objectType == QV8SequenceResource::Reference) { \ if (!object) \ return v8::Undefined(); \ - void *a[] = { &c, 0 }; \ - QMetaObject::metacall(object, QMetaObject::ReadProperty, propertyIndex, a); \ + loadReference(); \ } \ quint32 count = c.count(); \ if (index < count) \ @@ -403,8 +395,7 @@ static QString convertUrlToString(QV8Engine *, const QUrl &v) if (objectType == QV8SequenceResource::Reference) { \ if (!object) \ return v8::Handle<v8::Array>(); \ - void *a[] = { &c, 0 }; \ - QMetaObject::metacall(object, QMetaObject::ReadProperty, propertyIndex, a); \ + loadReference(); \ } \ quint32 count = c.count(); \ v8::Local<v8::Array> retn = v8::Array::New(count); \ @@ -418,8 +409,7 @@ static QString convertUrlToString(QV8Engine *, const QUrl &v) if (objectType == QV8SequenceResource::Reference) { \ if (!object) \ return v8::Undefined(); \ - void *a[] = { &c, 0 }; \ - QMetaObject::metacall(object, QMetaObject::ReadProperty, propertyIndex, a); \ + loadReference(); \ } \ QString str; \ quint32 count = c.count(); \ @@ -429,6 +419,23 @@ static QString convertUrlToString(QV8Engine *, const QUrl &v) str.chop(1); \ return engine->toString(str); \ } \ + void loadReference() \ + { \ + Q_ASSERT(object); \ + Q_ASSERT(objectType == QV8SequenceResource::Reference); \ + void *a[] = { &c, 0 }; \ + QMetaObject::metacall(object, QMetaObject::ReadProperty, propertyIndex, a); \ + } \ + void storeReference() \ + { \ + Q_ASSERT(object); \ + Q_ASSERT(objectType == QV8SequenceResource::Reference); \ + int status = -1; \ + QDeclarativePropertyPrivate::WriteFlags flags = \ + QDeclarativePropertyPrivate::DontRemoveBinding; \ + void *a[] = { &c, 0, &status, &flags }; \ + QMetaObject::metacall(object, QMetaObject::WriteProperty, propertyIndex, a); \ + } \ private: \ QDeclarativeGuard<QObject> object; \ int propertyIndex; \ |