aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2022-10-05 17:01:21 +0200
committerUlf Hermann <ulf.hermann@qt.io>2022-10-07 15:17:02 +0200
commit81faddec9c6607834da4fdb931f81f29e1f7ac69 (patch)
treeb71d0df5f0febaf5b24bab4baa9d718e64436112
parent8d9fd352f8b7fb80e75372d6ad337264887a3b14 (diff)
V4: Drop extra QVariant parameter from fromData()
The data needs to be copied anyway if we are going to store it in ScarceResourceObject. We can just as well copy it from the void pointer. Change-Id: Ic106221138b1236a6ddea20cfdb468c6fbe3e1c3 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
-rw-r--r--src/qml/jsruntime/qv4engine.cpp18
-rw-r--r--src/qml/jsruntime/qv4engine_p.h7
-rw-r--r--src/qml/jsruntime/qv4variantobject.cpp4
-rw-r--r--src/qml/jsruntime/qv4variantobject_p.h2
-rw-r--r--src/qml/qml/qqmlvaluetypewrapper.cpp3
-rw-r--r--src/qml/qml/qqmlvmemetaobject.cpp8
-rw-r--r--src/qml/qml/qqmlvmemetaobject_p.h5
-rw-r--r--tests/auto/qml/qjsengine/tst_qjsengine.cpp3
8 files changed, 24 insertions, 26 deletions
diff --git a/src/qml/jsruntime/qv4engine.cpp b/src/qml/jsruntime/qv4engine.cpp
index f28f3ab273..91e5c62f8c 100644
--- a/src/qml/jsruntime/qv4engine.cpp
+++ b/src/qml/jsruntime/qv4engine.cpp
@@ -1186,9 +1186,9 @@ Heap::Object *ExecutionEngine::newEvalErrorObject(const QString &message)
return ErrorObject::create<EvalErrorObject>(this, message);
}
-Heap::Object *ExecutionEngine::newVariantObject(const QVariant &v)
+Heap::Object *ExecutionEngine::newVariantObject(const QMetaType type, const void *data)
{
- return memoryManager->allocate<VariantObject>(v);
+ return memoryManager->allocate<VariantObject>(type, data);
}
Heap::Object *ExecutionEngine::newForInIteratorObject(Object *o)
@@ -1750,13 +1750,9 @@ static QVariant objectToVariant(const QV4::Object *o, V4ObjectSet *visitedObject
/*!
\internal
- Transform the given \a metaType and \a ptr into a JavaScript representation. You can pass an
- optional \a variant in order to avoid the construction of a new QVariant in case the value
- has to be stored as a variant object. In that case, the contents of \a variant have to be
- exactly the same as \a metaType and \a ptr.
+ Transform the given \a metaType and \a ptr into a JavaScript representation.
*/
-QV4::ReturnedValue ExecutionEngine::fromData(
- QMetaType metaType, const void *ptr, const QVariant *variant)
+QV4::ReturnedValue ExecutionEngine::fromData(QMetaType metaType, const void *ptr)
{
const int type = metaType.id();
if (type < QMetaType::User) {
@@ -1838,7 +1834,7 @@ QV4::ReturnedValue ExecutionEngine::fromData(
case QMetaType::QPixmap:
case QMetaType::QImage:
// Scarce value types
- return QV4::Encode(newVariantObject(variant ? *variant : QVariant(metaType, ptr)));
+ return QV4::Encode(newVariantObject(metaType, ptr));
default:
break;
}
@@ -1906,12 +1902,12 @@ QV4::ReturnedValue ExecutionEngine::fromData(
if (metaType.flags() & QMetaType::IsEnumeration)
return QV4::Encode(*reinterpret_cast<const int *>(ptr));
- return QV4::Encode(newVariantObject(variant ? *variant : QVariant(metaType, ptr)));
+ return QV4::Encode(newVariantObject(metaType, ptr));
}
QV4::ReturnedValue QV4::ExecutionEngine::fromVariant(const QVariant &variant)
{
- return fromData(variant.metaType(), variant.constData(), &variant);
+ return fromData(variant.metaType(), variant.constData());
}
QVariantMap ExecutionEngine::variantMapFromJS(const Object *o)
diff --git a/src/qml/jsruntime/qv4engine_p.h b/src/qml/jsruntime/qv4engine_p.h
index 8d27d1b719..aa4a6bacd9 100644
--- a/src/qml/jsruntime/qv4engine_p.h
+++ b/src/qml/jsruntime/qv4engine_p.h
@@ -486,7 +486,8 @@ public:
// calling preserve() on the object which removes it from this scarceResource list.
class ScarceResourceData {
public:
- ScarceResourceData(const QVariant &data = QVariant()) : data(data) {}
+ ScarceResourceData() = default;
+ ScarceResourceData(const QMetaType type, const void *data) : data(type, data) {}
QVariant data;
QIntrusiveListNode node;
};
@@ -575,7 +576,7 @@ public:
Heap::Object *newPromiseObject(const QV4::FunctionObject *thisObject, const QV4::PromiseCapability *capability);
Promise::ReactionHandler *getPromiseReactionHandler();
- Heap::Object *newVariantObject(const QVariant &v);
+ Heap::Object *newVariantObject(const QMetaType type, const void *data);
Heap::Object *newForInIteratorObject(Object *o);
Heap::Object *newSetIteratorObject(Object *o);
@@ -737,7 +738,7 @@ public:
QV4::ExecutionContext *ctxt, int argc, const QV4::Value *argv);
private:
- QV4::ReturnedValue fromData(QMetaType type, const void *ptr, const QVariant *variant = nullptr);
+ QV4::ReturnedValue fromData(QMetaType type, const void *ptr);
static void initializeStaticMembers();
static int s_maxCallDepth;
diff --git a/src/qml/jsruntime/qv4variantobject.cpp b/src/qml/jsruntime/qv4variantobject.cpp
index 478ad773b5..94f95ce813 100644
--- a/src/qml/jsruntime/qv4variantobject.cpp
+++ b/src/qml/jsruntime/qv4variantobject.cpp
@@ -18,10 +18,10 @@ void Heap::VariantObject::init()
scarceData = new ExecutionEngine::ScarceResourceData;
}
-void Heap::VariantObject::init(const QVariant &value)
+void Heap::VariantObject::init(const QMetaType type, const void *data)
{
Object::init();
- scarceData = new ExecutionEngine::ScarceResourceData(value);
+ scarceData = new ExecutionEngine::ScarceResourceData(type, data);
if (isScarce())
removeVmePropertyReference();
}
diff --git a/src/qml/jsruntime/qv4variantobject_p.h b/src/qml/jsruntime/qv4variantobject_p.h
index 9b398796bb..1a4e0eeaa7 100644
--- a/src/qml/jsruntime/qv4variantobject_p.h
+++ b/src/qml/jsruntime/qv4variantobject_p.h
@@ -31,7 +31,7 @@ namespace Heap {
struct VariantObject : Object
{
void init();
- void init(const QVariant &value);
+ void init(const QMetaType type, const void *data);
void destroy() {
Q_ASSERT(scarceData);
if (isScarce())
diff --git a/src/qml/qml/qqmlvaluetypewrapper.cpp b/src/qml/qml/qqmlvaluetypewrapper.cpp
index 067ea8ad86..b30c3f426b 100644
--- a/src/qml/qml/qqmlvaluetypewrapper.cpp
+++ b/src/qml/qml/qqmlvaluetypewrapper.cpp
@@ -72,7 +72,6 @@ QVariant Heap::QQmlValueTypeWrapper::toVariant() const
return QVariant(valueType()->metaType, gadgetPtr());
}
-
ReturnedValue QQmlValueTypeReference::create(
ExecutionEngine *engine, Heap::QQmlValueTypeReference *cloneFrom, QObject *object)
{
@@ -343,7 +342,7 @@ static ReturnedValue getGadgetProperty(ExecutionEngine *engine,
void *args[] = { v.data(), nullptr };
metaObject->d.static_metacall(reinterpret_cast<QObject*>(valueTypeWrapper->gadgetPtr()),
QMetaObject::ReadProperty, index, args);
- return Encode(engine->newVariantObject(v));
+ return Encode(engine->newVariantObject(metaType, v.constData()));
}
default:
break;
diff --git a/src/qml/qml/qqmlvmemetaobject.cpp b/src/qml/qml/qqmlvmemetaobject.cpp
index 46e5ad96da..20f4021b61 100644
--- a/src/qml/qml/qqmlvmemetaobject.cpp
+++ b/src/qml/qml/qqmlvmemetaobject.cpp
@@ -614,8 +614,8 @@ QVector<QQmlGuard<QObject>> *QQmlVMEMetaObject::readPropertyAsList(int id) const
QV4::Scope scope(engine);
QV4::Scoped<QV4::VariantObject> v(scope, *(md->data() + id));
if (!v || v->d()->data().metaType() != QMetaType::fromType<QVector<QQmlGuard<QObject>>>()) {
- QVariant variant(QVariant::fromValue(QVector<QQmlGuard<QObject>>()));
- v = engine->newVariantObject(variant);
+ const QVector<QQmlGuard<QObject>> guards;
+ v = engine->newVariantObject(QMetaType::fromType<QVector<QQmlGuard<QObject>>>(), &guards);
md->set(engine, id, v);
}
return static_cast<QVector<QQmlGuard<QObject>> *>(v->d()->data().data());
@@ -909,7 +909,7 @@ int QQmlVMEMetaObject::metaCall(QObject *o, QMetaObject::Call c, int _id, void *
} else {
needActivate = true;
md->set(engine, id, engine->newVariantObject(
- QVariant(propType, a[0])));
+ propType, a[0]));
}
}
} else {
@@ -1196,7 +1196,7 @@ void QQmlVMEMetaObject::writeProperty(int id, const QVariant &value)
v->d()->data() != value);
if (v)
v->removeVmePropertyReference();
- md->set(engine, id, engine->newVariantObject(value));
+ md->set(engine, id, engine->newVariantObject(value.metaType(), value.constData()));
v = static_cast<const QV4::VariantObject *>(md->data() + id);
v->addVmePropertyReference();
}
diff --git a/src/qml/qml/qqmlvmemetaobject_p.h b/src/qml/qml/qqmlvmemetaobject_p.h
index 8bcb42e671..8bf1a2bca8 100644
--- a/src/qml/qml/qqmlvmemetaobject_p.h
+++ b/src/qml/qml/qqmlvmemetaobject_p.h
@@ -187,8 +187,9 @@ public:
QV4::MemberData *md = propertyAndMethodStorageAsMemberData();
if (md) {
QV4::Scope scope(engine);
- QV4::Scoped<QV4::MemberData>(scope, md)->set(engine, id, engine->newVariantObject(
- QVariant::fromValue(v)));
+ QV4::Scoped<QV4::MemberData>(scope, md)->set(
+ engine, id, engine->newVariantObject(
+ QMetaType::fromType<VariantCompatible>(), &v));
}
}
diff --git a/tests/auto/qml/qjsengine/tst_qjsengine.cpp b/tests/auto/qml/qjsengine/tst_qjsengine.cpp
index 11f25d4fbb..5d4bf9be43 100644
--- a/tests/auto/qml/qjsengine/tst_qjsengine.cpp
+++ b/tests/auto/qml/qjsengine/tst_qjsengine.cpp
@@ -5493,7 +5493,8 @@ void tst_QJSEngine::urlObject()
QVERIFY(QV4::ExecutionEngine::metaTypeFromJS(urlValue, QMetaType::fromType<QUrl>(), &result1));
QCOMPARE(result1, url);
- QV4::ScopedValue urlVariantValue(scope, scope.engine->newVariantObject(urlVariant));
+ QV4::ScopedValue urlVariantValue(scope, scope.engine->newVariantObject(
+ QMetaType::fromType<QUrl>(), &url));
QVERIFY(urlVariantValue->isObject());
QUrl result2;
QVERIFY(QV4::ExecutionEngine::metaTypeFromJS(urlVariantValue, QMetaType::fromType<QUrl>(),