diff options
-rw-r--r-- | src/qml/qml/qqmlpropertycachecreator.cpp | 30 | ||||
-rw-r--r-- | src/qml/qml/qqmlpropertycachecreator_p.h | 35 | ||||
-rw-r--r-- | src/qml/qml/qqmlvmemetaobject.cpp | 31 |
3 files changed, 37 insertions, 59 deletions
diff --git a/src/qml/qml/qqmlpropertycachecreator.cpp b/src/qml/qml/qqmlpropertycachecreator.cpp index bd4f2a0612..822241d58c 100644 --- a/src/qml/qml/qqmlpropertycachecreator.cpp +++ b/src/qml/qml/qqmlpropertycachecreator.cpp @@ -45,6 +45,36 @@ QT_BEGIN_NAMESPACE QAtomicInt QQmlPropertyCacheCreatorBase::classIndexCounter(0); + +int QQmlPropertyCacheCreatorBase::metaTypeForPropertyType(QV4::CompiledData::Property::Type type) +{ + switch (type) { + case QV4::CompiledData::Property::Var: return QMetaType::QVariant; + case QV4::CompiledData::Property::Variant: return QMetaType::QVariant; + case QV4::CompiledData::Property::Int: return QMetaType::Int; + case QV4::CompiledData::Property::Bool: return QMetaType::Bool; + case QV4::CompiledData::Property::Real: return QMetaType::Double; + case QV4::CompiledData::Property::String: return QMetaType::QString; + case QV4::CompiledData::Property::Url: return QMetaType::QUrl; + case QV4::CompiledData::Property::Color: return QMetaType::QColor; + case QV4::CompiledData::Property::Font: return QMetaType::QFont; + case QV4::CompiledData::Property::Time: return QMetaType::QTime; + case QV4::CompiledData::Property::Date: return QMetaType::QDate; + case QV4::CompiledData::Property::DateTime: return QMetaType::QDateTime; + case QV4::CompiledData::Property::Rect: return QMetaType::QRectF; + case QV4::CompiledData::Property::Point: return QMetaType::QPointF; + case QV4::CompiledData::Property::Size: return QMetaType::QSizeF; + case QV4::CompiledData::Property::Vector2D: return QMetaType::QVector2D; + case QV4::CompiledData::Property::Vector3D: return QMetaType::QVector3D; + case QV4::CompiledData::Property::Vector4D: return QMetaType::QVector4D; + case QV4::CompiledData::Property::Matrix4x4: return QMetaType::QMatrix4x4; + case QV4::CompiledData::Property::Quaternion: return QMetaType::QQuaternion; + case QV4::CompiledData::Property::Custom: break; + case QV4::CompiledData::Property::CustomList: break; + }; + return QMetaType::UnknownType; +} + QQmlBindingInstantiationContext::QQmlBindingInstantiationContext(int referencingObjectIndex, const QV4::CompiledData::Binding *instantiatingBinding, const QString &instantiatingPropertyName, QQmlPropertyCache *referencingObjectPropertyCache) : referencingObjectIndex(referencingObjectIndex) diff --git a/src/qml/qml/qqmlpropertycachecreator_p.h b/src/qml/qml/qqmlpropertycachecreator_p.h index 1dfd01c679..e227301175 100644 --- a/src/qml/qml/qqmlpropertycachecreator_p.h +++ b/src/qml/qml/qqmlpropertycachecreator_p.h @@ -84,6 +84,8 @@ struct QQmlPropertyCacheCreatorBase Q_DECLARE_TR_FUNCTIONS(QQmlPropertyCacheCreatorBase) public: static QAtomicInt classIndexCounter; + + static int metaTypeForPropertyType(QV4::CompiledData::Property::Type type); }; template <typename ObjectContainer> @@ -275,33 +277,6 @@ inline QQmlJS::DiagnosticMessage QQmlPropertyCacheCreator<ObjectContainer>::crea propertyCaches->set(objectIndex, cache); propertyCaches->setNeedsVMEMetaObject(objectIndex); - struct TypeData { - QV4::CompiledData::Property::Type dtype; - int metaType; - } builtinTypes[] = { - { QV4::CompiledData::Property::Var, QMetaType::QVariant }, - { QV4::CompiledData::Property::Variant, QMetaType::QVariant }, - { QV4::CompiledData::Property::Int, QMetaType::Int }, - { QV4::CompiledData::Property::Bool, QMetaType::Bool }, - { QV4::CompiledData::Property::Real, QMetaType::Double }, - { QV4::CompiledData::Property::String, QMetaType::QString }, - { QV4::CompiledData::Property::Url, QMetaType::QUrl }, - { QV4::CompiledData::Property::Color, QMetaType::QColor }, - { QV4::CompiledData::Property::Font, QMetaType::QFont }, - { QV4::CompiledData::Property::Time, QMetaType::QTime }, - { QV4::CompiledData::Property::Date, QMetaType::QDate }, - { QV4::CompiledData::Property::DateTime, QMetaType::QDateTime }, - { QV4::CompiledData::Property::Rect, QMetaType::QRectF }, - { QV4::CompiledData::Property::Point, QMetaType::QPointF }, - { QV4::CompiledData::Property::Size, QMetaType::QSizeF }, - { QV4::CompiledData::Property::Vector2D, QMetaType::QVector2D }, - { QV4::CompiledData::Property::Vector3D, QMetaType::QVector3D }, - { QV4::CompiledData::Property::Vector4D, QMetaType::QVector4D }, - { QV4::CompiledData::Property::Matrix4x4, QMetaType::QMatrix4x4 }, - { QV4::CompiledData::Property::Quaternion, QMetaType::QQuaternion } -}; - static const uint builtinTypeCount = sizeof(builtinTypes) / sizeof(TypeData); - QByteArray newClassName; if (objectIndex == /*root object*/0) { @@ -431,7 +406,7 @@ inline QQmlJS::DiagnosticMessage QQmlPropertyCacheCreator<ObjectContainer>::crea names.append(stringAt(param->nameIndex).toUtf8()); if (param->indexIsBuiltinType) { // built-in type - paramTypes[i + 1] = builtinTypes[param->typeNameIndexOrBuiltinType].metaType; + paramTypes[i + 1] = metaTypeForPropertyType(static_cast<QV4::CompiledData::Property::Type>(int(param->typeNameIndexOrBuiltinType))); } else { // lazily resolved type const QString customTypeName = stringAt(param->typeNameIndexOrBuiltinType); @@ -505,8 +480,8 @@ inline QQmlJS::DiagnosticMessage QQmlPropertyCacheCreator<ObjectContainer>::crea if (p->type == QV4::CompiledData::Property::Var) { propertyType = QMetaType::QVariant; propertyFlags.type = QQmlPropertyData::Flags::VarPropertyType; - } else if (p->type < builtinTypeCount) { - propertyType = builtinTypes[p->type].metaType; + } else if (p->type < QV4::CompiledData::Property::Custom) { + propertyType = metaTypeForPropertyType(static_cast<QV4::CompiledData::Property::Type>(quint32(p->type))); if (p->type == QV4::CompiledData::Property::Variant) propertyFlags.type = QQmlPropertyData::Flags::QVariantType; diff --git a/src/qml/qml/qqmlvmemetaobject.cpp b/src/qml/qml/qqmlvmemetaobject.cpp index 2881e71805..b42e328e60 100644 --- a/src/qml/qml/qqmlvmemetaobject.cpp +++ b/src/qml/qml/qqmlvmemetaobject.cpp @@ -57,6 +57,7 @@ #include <private/qv4scopedvalue_p.h> #include <private/qv4jscall_p.h> #include <private/qv4qobjectwrapper_p.h> +#include <private/qqmlpropertycachecreator_p.h> QT_BEGIN_NAMESPACE @@ -656,35 +657,7 @@ int QQmlVMEMetaObject::metaCall(QObject *o, QMetaObject::Call c, int _id, void * } } else { - int fallbackMetaType = QMetaType::UnknownType; - switch (t) { - case QV4::CompiledData::Property::Font: - fallbackMetaType = QMetaType::QFont; - break; - case QV4::CompiledData::Property::Time: - fallbackMetaType = QMetaType::QTime; - break; - case QV4::CompiledData::Property::Color: - fallbackMetaType = QMetaType::QColor; - break; - case QV4::CompiledData::Property::Vector2D: - fallbackMetaType = QMetaType::QVector2D; - break; - case QV4::CompiledData::Property::Vector3D: - fallbackMetaType = QMetaType::QVector3D; - break; - case QV4::CompiledData::Property::Vector4D: - fallbackMetaType = QMetaType::QVector4D; - break; - case QV4::CompiledData::Property::Matrix4x4: - fallbackMetaType = QMetaType::QMatrix4x4; - break; - case QV4::CompiledData::Property::Quaternion: - fallbackMetaType = QMetaType::QQuaternion; - break; - default: break; - } - + const int fallbackMetaType = QQmlPropertyCacheCreatorBase::metaTypeForPropertyType(t); if (c == QMetaObject::ReadProperty) { switch (t) { |