aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jsruntime/qv4qobjectwrapper.cpp
diff options
context:
space:
mode:
authorUlf Hermann <[email protected]>2022-09-27 10:21:55 +0200
committerUlf Hermann <[email protected]>2022-10-13 00:18:35 +0200
commite1a0596924766d62459740ed0271114a7bb99851 (patch)
tree5ac17c73668016ca0c3870fa799c3497537cf671 /src/qml/jsruntime/qv4qobjectwrapper.cpp
parent1a0c4094e0fce8693a4653a9b3cb80f832865495 (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.cpp32
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();
}
}