diff options
author | Ulf Hermann <ulf.hermann@qt.io> | 2022-11-21 16:32:01 +0100 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2022-11-25 00:04:03 +0100 |
commit | c4f0d07bda41ea3ea083d17c56e67a3b05a532bb (patch) | |
tree | 5d231adc37ea19da133367b909171c597e777b71 /src/qml/qml/qqmlvaluetypewrapper.cpp | |
parent | 6e640a0218b9860f7af79494d87b64690805a1ed (diff) |
Repair QQmlGadgetPtrWrapper's metaObject
We need two metaobjects: One with the PropertyAccessInStaticMetaCall
flagg and one without. The one without needs to be used with
QQmlGadgetPtrWrapper, since the wrapper wants to intercept metacalls.
The other one needs to be used when calling readOnGadget(). We can
accommodate this by just retaining the original metaobject. As it's
retrieved from a gadget type you should definitely be able to
readOnGadget() with it. The dynamic meta object, on the other hand, can
be lazily created when we actually metacall() through
QQmlGadgetPtrWrapper.
This relieves us of all the special casing around QQmlGadgetPtrWrapper
and makes it safe to use for anyone.
Fixes: QTBUG-108704
Change-Id: Icc01c81babaa9d1eca8d5ddfaf44d724a404db38
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'src/qml/qml/qqmlvaluetypewrapper.cpp')
-rw-r--r-- | src/qml/qml/qqmlvaluetypewrapper.cpp | 34 |
1 files changed, 17 insertions, 17 deletions
diff --git a/src/qml/qml/qqmlvaluetypewrapper.cpp b/src/qml/qml/qqmlvaluetypewrapper.cpp index 561b2f888d..e489a0d43f 100644 --- a/src/qml/qml/qqmlvaluetypewrapper.cpp +++ b/src/qml/qml/qqmlvaluetypewrapper.cpp @@ -51,7 +51,7 @@ Heap::QQmlValueTypeWrapper *Heap::QQmlValueTypeWrapper::detached() const void Heap::QQmlValueTypeWrapper::destroy() { if (m_gadgetPtr) { - m_valueType->metaType.destruct(m_gadgetPtr); + m_valueType->metaType().destruct(m_gadgetPtr); ::operator delete(m_gadgetPtr); } ReferenceObject::destroy(); @@ -60,16 +60,16 @@ void Heap::QQmlValueTypeWrapper::destroy() void Heap::QQmlValueTypeWrapper::setData(const void *data) { if (auto *gadget = gadgetPtr()) - valueType()->metaType.destruct(gadget); + valueType()->metaType().destruct(gadget); if (!gadgetPtr()) - setGadgetPtr(::operator new(valueType()->metaType.sizeOf())); - valueType()->metaType.construct(gadgetPtr(), data); + setGadgetPtr(::operator new(valueType()->metaType().sizeOf())); + valueType()->metaType().construct(gadgetPtr(), data); } QVariant Heap::QQmlValueTypeWrapper::toVariant() const { Q_ASSERT(gadgetPtr()); - return QVariant(valueType()->metaType, gadgetPtr()); + return QVariant(valueType()->metaType(), gadgetPtr()); } bool Heap::QQmlValueTypeWrapper::setVariant(const QVariant &variant) @@ -77,7 +77,7 @@ bool Heap::QQmlValueTypeWrapper::setVariant(const QVariant &variant) Q_ASSERT(isVariant()); const QMetaType variantReferenceType = variant.metaType(); - if (variantReferenceType != valueType()->metaType) { + if (variantReferenceType != valueType()->metaType()) { // This is a stale VariantReference. That is, the variant has been // overwritten with a different type in the meantime. // We need to modify this reference to the updated value type, if @@ -85,7 +85,7 @@ bool Heap::QQmlValueTypeWrapper::setVariant(const QVariant &variant) if (QQmlMetaType::isValueType(variantReferenceType)) { const QMetaObject *mo = QQmlMetaType::metaObjectForValueType(variantReferenceType); if (gadgetPtr()) { - valueType()->metaType.destruct(gadgetPtr()); + valueType()->metaType().destruct(gadgetPtr()); ::operator delete(gadgetPtr()); } setGadgetPtr(nullptr); @@ -105,8 +105,8 @@ bool Heap::QQmlValueTypeWrapper::setVariant(const QVariant &variant) void *Heap::QQmlValueTypeWrapper::storagePointer() { if (!gadgetPtr()) { - setGadgetPtr(::operator new(valueType()->metaType.sizeOf())); - valueType()->metaType.construct(gadgetPtr(), nullptr); + setGadgetPtr(::operator new(valueType()->metaType().sizeOf())); + valueType()->metaType().construct(gadgetPtr(), nullptr); } return gadgetPtr(); } @@ -243,7 +243,7 @@ bool QQmlValueTypeWrapper::toGadget(void *data) const { if (d()->isReference() && !readReferenceValue()) return false; - const QMetaType type = d()->valueType()->metaType; + const QMetaType type = d()->valueType()->metaType(); type.destruct(data); type.construct(data, d()->gadgetPtr()); return true; @@ -539,12 +539,12 @@ bool QQmlValueTypeWrapper::isEqual(const QVariant& value) const int QQmlValueTypeWrapper::typeId() const { - return d()->valueType()->metaType.id(); + return d()->valueType()->metaType().id(); } QMetaType QQmlValueTypeWrapper::type() const { - return d()->valueType()->metaType; + return d()->valueType()->metaType(); } bool QQmlValueTypeWrapper::write(QObject *target, int propertyIndex) const @@ -553,9 +553,9 @@ bool QQmlValueTypeWrapper::write(QObject *target, int propertyIndex) const Q_ALLOCA_DECLARE(void, gadget); if (d()->isReference()) { if (!d()->gadgetPtr()) { - Q_ALLOCA_ASSIGN(void, gadget, d()->valueType()->metaType.sizeOf()); + Q_ALLOCA_ASSIGN(void, gadget, d()->valueType()->metaType().sizeOf()); d()->setGadgetPtr(gadget); - d()->valueType()->metaType.construct(d()->gadgetPtr(), nullptr); + d()->valueType()->metaType().construct(d()->gadgetPtr(), nullptr); destructGadgetOnExit = true; } if (!readReferenceValue()) @@ -568,7 +568,7 @@ bool QQmlValueTypeWrapper::write(QObject *target, int propertyIndex) const QMetaObject::metacall(target, QMetaObject::WriteProperty, propertyIndex, a); if (destructGadgetOnExit) { - d()->valueType()->metaType.destruct(d()->gadgetPtr()); + d()->valueType()->metaType().destruct(d()->gadgetPtr()); d()->setGadgetPtr(nullptr); } return true; @@ -605,9 +605,9 @@ ReturnedValue QQmlValueTypeWrapper::method_toString(const FunctionObject *b, con RETURN_UNDEFINED(); QString result; - if (!QMetaType::convert(w->d()->valueType()->metaType, w->d()->gadgetPtr(), + if (!QMetaType::convert(w->d()->valueType()->metaType(), w->d()->gadgetPtr(), QMetaType(QMetaType::QString), &result)) { - result = QString::fromUtf8(w->d()->valueType()->metaType.name()) + QLatin1Char('('); + result = QString::fromUtf8(w->d()->valueType()->metaType().name()) + QLatin1Char('('); const QMetaObject *mo = w->d()->metaObject(); const int propCount = mo->propertyCount(); for (int i = 0; i < propCount; ++i) { |