diff options
Diffstat (limited to 'src/qml')
-rw-r--r-- | src/qml/jsruntime/qv4engine.cpp | 18 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4engine_p.h | 7 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4variantobject.cpp | 4 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4variantobject_p.h | 2 | ||||
-rw-r--r-- | src/qml/qml/qqmlvaluetypewrapper.cpp | 3 | ||||
-rw-r--r-- | src/qml/qml/qqmlvmemetaobject.cpp | 8 | ||||
-rw-r--r-- | src/qml/qml/qqmlvmemetaobject_p.h | 5 |
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)); } } |