summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/corelib/tools/qarraydata.cpp9
-rw-r--r--src/corelib/tools/qarraydata.h23
-rw-r--r--tests/auto/corelib/text/qbytearray/tst_qbytearray.cpp9
-rw-r--r--tests/auto/corelib/tools/qarraydata/tst_qarraydata.cpp17
4 files changed, 13 insertions, 45 deletions
diff --git a/src/corelib/tools/qarraydata.cpp b/src/corelib/tools/qarraydata.cpp
index 9330a01a87..42599bbf2a 100644
--- a/src/corelib/tools/qarraydata.cpp
+++ b/src/corelib/tools/qarraydata.cpp
@@ -153,11 +153,11 @@ QT_WARNING_PUSH
QT_WARNING_DISABLE_GCC("-Wmissing-field-initializers")
const QArrayData QArrayData::shared_null[2] = {
- { Q_BASIC_ATOMIC_INITIALIZER(-1), QArrayData::StaticDataFlags, 0 }, // shared null
+ { Q_BASIC_ATOMIC_INITIALIZER(-1), 0, 0 }, // shared null
/* zero initialized terminator */};
static const QArrayData emptyNotNullShared[2] = {
- { Q_BASIC_ATOMIC_INITIALIZER(-1), QArrayData::StaticDataFlags, 0 }, // shared empty
+ { Q_BASIC_ATOMIC_INITIALIZER(-1), 0, 0 }, // shared empty
/* zero initialized terminator */};
QT_WARNING_POP
@@ -217,8 +217,6 @@ void *QArrayData::allocate(QArrayData **dptr, size_t objectSize, size_t alignmen
return nullptr;
size_t allocSize = calculateBlockSize(capacity, objectSize, headerSize, options);
- options |= AllocatedDataType | MutableData;
- options &= ~ImmutableHeader;
QArrayData *header = allocateData(allocSize, options);
quintptr data = 0;
if (header) {
@@ -241,7 +239,6 @@ QArrayData::reallocateUnaligned(QArrayData *data, void *dataPointer,
size_t headerSize = sizeof(QArrayData);
size_t allocSize = calculateBlockSize(capacity, objectSize, headerSize, options);
qptrdiff offset = dataPointer ? reinterpret_cast<char *>(dataPointer) - reinterpret_cast<char *>(data) : headerSize;
- options |= AllocatedDataType | MutableData;
QArrayData *header = static_cast<QArrayData *>(::realloc(data, size_t(allocSize)));
if (header) {
header->flags = options;
@@ -260,8 +257,6 @@ void QArrayData::deallocate(QArrayData *data, size_t objectSize,
Q_UNUSED(objectSize);
Q_UNUSED(alignment);
- Q_ASSERT_X(data == nullptr || !data->isStatic(), "QArrayData::deallocate",
- "Static data cannot be deleted");
::free(data);
}
diff --git a/src/corelib/tools/qarraydata.h b/src/corelib/tools/qarraydata.h
index c921e4eaa5..7624f7ad20 100644
--- a/src/corelib/tools/qarraydata.h
+++ b/src/corelib/tools/qarraydata.h
@@ -52,22 +52,11 @@ template <class T> struct QTypedArrayData;
struct Q_CORE_EXPORT QArrayData
{
enum ArrayOption {
- RawDataType = 0x0001, //!< this class is really a QArrayData
- AllocatedDataType = 0x0002, //!< this class is really a QArrayAllocatedData
- DataTypeBits = 0x000f,
-
- CapacityReserved = 0x0010, //!< the capacity was reserved by the user, try to keep it
- GrowsForward = 0x0020, //!< allocate with eyes towards growing through append()
- GrowsBackwards = 0x0040, //!< allocate with eyes towards growing through prepend()
- MutableData = 0x0080, //!< the data can be changed; doesn't say anything about the header
- ImmutableHeader = 0x0100, //!< the header is static, it can't be changed
-
- /// this option is used by the Q_ARRAY_LITERAL and similar macros
- StaticDataFlags = RawDataType | ImmutableHeader,
/// this option is used by the allocate() function
- DefaultAllocationFlags = MutableData,
- /// this option is used by the prepareRawData() function
- DefaultRawFlags = 0
+ DefaultAllocationFlags = 0,
+ CapacityReserved = 0x1, //!< the capacity was reserved by the user, try to keep it
+ GrowsForward = 0x2, //!< allocate with eyes towards growing through append()
+ GrowsBackwards = 0x4 //!< allocate with eyes towards growing through prepend()
};
Q_DECLARE_FLAGS(ArrayOptions, ArrayOption)
@@ -106,12 +95,12 @@ struct Q_CORE_EXPORT QArrayData
// follow COW principles.
bool isMutable() const
{
- return flags & MutableData;
+ return ref_.loadRelaxed() != -1;
}
bool isStatic() const
{
- return flags & ImmutableHeader;
+ return !isMutable();
}
bool isShared() const
diff --git a/tests/auto/corelib/text/qbytearray/tst_qbytearray.cpp b/tests/auto/corelib/text/qbytearray/tst_qbytearray.cpp
index 940865b98e..e566cc21a2 100644
--- a/tests/auto/corelib/text/qbytearray/tst_qbytearray.cpp
+++ b/tests/auto/corelib/text/qbytearray/tst_qbytearray.cpp
@@ -148,14 +148,13 @@ private slots:
void stdString();
};
-static const QArrayData staticDataFlags = { Q_BASIC_ATOMIC_INITIALIZER(-1), QArrayData::StaticDataFlags, 0 };
static const QByteArray::DataPointer staticStandard = {
- static_cast<QTypedArrayData<char> *>(const_cast<QArrayData *>(&staticDataFlags)),
+ nullptr,
const_cast<char *>("data"),
4
};
static const QByteArray::DataPointer staticNotNullTerminated = {
- static_cast<QTypedArrayData<char> *>(const_cast<QArrayData *>(&staticDataFlags)),
+ nullptr,
const_cast<char *>("dataBAD"),
4
};
@@ -168,8 +167,8 @@ QByteArray verifyZeroTermination(const QByteArray &ba)
QByteArray::DataPointer baDataPtr = const_cast<QByteArray &>(ba).data_ptr();
- // Skip if isStatic() or fromRawData(), as those offer no guarantees
- if (baDataPtr->isStatic() || baDataPtr->flags() & QArrayData::RawDataType)
+ // Skip if isStatic() as those offer no guarantees
+ if (baDataPtr->isStatic())
return ba;
int baSize = ba.size();
diff --git a/tests/auto/corelib/tools/qarraydata/tst_qarraydata.cpp b/tests/auto/corelib/tools/qarraydata/tst_qarraydata.cpp
index 5be774cc53..5c7484a49a 100644
--- a/tests/auto/corelib/tools/qarraydata/tst_qarraydata.cpp
+++ b/tests/auto/corelib/tools/qarraydata/tst_qarraydata.cpp
@@ -83,7 +83,7 @@ void tst_QArrayData::referenceCounting()
{
{
// Reference counting initialized to 1 (owned)
- QArrayData array = { Q_BASIC_ATOMIC_INITIALIZER(1), QArrayData::DefaultRawFlags, 0 };
+ QArrayData array = { Q_BASIC_ATOMIC_INITIALIZER(1), 0, 0 };
QCOMPARE(array.ref_.loadRelaxed(), 1);
@@ -106,21 +106,6 @@ void tst_QArrayData::referenceCounting()
// Now would be a good time to free/release allocated data
}
- {
- // Reference counting initialized to -1 (static read-only data)
- QArrayData array = { Q_BASIC_ATOMIC_INITIALIZER(-1), QArrayData::StaticDataFlags, 0 };
-
- QCOMPARE(array.ref_.loadRelaxed(), -1);
-
- QVERIFY(array.isStatic());
-
- QVERIFY(array.ref());
- QCOMPARE(array.ref_.loadRelaxed(), -1);
-
- QVERIFY(array.deref());
- QCOMPARE(array.ref_.loadRelaxed(), -1);
-
- }
}
void tst_QArrayData::sharedNullEmpty()