aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml
diff options
context:
space:
mode:
Diffstat (limited to 'src/qml')
-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
7 files changed, 22 insertions, 25 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));
}
}