diff options
author | Liang Qi <liang.qi@qt.io> | 2019-01-29 12:18:53 +0100 |
---|---|---|
committer | Liang Qi <liang.qi@qt.io> | 2019-01-29 12:37:04 +0100 |
commit | 8ec2403603f82e7a0d43b4de04c97ef1c7f1ad35 (patch) | |
tree | d7099d5a7cf813f378064ef0348647f4e68b2692 /src/qml/qml | |
parent | 15525d2a309a6028d548797bc777e38905f36c46 (diff) | |
parent | 454676a8745a7334539449562a5fda47db2fc2ca (diff) |
Merge remote-tracking branch 'origin/5.12' into dev
Conflicts:
src/3rdparty/masm/yarr/YarrJIT.cpp
src/qml/compiler/qv4instr_moth.cpp
src/quick/handlers/qquicksinglepointhandler_p.h
src/quick/handlers/qquicktaphandler.cpp
src/quick/items/context2d/qquickcontext2d.cpp
Done-With: Ulf Hermann <ulf.hermann@qt.io>
Change-Id: I109453131f9f0a05316ae37c7d6ed1edc8c0f9d4
Diffstat (limited to 'src/qml/qml')
-rw-r--r-- | src/qml/qml/qqmlnotifier.cpp | 12 | ||||
-rw-r--r-- | src/qml/qml/qqmlnotifier_p.h | 61 |
2 files changed, 53 insertions, 20 deletions
diff --git a/src/qml/qml/qqmlnotifier.cpp b/src/qml/qml/qqmlnotifier.cpp index ac247ae0ad..0706b8c0cf 100644 --- a/src/qml/qml/qqmlnotifier.cpp +++ b/src/qml/qml/qqmlnotifier.cpp @@ -90,24 +90,20 @@ void QQmlNotifier::emitNotify(QQmlNotifierEndpoint *endpoint, void **a) NotifyListTraversalData &data = stack[i]; if (!data.endpoint->isNotifying()) { - data.originalSenderPtr = data.endpoint->senderPtr; + data.endpoint->startNotifying(&data.originalSenderPtr); data.disconnectWatch = &data.originalSenderPtr; - data.endpoint->senderPtr = qintptr(data.disconnectWatch) | 0x1; } else { data.disconnectWatch = (qintptr *)(data.endpoint->senderPtr & ~0x1); } } while (--i >= 0) { - const NotifyListTraversalData &data = stack.at(i); + NotifyListTraversalData &data = stack[i]; if (*data.disconnectWatch) { - Q_ASSERT(QQmlNotifier_callbacks[data.endpoint->callback]); QQmlNotifier_callbacks[data.endpoint->callback](data.endpoint, a); - if (data.disconnectWatch == &data.originalSenderPtr && data.originalSenderPtr) { - // End of notifying, restore values - data.endpoint->senderPtr = data.originalSenderPtr; + data.endpoint->stopNotifying(&data.originalSenderPtr); } } } @@ -137,7 +133,7 @@ void QQmlNotifierEndpoint::connect(QObject *source, int sourceSignal, QQmlEngine qPrintable(engineName)); } - senderPtr = qintptr(source); + setSender(qintptr(source)); this->sourceSignal = sourceSignal; QQmlPropertyPrivate::flushSignal(source, sourceSignal); QQmlData *ddata = QQmlData::get(source, true); diff --git a/src/qml/qml/qqmlnotifier_p.h b/src/qml/qml/qqmlnotifier_p.h index d77e314de5..67d80a9d86 100644 --- a/src/qml/qml/qqmlnotifier_p.h +++ b/src/qml/qml/qqmlnotifier_p.h @@ -105,10 +105,16 @@ public: inline void disconnect(); inline bool isNotifying() const; + inline void startNotifying(qintptr *originalSenderPtr); + inline void stopNotifying(qintptr *originalSenderPtr); + inline void cancelNotify(); inline int signalIndex() const { return sourceSignal; } + inline qintptr sender() const; + inline void setSender(qintptr sender); + inline QObject *senderAsObject() const; inline QQmlNotifier *senderAsNotifier() const; @@ -138,12 +144,9 @@ QQmlNotifier::~QQmlNotifier() while (endpoint) { QQmlNotifierEndpoint *n = endpoint; endpoint = n->next; - - if (n->isNotifying()) *((qintptr *)(n->senderPtr & ~0x1)) = 0; - + n->setSender(0x0); n->next = nullptr; n->prev = nullptr; - n->senderPtr = 0; n->sourceSignal = -1; } endpoints = nullptr; @@ -193,7 +196,7 @@ void QQmlNotifierEndpoint::connect(QQmlNotifier *notifier) if (next) { next->prev = &next; } notifier->endpoints = this; prev = ¬ifier->endpoints; - senderPtr = qintptr(notifier); + setSender(qintptr(notifier)); } void QQmlNotifierEndpoint::disconnect() @@ -205,15 +208,15 @@ void QQmlNotifierEndpoint::disconnect() if (sourceSignal != -1) { QObject * const obj = senderAsObject(); + Q_ASSERT(obj); QObjectPrivate * const priv = QObjectPrivate::get(obj); if (needsConnectNotify) priv->disconnectNotify(QMetaObjectPrivate::signal(obj->metaObject(), sourceSignal)); } - if (isNotifying()) *((qintptr *)(senderPtr & ~0x1)) = 0; + setSender(0x0); next = nullptr; prev = nullptr; - senderPtr = 0; sourceSignal = -1; } @@ -229,26 +232,60 @@ bool QQmlNotifierEndpoint::isNotifying() const return senderPtr & 0x1; } +void QQmlNotifierEndpoint::startNotifying(qintptr *originalSenderPtr) +{ + Q_ASSERT(*originalSenderPtr == 0); + // Set the endpoint to notifying: + // - Save the original senderPtr, + *originalSenderPtr = senderPtr; + // - Take a pointer of it, + // - And assign that to the senderPtr, including a flag to signify "notifying". + senderPtr = qintptr(originalSenderPtr) | 0x1; +} + +void QQmlNotifierEndpoint::stopNotifying(qintptr *originalSenderPtr) +{ + // End of notifying, restore values + Q_ASSERT((senderPtr & ~0x1) == qintptr(originalSenderPtr)); + senderPtr = *originalSenderPtr; + *originalSenderPtr = 0; +} + /*! Cancel any notifies that are in progress. */ void QQmlNotifierEndpoint::cancelNotify() { if (isNotifying()) { - qintptr sp = *((qintptr *)(senderPtr & ~0x1)); - *((qintptr *)(senderPtr & ~0x1)) = 0; - senderPtr = sp; + auto *ptr = (qintptr *)(senderPtr & ~0x1); + Q_ASSERT(ptr); + senderPtr = *ptr; + *ptr = 0; } } +qintptr QQmlNotifierEndpoint::sender() const +{ + return isNotifying() ? *(qintptr *)(senderPtr & ~0x1) : senderPtr; +} + +void QQmlNotifierEndpoint::setSender(qintptr sender) +{ + // If we're just notifying, we write through to the originalSenderPtr + if (isNotifying()) + *(qintptr *)(senderPtr & ~0x1) = sender; + else + senderPtr = sender; +} + QObject *QQmlNotifierEndpoint::senderAsObject() const { - return isNotifying()?((QObject *)(*((qintptr *)(senderPtr & ~0x1)))):((QObject *)senderPtr); + return (QObject *)(sender()); } QQmlNotifier *QQmlNotifierEndpoint::senderAsNotifier() const { - return isNotifying()?((QQmlNotifier *)(*((qintptr *)(senderPtr & ~0x1)))):((QQmlNotifier *)senderPtr); + return (QQmlNotifier *)(sender()); } QT_END_NAMESPACE |