aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/qml/qqmlvmemetaobject.cpp
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@theqtcompany.com>2015-08-10 13:39:32 +0200
committerSimon Hausmann <simon.hausmann@theqtcompany.com>2015-08-18 20:27:11 +0000
commit6cd0001054faa9c7c20dcd5e9c7512367b2c1f5f (patch)
tree3d7468705795b5bb52ea629f4f59312ba9f0d979 /src/qml/qml/qqmlvmemetaobject.cpp
parent0ed9784082b1e21cd8fcc49ef4afbe52af3fdef4 (diff)
Get rid of special handling of var properties
These can be handled in a simple way now by using a special propertyType value indicating that we have a var property. Also remove the additional write calls in the different readProperty implementations. If the stored data doesn't match, we can simply return the default value directly. Change-Id: I3823a971df24bd78f0acdc4c0042776277b3c55f Reviewed-by: Simon Hausmann <simon.hausmann@theqtcompany.com>
Diffstat (limited to 'src/qml/qml/qqmlvmemetaobject.cpp')
-rw-r--r--src/qml/qml/qqmlvmemetaobject.cpp84
1 files changed, 26 insertions, 58 deletions
diff --git a/src/qml/qml/qqmlvmemetaobject.cpp b/src/qml/qml/qqmlvmemetaobject.cpp
index 08c5ed4f9e..ab3303769f 100644
--- a/src/qml/qml/qqmlvmemetaobject.cpp
+++ b/src/qml/qml/qqmlvmemetaobject.cpp
@@ -151,7 +151,7 @@ QQmlVMEMetaObject::QQmlVMEMetaObject(QObject *obj,
const QQmlVMEMetaData *meta, QV4::ExecutionContext *qmlBindingContext, QQmlCompiledData *compiledData)
: object(obj),
ctxt(QQmlData::get(obj, true)->outerContext), cache(cache), metaData(meta),
- hasAssignedMetaObjectData(false), aliasEndpoints(0), firstVarPropertyIndex(-1),
+ hasAssignedMetaObjectData(false), aliasEndpoints(0),
propertiesInitialized(false), interceptors(0), v8methods(0)
{
QObjectPrivate *op = QObjectPrivate::get(obj);
@@ -176,7 +176,7 @@ QQmlVMEMetaObject::QQmlVMEMetaObject(QObject *obj,
bool needsJSWrapper = (metaData->propertyCount > 0);
// ### Optimize
- for (int ii = 0; ii < metaData->propertyCount - metaData->varPropertyCount; ++ii) {
+ for (int ii = 0; ii < metaData->propertyCount; ++ii) {
int t = (metaData->propertyData() + ii)->propertyType;
if (t == list_type) {
listProperties.append(List(methodOffset() + ii, this));
@@ -186,8 +186,6 @@ QQmlVMEMetaObject::QQmlVMEMetaObject(QObject *obj,
}
}
- firstVarPropertyIndex = metaData->propertyCount - metaData->varPropertyCount;
-
if (needsJSWrapper)
ensureQObjectWrapper();
@@ -317,10 +315,8 @@ int QQmlVMEMetaObject::readPropertyAsInt(int id)
QV4::Scope scope(properties.engine());
QV4::ScopedValue sv(scope, *(md->data() + id));
- if (!sv->isInt32()) {
- writeProperty(id, int(0));
+ if (!sv->isInt32())
return 0;
- }
return sv->integerValue();
}
@@ -332,10 +328,8 @@ bool QQmlVMEMetaObject::readPropertyAsBool(int id)
QV4::Scope scope(properties.engine());
QV4::ScopedValue sv(scope, *(md->data() + id));
- if (!sv->isBoolean()) {
- writeProperty(id, false);
+ if (!sv->isBoolean())
return false;
- }
return sv->booleanValue();
}
@@ -347,10 +341,8 @@ double QQmlVMEMetaObject::readPropertyAsDouble(int id)
QV4::Scope scope(properties.engine());
QV4::ScopedValue sv(scope, *(md->data() + id));
- if (!sv->isDouble()) {
- writeProperty(id, 0.0);
+ if (!sv->isDouble())
return 0.0;
- }
return sv->doubleValue();
}
@@ -362,10 +354,8 @@ QString QQmlVMEMetaObject::readPropertyAsString(int id)
QV4::Scope scope(properties.engine());
QV4::ScopedValue sv(scope, *(md->data() + id));
- if (!sv->isString()) {
- writeProperty(id, QString());
+ if (!sv->isString())
return QString();
- }
return sv->stringValue()->toQString();
}
@@ -378,10 +368,8 @@ QUrl QQmlVMEMetaObject::readPropertyAsUrl(int id)
QV4::Scope scope(properties.engine());
QV4::ScopedValue sv(scope, *(md->data() + id));
const QV4::VariantObject *v = sv->as<QV4::VariantObject>();
- if (!v || v->d()->data.type() != QVariant::Url) {
- writeProperty(id, QUrl());
+ if (!v || v->d()->data.type() != QVariant::Url)
return QUrl();
- }
return v->d()->data.value<QUrl>();
}
@@ -394,10 +382,8 @@ QDate QQmlVMEMetaObject::readPropertyAsDate(int id)
QV4::Scope scope(properties.engine());
QV4::ScopedValue sv(scope, *(md->data() + id));
const QV4::VariantObject *v = sv->as<QV4::VariantObject>();
- if (!v || v->d()->data.type() != QVariant::Date) {
- writeProperty(id, QDate());
+ if (!v || v->d()->data.type() != QVariant::Date)
return QDate();
- }
return v->d()->data.value<QDate>();
}
@@ -410,10 +396,8 @@ QDateTime QQmlVMEMetaObject::readPropertyAsDateTime(int id)
QV4::Scope scope(properties.engine());
QV4::ScopedValue sv(scope, *(md->data() + id));
const QV4::VariantObject *v = sv->as<QV4::VariantObject>();
- if (!v || v->d()->data.type() != QVariant::DateTime) {
- writeProperty(id, QDateTime());
+ if (!v || v->d()->data.type() != QVariant::DateTime)
return QDateTime();
- }
return v->d()->data.value<QDateTime>();
}
@@ -426,10 +410,8 @@ QSizeF QQmlVMEMetaObject::readPropertyAsSizeF(int id)
QV4::Scope scope(properties.engine());
QV4::ScopedValue sv(scope, *(md->data() + id));
const QV4::VariantObject *v = sv->as<QV4::VariantObject>();
- if (!v || v->d()->data.type() != QVariant::SizeF) {
- writeProperty(id, QSizeF());
+ if (!v || v->d()->data.type() != QVariant::SizeF)
return QSizeF();
- }
return v->d()->data.value<QSizeF>();
}
@@ -442,10 +424,8 @@ QPointF QQmlVMEMetaObject::readPropertyAsPointF(int id)
QV4::Scope scope(properties.engine());
QV4::ScopedValue sv(scope, *(md->data() + id));
const QV4::VariantObject *v = sv->as<QV4::VariantObject>();
- if (!v || v->d()->data.type() != QVariant::PointF) {
- writeProperty(id, QPointF());
+ if (!v || v->d()->data.type() != QVariant::PointF)
return QPointF();
- }
return v->d()->data.value<QPointF>();
}
@@ -458,10 +438,8 @@ QObject* QQmlVMEMetaObject::readPropertyAsQObject(int id)
QV4::Scope scope(properties.engine());
QV4::ScopedValue sv(scope, *(md->data() + id));
const QV4::QObjectWrapper *wrapper = sv->as<QV4::QObjectWrapper>();
- if (!wrapper) {
- writeProperty(id, static_cast<QObject*>(Q_NULLPTR));
+ if (!wrapper)
return 0;
- }
return wrapper->object();
}
@@ -474,10 +452,8 @@ QRectF QQmlVMEMetaObject::readPropertyAsRectF(int id)
QV4::Scope scope(properties.engine());
QV4::ScopedValue sv(scope, *(md->data() + id));
const QV4::VariantObject *v = sv->as<QV4::VariantObject>();
- if (!v || v->d()->data.type() != QVariant::RectF) {
- writeProperty(id, QRectF());
+ if (!v || v->d()->data.type() != QVariant::RectF)
return QRectF();
- }
return v->d()->data.value<QRectF>();
}
@@ -566,8 +542,7 @@ int QQmlVMEMetaObject::metaCall(QMetaObject::Call c, int _id, void **a)
int t = (metaData->propertyData() + id)->propertyType;
bool needActivate = false;
- if (id >= firstVarPropertyIndex) {
- Q_ASSERT(t == QMetaType::QVariant);
+ if (t == QQmlVMEMetaData::VarPropertyType) {
// the context can be null if accessing var properties from cpp after re-parenting an item.
QQmlEnginePrivate *ep = (ctxt == 0 || ctxt->engine == 0) ? 0 : QQmlEnginePrivate::get(ctxt->engine);
QV8Engine *v8e = (ep == 0) ? 0 : ep->v8engine();
@@ -858,7 +833,7 @@ QV4::ReturnedValue QQmlVMEMetaObject::method(int index)
QV4::ReturnedValue QQmlVMEMetaObject::readVarProperty(int id)
{
- Q_ASSERT(id >= firstVarPropertyIndex);
+ Q_ASSERT((metaData->propertyData() + id)->propertyType == QQmlVMEMetaData::VarPropertyType);
QV4::MemberData *md = propertiesAsMemberData();
if (md)
@@ -868,30 +843,23 @@ QV4::ReturnedValue QQmlVMEMetaObject::readVarProperty(int id)
QVariant QQmlVMEMetaObject::readPropertyAsVariant(int id)
{
- if (id >= firstVarPropertyIndex) {
- QV4::MemberData *md = propertiesAsMemberData();
- if (md)
- return properties.engine()->toVariant(*(md->data() + id), -1);
- } else {
- QV4::MemberData *md = propertiesAsMemberData();
- if (md) {
- const QV4::QObjectWrapper *wrapper = (md->data() + id)->as<QV4::QObjectWrapper>();
- if (wrapper)
- return QVariant::fromValue(wrapper->object());
- const QV4::VariantObject *v = (md->data() + id)->as<QV4::VariantObject>();
- if (!v) {
- writeProperty(id, QVariant());
- return QVariant();
- }
+ QV4::MemberData *md = propertiesAsMemberData();
+ if (md) {
+ const QV4::QObjectWrapper *wrapper = (md->data() + id)->as<QV4::QObjectWrapper>();
+ if (wrapper)
+ return QVariant::fromValue(wrapper->object());
+ const QV4::VariantObject *v = (md->data() + id)->as<QV4::VariantObject>();
+ if (v)
return v->d()->data;
- }
+ return properties.engine()->toVariant(*(md->data() + id), -1);
}
return QVariant();
}
void QQmlVMEMetaObject::writeVarProperty(int id, const QV4::Value &value)
{
- Q_ASSERT(id >= firstVarPropertyIndex);
+ Q_ASSERT((metaData->propertyData() + id)->propertyType == QQmlVMEMetaData::VarPropertyType);
+
QV4::MemberData *md = propertiesAsMemberData();
if (!md)
return;
@@ -930,7 +898,7 @@ void QQmlVMEMetaObject::writeVarProperty(int id, const QV4::Value &value)
void QQmlVMEMetaObject::writeProperty(int id, const QVariant &value)
{
- if (id >= firstVarPropertyIndex) {
+ if ((metaData->propertyData() + id)->propertyType == QQmlVMEMetaData::VarPropertyType) {
QV4::MemberData *md = propertiesAsMemberData();
if (!md)
return;