diff options
author | Fabian Kosmale <fabian.kosmale@qt.io> | 2020-11-20 12:45:31 +0100 |
---|---|---|
committer | Fabian Kosmale <fabian.kosmale@qt.io> | 2020-11-26 17:58:09 +0100 |
commit | 08abb22443078dcd69cec98ea451a0e2e190982f (patch) | |
tree | c70b150ba7faf29f9b18dcb5e97b3ad0e0678633 /src/qml/qml/qqmlproperty.cpp | |
parent | e6b45a2f5dad8105a8f493e2167988a95c1f08ed (diff) |
QML engine: Use QMetaType instead of metatype-id in propertydata
We don't want to convert back and forth between QMetaTypes and ids. This
change is the first step towards using QMetaType directly everywhere.
By reordering the members of QQmlPropertyData to avoid a gap caused by
alignment, we can replace the typeid int with a QMetaType without
requiring more space.
There are still a few places left using metatype ids, notably the value
type logic.
Task-number: QTBUG-82931
Change-Id: Ic38f38d10c71ed20655877976c9cb5ee3cbe2d77
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
Diffstat (limited to 'src/qml/qml/qqmlproperty.cpp')
-rw-r--r-- | src/qml/qml/qqmlproperty.cpp | 45 |
1 files changed, 23 insertions, 22 deletions
diff --git a/src/qml/qml/qqmlproperty.cpp b/src/qml/qml/qqmlproperty.cpp index 68127f8686..d05b9c52fe 100644 --- a/src/qml/qml/qqmlproperty.cpp +++ b/src/qml/qml/qqmlproperty.cpp @@ -316,9 +316,9 @@ void QQmlPropertyPrivate::initProperty(QObject *obj, const QString &name) if (property->isFunction()) return; // Not an object property - if (ii == (path.count() - 2) && QQmlValueTypeFactory::isValueType(property->propType())) { + if (ii == (path.count() - 2) && QQmlValueTypeFactory::isValueType(property->propType().id())) { // We're now at a value type property - const QMetaObject *valueTypeMetaObject = QQmlValueTypeFactory::metaObjectForMetaType(property->propType()); + const QMetaObject *valueTypeMetaObject = QQmlValueTypeFactory::metaObjectForMetaType(property->propType().id()); if (!valueTypeMetaObject) return; // Not a value type int idx = valueTypeMetaObject->indexOfProperty(path.last().toUtf8().constData()); @@ -331,7 +331,7 @@ void QQmlPropertyPrivate::initProperty(QObject *obj, const QString &name) object = currentObject; core = *property; valueTypeData.setFlags(QQmlPropertyData::flagsForProperty(vtProp)); - valueTypeData.setPropType(vtProp.userType()); + valueTypeData.setPropType(vtProp.metaType()); valueTypeData.setCoreIndex(idx); return; @@ -502,7 +502,7 @@ const char *QQmlProperty::propertyTypeName() const if (!d) return nullptr; if (d->isValueType()) { - const QMetaObject *valueTypeMetaObject = QQmlValueTypeFactory::metaObjectForMetaType(d->core.propType()); + const QMetaObject *valueTypeMetaObject = QQmlValueTypeFactory::metaObjectForMetaType(d->core.propType().id()); Q_ASSERT(valueTypeMetaObject); return valueTypeMetaObject->property(d->valueTypeData.coreIndex()).typeName(); } else if (d->object && type() & Property && d->core.isValid()) { @@ -545,9 +545,9 @@ int QQmlPropertyPrivate::propertyType() const { uint type = this->type(); if (isValueType()) { - return valueTypeData.propType(); + return valueTypeData.propType().id(); } else if (type & QQmlProperty::Property) { - return core.propType(); + return core.propType().id(); } else { return QMetaType::UnknownType; } @@ -676,7 +676,7 @@ QString QQmlProperty::name() const // ### if (!d->object) { } else if (d->isValueType()) { - const QMetaObject *valueTypeMetaObject = QQmlValueTypeFactory::metaObjectForMetaType(d->core.propType()); + const QMetaObject *valueTypeMetaObject = QQmlValueTypeFactory::metaObjectForMetaType(d->core.propType().id()); Q_ASSERT(valueTypeMetaObject); const char *vtName = valueTypeMetaObject->property(d->valueTypeData.coreIndex()).name(); @@ -1057,9 +1057,9 @@ QVariant QQmlPropertyPrivate::readValueProperty() }; if (isValueType()) { - if (QQmlGadgetPtrWrapper *wrapper = QQmlGadgetPtrWrapper::instance(engine, core.propType())) + if (QQmlGadgetPtrWrapper *wrapper = QQmlGadgetPtrWrapper::instance(engine, core.propType().id())) return doRead(wrapper); - if (QQmlValueType *valueType = QQmlValueTypeFactory::valueType(core.propType())) { + if (QQmlValueType *valueType = QQmlValueTypeFactory::valueType(core.propType().id())) { QQmlGadgetPtrWrapper wrapper(valueType, nullptr); return doRead(&wrapper); } @@ -1068,7 +1068,7 @@ QVariant QQmlPropertyPrivate::readValueProperty() QQmlListProperty<QObject> prop; core.readProperty(object, &prop); - return QVariant::fromValue(QQmlListReferencePrivate::init(prop, core.propType(), engine)); + return QVariant::fromValue(QQmlListReferencePrivate::init(prop, core.propType().id(), engine)); } else if (core.isQObject()) { @@ -1078,20 +1078,20 @@ QVariant QQmlPropertyPrivate::readValueProperty() } else { - if (!core.propType()) // Unregistered type + if (!core.propType().isValid()) // Unregistered type return object->metaObject()->property(core.coreIndex()).read(object); QVariant value; int status = -1; void *args[] = { nullptr, &value, &status }; - if (core.propType() == QMetaType::QVariant) { + if (core.propType() == QMetaType::fromType<QVariant>()) { args[0] = &value; } else { - value = QVariant(QMetaType(core.propType()), (void*)nullptr); + value = QVariant(core.propType(), (void*)nullptr); args[0] = value.data(); } core.readPropertyWithArgs(object, args); - if (core.propType() != QMetaType::QVariant && args[0] != value.data()) + if (core.propType() != QMetaType::fromType<QVariant>() && args[0] != value.data()) return QVariant(QMetaType(core.propType()), args[0]); return value; @@ -1195,11 +1195,11 @@ QQmlPropertyPrivate::writeValueProperty(QObject *object, }; QQmlGadgetPtrWrapper *wrapper = context - ? QQmlGadgetPtrWrapper::instance(context->engine(), core.propType()) + ? QQmlGadgetPtrWrapper::instance(context->engine(), core.propType().id()) : nullptr; if (wrapper) { doWrite(wrapper); - } else if (QQmlValueType *valueType = QQmlValueTypeFactory::valueType(core.propType())) { + } else if (QQmlValueType *valueType = QQmlValueTypeFactory::valueType(core.propType().id())) { QQmlGadgetPtrWrapper wrapper(valueType, nullptr); doWrite(&wrapper); } @@ -1215,7 +1215,8 @@ bool QQmlPropertyPrivate::write( QObject *object, const QQmlPropertyData &property, const QVariant &value, const QQmlRefPointer<QQmlContextData> &context, QQmlPropertyData::WriteFlags flags) { - const int propertyType = property.propType(); + const QMetaType propertyMetaType = property.propType(); + const int propertyType = propertyMetaType.id(); const int variantType = value.userType(); if (property.isEnum()) { @@ -1265,7 +1266,7 @@ bool QQmlPropertyPrivate::write( } else { return false; } - } else if (value.canConvert(QMetaType(propertyType)) + } else if (value.canConvert(propertyMetaType) && !isUrl && variantType != QMetaType::QString && propertyType != qMetaTypeId<QList<QUrl>>() && !property.isQList()) { // common cases: @@ -1292,7 +1293,7 @@ bool QQmlPropertyPrivate::write( } default: { // "fallback": QVariant v = value; - v.convert(QMetaType(propertyType)); + v.convert(propertyMetaType); return property.writeProperty(object, const_cast<void *>(v.constData()), flags); } } @@ -1317,9 +1318,9 @@ bool QQmlPropertyPrivate::write( QQmlMetaObject listType; if (enginePriv) { - listType = enginePriv->rawMetaObjectForType(enginePriv->listType(property.propType())); + listType = enginePriv->rawMetaObjectForType(enginePriv->listType(propertyType)); } else { - QQmlType type = QQmlMetaType::qmlType(QQmlMetaType::listType(property.propType())); + QQmlType type = QQmlMetaType::qmlType(QQmlMetaType::listType(propertyType)); if (!type.isValid()) return false; listType = type.baseMetaObject(); @@ -1369,7 +1370,7 @@ bool QQmlPropertyPrivate::write( if (!ok) { v = value; - if (v.convert(QMetaType(propertyType))) { + if (v.convert(propertyMetaType)) { ok = true; } else if (static_cast<uint>(propertyType) >= QMetaType::User && variantType == QMetaType::QString) { |