aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/qml/qqmlvaluetypewrapper_p.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/qml/qml/qqmlvaluetypewrapper_p.h')
-rw-r--r--src/qml/qml/qqmlvaluetypewrapper_p.h47
1 files changed, 36 insertions, 11 deletions
diff --git a/src/qml/qml/qqmlvaluetypewrapper_p.h b/src/qml/qml/qqmlvaluetypewrapper_p.h
index 0c4cbb7dd3..5b3894a07f 100644
--- a/src/qml/qml/qqmlvaluetypewrapper_p.h
+++ b/src/qml/qml/qqmlvaluetypewrapper_p.h
@@ -41,11 +41,12 @@ namespace Heap {
DECLARE_HEAP_OBJECT(QQmlValueTypeWrapper, ReferenceObject) {
DECLARE_MARKOBJECTS(QQmlValueTypeWrapper);
- void init(const void *data, QQmlValueType *valueType, const QMetaObject *metaObject,
- Object *object, int property, Flags flags)
+ void init(
+ const void *data, QMetaType metaType, const QMetaObject *metaObject,
+ Object *object, int property, Flags flags)
{
ReferenceObject::init(object, property, flags);
- setValueType(valueType);
+ setMetaType(metaType);
setMetaObject(metaObject);
if (data)
setData(data);
@@ -55,10 +56,10 @@ DECLARE_HEAP_OBJECT(QQmlValueTypeWrapper, ReferenceObject) {
void destroy();
- QQmlValueType *valueType() const
+ QMetaType metaType() const
{
- Q_ASSERT(m_valueType != nullptr);
- return m_valueType;
+ Q_ASSERT(m_metaType != nullptr);
+ return QMetaType(m_metaType);
}
void setGadgetPtr(void *gadgetPtr) { m_gadgetPtr = gadgetPtr; }
@@ -66,7 +67,19 @@ DECLARE_HEAP_OBJECT(QQmlValueTypeWrapper, ReferenceObject) {
const QMetaObject *metaObject() const { return m_metaObject; }
- void setData(const void *data);
+ void setData(const void *data)
+ {
+ const QMetaType type = metaType();
+ void *gadget = gadgetPtr();
+ if (gadget) {
+ type.destruct(gadget);
+ } else {
+ gadget = ::operator new(type.sizeOf());
+ setGadgetPtr(gadget);
+ }
+ type.construct(gadget, data);
+ }
+
QVariant toVariant() const;
void *storagePointer();
@@ -77,14 +90,14 @@ DECLARE_HEAP_OBJECT(QQmlValueTypeWrapper, ReferenceObject) {
private:
void setMetaObject(const QMetaObject *metaObject) { m_metaObject = metaObject; }
- void setValueType(QQmlValueType *valueType)
+ void setMetaType(QMetaType metaType)
{
- Q_ASSERT(valueType != nullptr);
- m_valueType = valueType;
+ Q_ASSERT(metaType.isValid());
+ m_metaType = metaType.iface();
}
void *m_gadgetPtr;
- QQmlValueType *m_valueType;
+ const QtPrivate::QMetaTypeInterface *m_metaType;
const QMetaObject *m_metaObject;
};
@@ -107,12 +120,24 @@ public:
ExecutionEngine *engine, const void *, const QMetaObject *metaObject, QMetaType type);
QVariant toVariant() const;
+
+ template<typename ValueType>
+ ValueType *cast()
+ {
+ if (QMetaType::fromType<ValueType>() != d()->metaType())
+ return nullptr;
+ if (d()->isReference() && !readReferenceValue())
+ return nullptr;
+ return static_cast<ValueType *>(d()->gadgetPtr());
+ }
+
bool toGadget(void *data) const;
bool isEqual(const QVariant& value) const;
int typeId() const;
QMetaType type() const;
bool write(QObject *target, int propertyIndex) const;
bool readReferenceValue() const { return d()->readReference(); }
+ const QMetaObject *metaObject() const { return d()->metaObject(); }
QQmlPropertyData dataForPropertyKey(PropertyKey id) const;