diff options
author | Erik Verbruggen <erik.verbruggen@qt.io> | 2018-01-17 15:44:18 +0100 |
---|---|---|
committer | Erik Verbruggen <erik.verbruggen@qt.io> | 2018-04-06 10:07:10 +0000 |
commit | b780aeb0ce30b040b9057f1e2b447b08b24b45cb (patch) | |
tree | 4aeab0387da1a79266a418d7a148a29e12f5189e /src/qml | |
parent | a22297cd1387413f7c5d7aeb74935905489aae34 (diff) |
Allow for QQmlData::set*Bit and clear*Bit to be inlined
Change-Id: I216adf12e7ec402f3ccb4f846165171c9833f23b
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Diffstat (limited to 'src/qml')
-rw-r--r-- | src/qml/qml/qqmldata_p.h | 57 | ||||
-rw-r--r-- | src/qml/qml/qqmlengine.cpp | 79 |
2 files changed, 70 insertions, 66 deletions
diff --git a/src/qml/qml/qqmldata_p.h b/src/qml/qml/qqmldata_p.h index 20b96d2c4b..59fefde893 100644 --- a/src/qml/qml/qqmldata_p.h +++ b/src/qml/qml/qqmldata_p.h @@ -208,12 +208,12 @@ public: QQmlData**prevContextObject; inline bool hasBindingBit(int) const; - void clearBindingBit(int); - void setBindingBit(QObject *obj, int); + inline void setBindingBit(QObject *obj, int); + inline void clearBindingBit(int); inline bool hasPendingBindingBit(int index) const; - void setPendingBindingBit(QObject *obj, int); - void clearPendingBindingBit(int); + inline void setPendingBindingBit(QObject *obj, int); + inline void clearPendingBindingBit(int); quint16 lineNumber; quint16 columnNumber; @@ -304,6 +304,27 @@ private: const BindingBitsType *bits = (bindingBitsArraySize == InlineBindingArraySize) ? bindingBitsValue : bindingBits; return bits[offset] & bitFlagForBit(bit); } + + Q_ALWAYS_INLINE void clearBit(int bit) + { + uint offset = QQmlData::offsetForBit(bit); + if (bindingBitsArraySize > offset) { + BindingBitsType *bits = (bindingBitsArraySize == InlineBindingArraySize) ? bindingBitsValue : bindingBits; + bits[offset] &= ~QQmlData::bitFlagForBit(bit); + } + } + + Q_ALWAYS_INLINE void setBit(QObject *obj, int bit) + { + uint offset = QQmlData::offsetForBit(bit); + BindingBitsType *bits = (bindingBitsArraySize == InlineBindingArraySize) ? bindingBitsValue : bindingBits; + if (Q_UNLIKELY(bindingBitsArraySize <= offset)) + bits = growBits(obj, bit); + bits[offset] |= QQmlData::bitFlagForBit(bit); + } + + Q_NEVER_INLINE BindingBitsType *growBits(QObject *obj, int bit); + Q_DISABLE_COPY(QQmlData); }; @@ -356,6 +377,20 @@ bool QQmlData::hasBindingBit(int coreIndex) const return hasBitSet(coreIndex * 2); } +void QQmlData::setBindingBit(QObject *obj, int coreIndex) +{ + Q_ASSERT(coreIndex >= 0); + Q_ASSERT(coreIndex <= 0xffff); + setBit(obj, coreIndex * 2); +} + +void QQmlData::clearBindingBit(int coreIndex) +{ + Q_ASSERT(coreIndex >= 0); + Q_ASSERT(coreIndex <= 0xffff); + clearBit(coreIndex * 2); +} + bool QQmlData::hasPendingBindingBit(int coreIndex) const { Q_ASSERT(coreIndex >= 0); @@ -364,6 +399,20 @@ bool QQmlData::hasPendingBindingBit(int coreIndex) const return hasBitSet(coreIndex * 2 + 1); } +void QQmlData::setPendingBindingBit(QObject *obj, int coreIndex) +{ + Q_ASSERT(coreIndex >= 0); + Q_ASSERT(coreIndex <= 0xffff); + setBit(obj, coreIndex * 2 + 1); +} + +void QQmlData::clearPendingBindingBit(int coreIndex) +{ + Q_ASSERT(coreIndex >= 0); + Q_ASSERT(coreIndex <= 0xffff); + clearBit(coreIndex * 2 + 1); +} + void QQmlData::flushPendingBinding(QObject *o, QQmlPropertyIndex propertyIndex) { QQmlData *data = QQmlData::get(o, false); diff --git a/src/qml/qml/qqmlengine.cpp b/src/qml/qml/qqmlengine.cpp index 54a7c5130d..613f9b4fe5 100644 --- a/src/qml/qml/qqmlengine.cpp +++ b/src/qml/qml/qqmlengine.cpp @@ -111,12 +111,6 @@ Q_DECLARE_METATYPE(QQmlProperty) QT_BEGIN_NAMESPACE -typedef QQmlData::BindingBitsType BindingBitsType; -enum { - BitsPerType = QQmlData::BitsPerType, - InlineBindingArraySize = QQmlData::InlineBindingArraySize -}; - void qmlRegisterBaseTypes(const char *uri, int versionMajor, int versionMinor) { QQmlEnginePrivate::registerBaseTypes(uri, versionMajor, versionMinor); @@ -1896,66 +1890,27 @@ void QQmlData::parentChanged(QObject *object, QObject *parent) } } -static void QQmlData_setBit(QQmlData *data, QObject *obj, int bit) -{ - uint offset = QQmlData::offsetForBit(bit); - BindingBitsType *bits = (data->bindingBitsArraySize == InlineBindingArraySize) ? data->bindingBitsValue : data->bindingBits; - if (Q_UNLIKELY(data->bindingBitsArraySize <= offset)) { - int props = QQmlMetaObject(obj).propertyCount(); - Q_ASSERT(bit < 2 * props); - - uint arraySize = (2 * static_cast<uint>(props) + BitsPerType - 1) / BitsPerType; - Q_ASSERT(arraySize > InlineBindingArraySize && arraySize > data->bindingBitsArraySize); - - BindingBitsType *newBits = static_cast<BindingBitsType *>(malloc(arraySize*sizeof(BindingBitsType))); - memcpy(newBits, bits, data->bindingBitsArraySize * sizeof(BindingBitsType)); - memset(newBits + data->bindingBitsArraySize, 0, sizeof(BindingBitsType) * (arraySize - data->bindingBitsArraySize)); - - if (data->bindingBitsArraySize > InlineBindingArraySize) - free(bits); - data->bindingBits = newBits; - bits = newBits; - data->bindingBitsArraySize = arraySize; - } - Q_ASSERT(offset < data->bindingBitsArraySize); - bits[offset] |= QQmlData::bitFlagForBit(bit); -} - -static void QQmlData_clearBit(QQmlData *data, int bit) -{ - uint offset = QQmlData::offsetForBit(bit); - if (data->bindingBitsArraySize > offset) { - BindingBitsType *bits = (data->bindingBitsArraySize == InlineBindingArraySize) ? data->bindingBitsValue : data->bindingBits; - bits[offset] &= ~QQmlData::bitFlagForBit(bit); - } -} - -void QQmlData::clearBindingBit(int coreIndex) +QQmlData::BindingBitsType *QQmlData::growBits(QObject *obj, int bit) { - Q_ASSERT(coreIndex >= 0); - Q_ASSERT(coreIndex <= 0xffff); - QQmlData_clearBit(this, coreIndex * 2); -} + BindingBitsType *bits = (bindingBitsArraySize == InlineBindingArraySize) ? bindingBitsValue : bindingBits; + int props = QQmlMetaObject(obj).propertyCount(); + Q_ASSERT(bit < 2 * props); + Q_UNUSED(bit); // .. for Q_NO_DEBUG mode when the assert above expands to empty -void QQmlData::setBindingBit(QObject *obj, int coreIndex) -{ - Q_ASSERT(coreIndex >= 0); - Q_ASSERT(coreIndex <= 0xffff); - QQmlData_setBit(this, obj, coreIndex * 2); -} + uint arraySize = (2 * static_cast<uint>(props) + BitsPerType - 1) / BitsPerType; + Q_ASSERT(arraySize > 1); + Q_ASSERT(arraySize <= 0xffff); // max for bindingBitsArraySize -void QQmlData::clearPendingBindingBit(int coreIndex) -{ - Q_ASSERT(coreIndex >= 0); - Q_ASSERT(coreIndex <= 0xffff); - QQmlData_clearBit(this, coreIndex * 2 + 1); -} + BindingBitsType *newBits = static_cast<BindingBitsType *>(malloc(arraySize*sizeof(BindingBitsType))); + memcpy(newBits, bits, bindingBitsArraySize * sizeof(BindingBitsType)); + memset(newBits + bindingBitsArraySize, 0, sizeof(BindingBitsType) * (arraySize - bindingBitsArraySize)); -void QQmlData::setPendingBindingBit(QObject *obj, int coreIndex) -{ - Q_ASSERT(coreIndex >= 0); - Q_ASSERT(coreIndex <= 0xffff); - QQmlData_setBit(this, obj, coreIndex * 2 + 1); + if (bindingBitsArraySize > InlineBindingArraySize) + free(bits); + bindingBits = newBits; + bits = newBits; + bindingBitsArraySize = arraySize; + return bits; } QQmlData *QQmlData::createQQmlData(QObjectPrivate *priv) |