aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/qml/qqmlengine.cpp
diff options
context:
space:
mode:
authorErik Verbruggen <erik.verbruggen@qt.io>2018-01-17 15:44:18 +0100
committerErik Verbruggen <erik.verbruggen@qt.io>2018-04-06 10:07:10 +0000
commitb780aeb0ce30b040b9057f1e2b447b08b24b45cb (patch)
tree4aeab0387da1a79266a418d7a148a29e12f5189e /src/qml/qml/qqmlengine.cpp
parenta22297cd1387413f7c5d7aeb74935905489aae34 (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/qml/qqmlengine.cpp')
-rw-r--r--src/qml/qml/qqmlengine.cpp79
1 files changed, 17 insertions, 62 deletions
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)