aboutsummaryrefslogtreecommitdiffstats
path: root/src/declarative/qml/v8/qv8sequencewrapper_p_p.h
diff options
context:
space:
mode:
authorAaron Kennedy <aaron.kennedy@nokia.com>2011-11-28 16:04:33 +0000
committerQt by Nokia <qt-info@nokia.com>2011-12-05 15:33:30 +0100
commit5ac2990688c7da6ce872bccc5c08129267887d68 (patch)
tree4099c1f9e415dc3efda5ea97385a5a76824375c6 /src/declarative/qml/v8/qv8sequencewrapper_p_p.h
parent5c9179b19776808acecab4805b10932dc4f9511a (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.h45
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; \