diff options
author | Fabian Kosmale <fabian.kosmale@qt.io> | 2022-07-07 10:41:30 +0200 |
---|---|---|
committer | Fabian Kosmale <fabian.kosmale@qt.io> | 2022-07-13 16:30:39 +0200 |
commit | 1d93b2234b107d8db4fbe56be0aaf7bc84541af9 (patch) | |
tree | abd5162ff98d1e430393e65b2e18a9d8ada255fc /src/qml/qml/qqmlvaluetypewrapper.cpp | |
parent | 111225b6c4a278ca18595a915a0e98009b374f60 (diff) |
Implement virtualHasProperty for QQmValueTypeWrapper
We do not have to use the generic path, given that we can just query the
meta-object for the existence of the property.
Task-number: QTBUG-104803
Change-Id: I9c4f7f8752e0cd8cfd63189538d6ca42523b3587
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
Diffstat (limited to 'src/qml/qml/qqmlvaluetypewrapper.cpp')
-rw-r--r-- | src/qml/qml/qqmlvaluetypewrapper.cpp | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/src/qml/qml/qqmlvaluetypewrapper.cpp b/src/qml/qml/qqmlvaluetypewrapper.cpp index 34de9faef9..1ded94983e 100644 --- a/src/qml/qml/qqmlvaluetypewrapper.cpp +++ b/src/qml/qml/qqmlvaluetypewrapper.cpp @@ -201,6 +201,32 @@ bool QQmlValueTypeWrapper::virtualIsEqualTo(Managed *m, Managed *other) return false; } +bool QQmlValueTypeWrapper::virtualHasProperty(const Managed *m, PropertyKey id) +{ + if (!id.isString()) + return Object::virtualHasProperty(m, id); + Q_ASSERT(m && m->as<QQmlValueTypeWrapper>()); + auto wrapper = static_cast<const QQmlValueTypeWrapper *>(m); + if (auto mo = wrapper->d()->metaObject()) + if (mo->indexOfProperty(id.toQString().toUtf8()) != -1) + return true; + + /* we don't want to fallback to QObject::virtualHasProperty + as that would end up calling getOwnProperty which is wasteful, + as it calls our own virtualGetOwnProperty. + As we know that our own properties are only those found on the meta-object, + we can instead skip the call, and simply check whether the property exists + on the prototype. + */ + Scope scope(m->engine()); + ScopedObject o(scope, m); + o = o->getPrototypeOf(); + if (o) + return o->hasProperty(id); + + return false; +} + static ReturnedValue getGadgetProperty(ExecutionEngine *engine, Heap::QQmlValueTypeWrapper *valueTypeWrapper, QMetaType metaType, quint16 coreIndex, bool isFunction, bool isEnum) |