aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jsruntime/qv4qobjectwrapper.cpp
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2021-06-07 15:28:54 +0200
committerUlf Hermann <ulf.hermann@qt.io>2021-06-09 14:47:13 +0200
commitc4addf7d0e91cd39b636a88772ae9543f11e2c8c (patch)
treea82c384a019573365ab357767972d5344abed495 /src/qml/jsruntime/qv4qobjectwrapper.cpp
parente5383a5d5dd02afdbe94b380394fd88d8320e35a (diff)
Pass QMetaType by value rather than by ID in more places
This saves us some ping-pong between the IDs and the QMetaTypes, and avoids possible ambiguities if multiple metatypes are registered for the same C++ type. Change-Id: I81cec94a9cd05d69927dc884f65574f0ab2ddc22 Reviewed-by: Maximilian Goldstein <max.goldstein@qt.io> Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'src/qml/jsruntime/qv4qobjectwrapper.cpp')
-rw-r--r--src/qml/jsruntime/qv4qobjectwrapper.cpp59
1 files changed, 36 insertions, 23 deletions
diff --git a/src/qml/jsruntime/qv4qobjectwrapper.cpp b/src/qml/jsruntime/qv4qobjectwrapper.cpp
index 20ccb00093..0a4f4658ed 100644
--- a/src/qml/jsruntime/qv4qobjectwrapper.cpp
+++ b/src/qml/jsruntime/qv4qobjectwrapper.cpp
@@ -134,8 +134,6 @@ static QV4::ReturnedValue loadProperty(QV4::ExecutionEngine *v4, QObject *object
{
Q_ASSERT(!property.isFunction());
QV4::Scope scope(v4);
- const QMetaType propMetaType = property.propType();
- const int propType = propMetaType.id();
if (property.isQObject()) {
QObject *rv = nullptr;
@@ -149,42 +147,54 @@ static QV4::ReturnedValue loadProperty(QV4::ExecutionEngine *v4, QObject *object
}
}
return ret;
+ }
- } else if (property.isQList()) {
+ if (property.isQList())
return QmlListWrapper::create(v4, object, property.coreIndex(), property.propType());
- } else if (propType == QMetaType::QReal) {
- qreal v = 0;
- property.readProperty(object, &v);
- return QV4::Encode(v);
- } else if (propType == QMetaType::Int || property.isEnum()) {
+
+ const QMetaType propMetaType = property.propType();
+ switch (property.isEnum() ? QMetaType::Int : propMetaType.id()) {
+ case QMetaType::Int: {
int v = 0;
property.readProperty(object, &v);
return QV4::Encode(v);
- } else if (propType == QMetaType::Bool) {
+ }
+ case QMetaType::Bool: {
bool v = false;
property.readProperty(object, &v);
return QV4::Encode(v);
- } else if (propType == QMetaType::QString) {
+ }
+ case QMetaType::QString: {
QString v;
property.readProperty(object, &v);
return v4->newString(v)->asReturnedValue();
- } else if (propType == QMetaType::UInt) {
+ }
+ case QMetaType::UInt: {
uint v = 0;
property.readProperty(object, &v);
return QV4::Encode(v);
- } else if (propType == QMetaType::Float) {
+ }
+ case QMetaType::Float: {
float v = 0;
property.readProperty(object, &v);
return QV4::Encode(v);
- } else if (propType == QMetaType::Double) {
+ }
+ case QMetaType::Double: {
double v = 0;
property.readProperty(object, &v);
return QV4::Encode(v);
- } else if (propType == qMetaTypeId<QJSValue>()) {
+ }
+ default:
+ break;
+ }
+
+ if (propMetaType == QMetaType::fromType<QJSValue>()) {
QJSValue v;
property.readProperty(object, &v);
return QJSValuePrivate::convertToReturnedValue(v4, v);
- } else if (property.isQVariant()) {
+ }
+
+ if (property.isQVariant()) {
QVariant v;
property.readProperty(object, &v);
@@ -194,20 +204,24 @@ static QV4::ReturnedValue loadProperty(QV4::ExecutionEngine *v4, QObject *object
}
return scope.engine->fromVariant(v);
- } else if (QQmlMetaType::isValueType(propMetaType)) {
+ }
+
+ if (QQmlMetaType::isValueType(propMetaType)) {
if (const QMetaObject *valueTypeMetaObject = QQmlMetaType::metaObjectForValueType(propMetaType))
return QV4::QQmlValueTypeWrapper::create(v4, object, property.coreIndex(), valueTypeMetaObject, propMetaType);
} else {
#if QT_CONFIG(qml_sequence_object)
// see if it's a sequence type
bool succeeded = false;
- QV4::ScopedValue retn(scope, QV4::SequencePrototype::newSequence(v4, propType, object, property.coreIndex(), !property.isWritable(), &succeeded));
+ QV4::ScopedValue retn(scope, QV4::SequencePrototype::newSequence(
+ v4, propMetaType, object, property.coreIndex(),
+ !property.isWritable(), &succeeded));
if (succeeded)
return retn->asReturnedValue();
#endif
}
- if (propType == QMetaType::UnknownType) {
+ if (!propMetaType.isValid()) {
QMetaProperty p = object->metaObject()->property(property.coreIndex());
qWarning("QMetaProperty::read: Unable to handle unregistered datatype '%s' for property "
"'%s::%s'", p.typeName(), object->metaObject()->className(), p.name());
@@ -2004,14 +2018,13 @@ bool CallArgument::fromValue(QMetaType metaType, QV4::ExecutionEngine *engine, c
QQmlEnginePrivate *ep = engine->qmlEngine() ? QQmlEnginePrivate::get(engine->qmlEngine()) : nullptr;
QVariant v = scope.engine->toVariant(value, metaType);
- const QMetaType callMetaType(callType);
- if (v.metaType() == callMetaType) {
+ if (v.metaType() == metaType) {
*qvariantPtr = v;
- } else if (v.canConvert(callMetaType)) {
+ } else if (v.canConvert(metaType)) {
*qvariantPtr = v;
- qvariantPtr->convert(callMetaType);
+ qvariantPtr->convert(metaType);
} else {
- QQmlMetaObject mo = ep ? ep->rawMetaObjectForType(callType) : QQmlMetaObject();
+ QQmlMetaObject mo = ep ? ep->rawMetaObjectForType(metaType) : QQmlMetaObject();
if (!mo.isNull()) {
QObject *obj = QQmlMetaType::toQObject(v);