aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/qml/qqmlvaluetypewrapper.cpp
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2023-05-16 10:39:57 +0200
committerUlf Hermann <ulf.hermann@qt.io>2023-05-17 12:57:40 +0200
commit30a95fa0ee4a456cc41d652bf5f6b3c1fce944fb (patch)
tree0260620b5e1dcc51066b44c8ebb81cf3650ab224 /src/qml/qml/qqmlvaluetypewrapper.cpp
parentb32e17ed4fabde0d59a564ef2ed7bfb9a70de6ea (diff)
QtQml: Use QMetaType in QQmlValueTypeWrapper
Retrieving the QQmlValueType is expensive and there is not a single place where we need anything but its QMetaObject. Retrieving only the meta object, on the other hand, is cheap. Change-Id: I3ad5574d64f1f67a4d4cf2886dc5c396e99ec91a Reviewed-by: Olivier De Cannière <olivier.decanniere@qt.io> Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Diffstat (limited to 'src/qml/qml/qqmlvaluetypewrapper.cpp')
-rw-r--r--src/qml/qml/qqmlvaluetypewrapper.cpp50
1 files changed, 24 insertions, 26 deletions
diff --git a/src/qml/qml/qqmlvaluetypewrapper.cpp b/src/qml/qml/qqmlvaluetypewrapper.cpp
index 3f2ff8ef8e..08af9d7635 100644
--- a/src/qml/qml/qqmlvaluetypewrapper.cpp
+++ b/src/qml/qml/qqmlvaluetypewrapper.cpp
@@ -46,13 +46,13 @@ namespace QV4 {
Heap::QQmlValueTypeWrapper *Heap::QQmlValueTypeWrapper::detached() const
{
return internalClass->engine->memoryManager->allocate<QV4::QQmlValueTypeWrapper>(
- m_gadgetPtr, m_valueType, m_metaObject, nullptr, -1, NoFlag);
+ m_gadgetPtr, QMetaType(m_metaType), m_metaObject, nullptr, -1, NoFlag);
}
void Heap::QQmlValueTypeWrapper::destroy()
{
if (m_gadgetPtr) {
- m_valueType->metaType().destruct(m_gadgetPtr);
+ metaType().destruct(m_gadgetPtr);
::operator delete(m_gadgetPtr);
}
ReferenceObject::destroy();
@@ -61,16 +61,16 @@ void Heap::QQmlValueTypeWrapper::destroy()
void Heap::QQmlValueTypeWrapper::setData(const void *data)
{
if (auto *gadget = gadgetPtr())
- valueType()->metaType().destruct(gadget);
+ metaType().destruct(gadget);
if (!gadgetPtr())
- setGadgetPtr(::operator new(valueType()->metaType().sizeOf()));
- valueType()->metaType().construct(gadgetPtr(), data);
+ setGadgetPtr(::operator new(metaType().sizeOf()));
+ metaType().construct(gadgetPtr(), data);
}
QVariant Heap::QQmlValueTypeWrapper::toVariant() const
{
Q_ASSERT(gadgetPtr());
- return QVariant(valueType()->metaType(), gadgetPtr());
+ return QVariant(metaType(), gadgetPtr());
}
bool Heap::QQmlValueTypeWrapper::setVariant(const QVariant &variant)
@@ -78,7 +78,7 @@ bool Heap::QQmlValueTypeWrapper::setVariant(const QVariant &variant)
Q_ASSERT(isVariant());
const QMetaType variantReferenceType = variant.metaType();
- if (variantReferenceType != valueType()->metaType()) {
+ if (variantReferenceType != 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
@@ -86,12 +86,12 @@ bool Heap::QQmlValueTypeWrapper::setVariant(const QVariant &variant)
if (QQmlMetaType::isValueType(variantReferenceType)) {
const QMetaObject *mo = QQmlMetaType::metaObjectForValueType(variantReferenceType);
if (gadgetPtr()) {
- valueType()->metaType().destruct(gadgetPtr());
+ metaType().destruct(gadgetPtr());
::operator delete(gadgetPtr());
}
setGadgetPtr(nullptr);
setMetaObject(mo);
- setValueType(QQmlMetaType::valueType(variantReferenceType));
+ setMetaType(variantReferenceType);
if (!mo)
return false;
} else {
@@ -106,8 +106,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(metaType().sizeOf()));
+ metaType().construct(gadgetPtr(), nullptr);
}
return gadgetPtr();
}
@@ -132,7 +132,7 @@ ReturnedValue QQmlValueTypeWrapper::create(
// Either we're enforcing the location, then we have to read right away.
// Or we don't then we lazy-load. In neither case we pass any data.
Scoped<QQmlValueTypeWrapper> r(scope, engine->memoryManager->allocate<QQmlValueTypeWrapper>(
- nullptr, cloneFrom->valueType(), cloneFrom->metaObject(),
+ nullptr, cloneFrom->metaType(), cloneFrom->metaObject(),
object, cloneFrom->property(), cloneFrom->flags()));
r->d()->setLocation(cloneFrom->function(), cloneFrom->statementIndex());
if (cloneFrom->enforcesLocation())
@@ -202,15 +202,14 @@ ReturnedValue QQmlValueTypeWrapper::create(
Scope scope(engine);
initProto(engine);
- auto valueType = QQmlMetaType::valueType(type);
- if (!valueType) {
+ if (!type.isValid()) {
return engine->throwTypeError(QLatin1String("Type %1 is not a value type")
.arg(QString::fromUtf8(type.name())));
}
// If data is given explicitly, we assume it has just been read from the property
Scoped<QQmlValueTypeWrapper> r(scope, engine->memoryManager->allocate<QQmlValueTypeWrapper>(
- data, valueType, metaObject, object, property, flags));
+ data, type, metaObject, object, property, flags));
if (CppStackFrame *frame = engine->currentStackFrame)
r->d()->setLocation(frame->v4Function, frame->statementNumber());
if (!data && r->d()->enforcesLocation())
@@ -224,15 +223,14 @@ ReturnedValue QQmlValueTypeWrapper::create(
Scope scope(engine);
initProto(engine);
- auto valueType = QQmlMetaType::valueType(type);
- if (!valueType) {
+ if (!type.isValid()) {
return engine->throwTypeError(QLatin1String("Type %1 is not a value type")
.arg(QString::fromUtf8(type.name())));
}
Scoped<QQmlValueTypeWrapper> r(
scope, engine->memoryManager->allocate<QQmlValueTypeWrapper>(
- data, valueType, metaObject, nullptr, -1, Heap::ReferenceObject::NoFlag));
+ data, type, metaObject, nullptr, -1, Heap::ReferenceObject::NoFlag));
return r->asReturnedValue();
}
@@ -247,7 +245,7 @@ bool QQmlValueTypeWrapper::toGadget(void *data) const
{
if (d()->isReference() && !readReferenceValue())
return false;
- const QMetaType type = d()->valueType()->metaType();
+ const QMetaType type = d()->metaType();
type.destruct(data);
type.construct(data, d()->gadgetPtr());
return true;
@@ -559,12 +557,12 @@ bool QQmlValueTypeWrapper::isEqual(const QVariant& value) const
int QQmlValueTypeWrapper::typeId() const
{
- return d()->valueType()->metaType().id();
+ return d()->metaType().id();
}
QMetaType QQmlValueTypeWrapper::type() const
{
- return d()->valueType()->metaType();
+ return d()->metaType();
}
bool QQmlValueTypeWrapper::write(QObject *target, int propertyIndex) const
@@ -573,9 +571,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()->metaType().sizeOf());
d()->setGadgetPtr(gadget);
- d()->valueType()->metaType().construct(d()->gadgetPtr(), nullptr);
+ d()->metaType().construct(d()->gadgetPtr(), nullptr);
destructGadgetOnExit = true;
}
if (!readReferenceValue())
@@ -588,7 +586,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()->metaType().destruct(d()->gadgetPtr());
d()->setGadgetPtr(nullptr);
}
return true;
@@ -625,9 +623,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()->metaType(), w->d()->gadgetPtr(),
QMetaType(QMetaType::QString), &result)) {
- result = QString::fromUtf8(w->d()->valueType()->metaType().name()) + QLatin1Char('(');
+ result = QString::fromUtf8(w->d()->metaType().name()) + QLatin1Char('(');
const QMetaObject *mo = w->d()->metaObject();
const int propCount = mo->propertyCount();
for (int i = 0; i < propCount; ++i) {