aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/qml
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2020-09-16 13:06:57 +0200
committerUlf Hermann <ulf.hermann@qt.io>2020-09-16 14:56:01 +0200
commitc430fc856964b8d07cd5bebe874095c7e3a0fc54 (patch)
tree633d95973379998530114ae2129d853e54ab7699 /src/qml/qml
parentae9bef00159fa3362309ccf3a9999f75bd45e81e (diff)
QQmlValueTypeProvider: Use QMetaType
We can create, compare, convert registered types without going through special virtual value type providers. Change-Id: I0431256540b8dd6861ff3a945570ea7df45ed98d Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Diffstat (limited to 'src/qml/qml')
-rw-r--r--src/qml/qml/qqmlglobal.cpp52
-rw-r--r--src/qml/qml/qqmlglobal_p.h4
2 files changed, 18 insertions, 38 deletions
diff --git a/src/qml/qml/qqmlglobal.cpp b/src/qml/qml/qqmlglobal.cpp
index 1c0bb41804..cd08a5270c 100644
--- a/src/qml/qml/qqmlglobal.cpp
+++ b/src/qml/qml/qqmlglobal.cpp
@@ -70,13 +70,11 @@ const QMetaObject *QQmlValueTypeProvider::metaObjectForMetaType(int type)
bool QQmlValueTypeProvider::initValueType(int type, QVariant& dst)
{
- QQmlValueTypeProvider *p = this;
- do {
- if (p->init(type, dst))
- return true;
- } while ((p = p->next));
-
- return false;
+ const QMetaType metaType(type);
+ if (!metaType.isValid())
+ return false;
+ dst = QVariant(QMetaType(type));
+ return true;
}
QVariant QQmlValueTypeProvider::createValueType(int type, int argc, const void *argv[])
@@ -141,14 +139,7 @@ QVariant QQmlValueTypeProvider::createVariantFromJsObject(int type, const QV4::V
bool QQmlValueTypeProvider::equalValueType(int type, const void *lhs, const QVariant& rhs)
{
Q_ASSERT(lhs);
-
- QQmlValueTypeProvider *p = this;
- do {
- if (p->equal(type, lhs, rhs))
- return true;
- } while ((p = p->next));
-
- return false;
+ return QMetaType(type).equals(lhs, rhs.constData());
}
bool QQmlValueTypeProvider::storeValueType(int type, const void *src, void *dst, size_t dstSize)
@@ -165,42 +156,35 @@ bool QQmlValueTypeProvider::storeValueType(int type, const void *src, void *dst,
return false;
}
-bool QQmlValueTypeProvider::readValueType(const QVariant& src, void *dst, int dstType)
+bool QQmlValueTypeProvider::readValueType(const QVariant& src, void *dst, int type)
{
Q_ASSERT(dst);
+ const QMetaType dstType(type);
+ if (!dstType.isValid() || (src.metaType() == dstType && dstType.equals(src.constData(), dst)))
+ return false;
- QQmlValueTypeProvider *p = this;
- do {
- if (p->read(src, dst, dstType))
- return true;
- } while ((p = p->next));
-
- return false;
+ dstType.destruct(dst);
+ dstType.construct(dst, src.metaType() == dstType ? src.constData() : nullptr);
+ return true;
}
bool QQmlValueTypeProvider::writeValueType(int type, const void *src, QVariant& dst)
{
Q_ASSERT(src);
+ const QMetaType srcType(type);
+ if (!srcType.isValid() || (dst.metaType() == srcType && srcType.equals(src, dst.constData())))
+ return false;
- QQmlValueTypeProvider *p = this;
- do {
- if (p->write(type, src, dst))
- return true;
- } while ((p = p->next));
-
- return false;
+ dst = QVariant(srcType, src);
+ return true;
}
const QMetaObject *QQmlValueTypeProvider::getMetaObjectForMetaType(int) { return nullptr; }
-bool QQmlValueTypeProvider::init(int, QVariant&) { return false; }
bool QQmlValueTypeProvider::create(int, int, const void *[], QVariant *) { return false; }
bool QQmlValueTypeProvider::createFromString(int, const QString &, void *, size_t) { return false; }
bool QQmlValueTypeProvider::variantFromString(int, const QString &, QVariant *) { return false; }
bool QQmlValueTypeProvider::variantFromJsObject(int, const QV4::Value &, QV4::ExecutionEngine *, QVariant *) { return false; }
-bool QQmlValueTypeProvider::equal(int, const void *, const QVariant&) { return false; }
bool QQmlValueTypeProvider::store(int, const void *, void *, size_t) { return false; }
-bool QQmlValueTypeProvider::read(const QVariant&, void *, int) { return false; }
-bool QQmlValueTypeProvider::write(int, const void *, QVariant&) { return false; }
struct ValueTypeProviderList {
QQmlValueTypeProvider nullProvider;
diff --git a/src/qml/qml/qqmlglobal_p.h b/src/qml/qml/qqmlglobal_p.h
index f2a11e5456..3c03753d08 100644
--- a/src/qml/qml/qqmlglobal_p.h
+++ b/src/qml/qml/qqmlglobal_p.h
@@ -239,7 +239,6 @@ public:
private:
virtual const QMetaObject *getMetaObjectForMetaType(int);
- virtual bool init(int, QVariant&);
virtual bool create(int, int, const void *[], QVariant *);
virtual bool createFromString(int, const QString &, void *, size_t);
@@ -247,10 +246,7 @@ private:
virtual bool variantFromString(int, const QString &, QVariant *);
virtual bool variantFromJsObject(int, const QV4::Value &, QV4::ExecutionEngine *, QVariant *);
- virtual bool equal(int, const void *, const QVariant&);
virtual bool store(int, const void *, void *, size_t);
- virtual bool read(const QVariant&, void *, int);
- virtual bool write(int, const void *, QVariant&);
friend Q_QML_PRIVATE_EXPORT void QQml_addValueTypeProvider(QQmlValueTypeProvider *);
friend Q_QML_PRIVATE_EXPORT void QQml_removeValueTypeProvider(QQmlValueTypeProvider *);