diff options
author | Ulf Hermann <[email protected]> | 2022-09-27 10:21:55 +0200 |
---|---|---|
committer | Ulf Hermann <[email protected]> | 2022-10-13 00:18:35 +0200 |
commit | e1a0596924766d62459740ed0271114a7bb99851 (patch) | |
tree | 5ac17c73668016ca0c3870fa799c3497537cf671 /src/qml/jsruntime/qv4qobjectwrapper.cpp | |
parent | 1a0c4094e0fce8693a4653a9b3cb80f832865495 (diff) |
V4: Refactor QQmlValueType{Wrapper|Reference} and QV4::Sequence
Every QQmlValueTypeWrapper is potentially a reference now. Since most
were already before, the overhead of checking the vtables at every step
was dubious at best.
Extract a common base class that handles the reading and writing of
object properties employed in both value type references and sequences.
Task-number: QTBUG-99766
Change-Id: Idf72d9a20a52366e5c2d0dcd4b3a18072c0ccc41
Reviewed-by: Fabian Kosmale <[email protected]>
Diffstat (limited to 'src/qml/jsruntime/qv4qobjectwrapper.cpp')
-rw-r--r-- | src/qml/jsruntime/qv4qobjectwrapper.cpp | 32 |
1 files changed, 8 insertions, 24 deletions
diff --git a/src/qml/jsruntime/qv4qobjectwrapper.cpp b/src/qml/jsruntime/qv4qobjectwrapper.cpp index 8103bb5ad9..0755dff34d 100644 --- a/src/qml/jsruntime/qv4qobjectwrapper.cpp +++ b/src/qml/jsruntime/qv4qobjectwrapper.cpp @@ -2218,9 +2218,9 @@ ReturnedValue QObjectMethod::create( Scoped<QQmlValueTypeWrapper> valueTypeWrapper(valueScope); if (cloneFrom->valueTypeWrapper) { - Scoped<QQmlValueTypeReference> ref(valueScope, cloneFrom->valueTypeWrapper); + Scoped<QQmlValueTypeWrapper> ref(valueScope, cloneFrom->valueTypeWrapper); if (ref) { - valueTypeWrapper = QQmlValueTypeReference::create(engine, ref->d(), object); + valueTypeWrapper = QQmlValueTypeWrapper::create(engine, ref->d(), object); } else { // We cannot re-attach a plain QQmlValueTypeWrapper because don't we know what // value we should operate on. Without knowledge of the property the value @@ -2271,14 +2271,8 @@ bool Heap::QObjectMethod::isDetached() const if (qObj.isValid()) return false; - if (Heap::QQmlValueTypeWrapper *wrapper = valueTypeWrapper.get()) { - const VTable *vt = wrapper->internalClass->vtable; - while (vt && vt != QV4::QQmlValueTypeWrapper::staticVTable()) { - if (vt == QV4::QQmlValueTypeReference::staticVTable()) - return static_cast<Heap::QQmlValueTypeReference *>(wrapper)->object.isNull(); - vt = vt->parent; - } - } + if (Heap::QQmlValueTypeWrapper *wrapper = valueTypeWrapper.get()) + return wrapper->object() == nullptr; return true; } @@ -2288,17 +2282,8 @@ bool Heap::QObjectMethod::isAttachedTo(QObject *o) const if (qObj.isValid() && qObj != o) return false; - if (Heap::QQmlValueTypeWrapper *wrapper = valueTypeWrapper.get()) { - const VTable *vt = wrapper->internalClass->vtable; - while (vt && vt != QV4::QQmlValueTypeWrapper::staticVTable()) { - if (vt == QV4::QQmlValueTypeReference::staticVTable()) { - if (static_cast<Heap::QQmlValueTypeReference *>(wrapper)->object != o) - return false; - break; - } - vt = vt->parent; - } - } + if (Heap::QQmlValueTypeWrapper *wrapper = valueTypeWrapper.get()) + return wrapper->object() == o; return true; } @@ -2455,10 +2440,9 @@ ReturnedValue QObjectMethod::callInternal(const Value *thisObject, const Value * // The method might change the value. const auto doCall = [&](const auto &call) { if (!method->isConstant()) { - Scoped<QQmlValueTypeReference> ref(scope, d()->valueTypeWrapper); - if (ref) { + if (d()->valueTypeWrapper && d()->valueTypeWrapper->isReference()) { ScopedValue rv(scope, call()); - ref->d()->writeBack(); + d()->valueTypeWrapper->writeBack(); return rv->asReturnedValue(); } } |