summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/corelib/tools/qbytearray.cpp19
-rw-r--r--src/corelib/tools/qbytearray.h2
-rw-r--r--src/corelib/tools/qstring.cpp18
-rw-r--r--src/corelib/tools/qstring.h5
4 files changed, 22 insertions, 22 deletions
diff --git a/src/corelib/tools/qbytearray.cpp b/src/corelib/tools/qbytearray.cpp
index 5961d682c5..731a1b163b 100644
--- a/src/corelib/tools/qbytearray.cpp
+++ b/src/corelib/tools/qbytearray.cpp
@@ -1432,7 +1432,7 @@ void QByteArray::resize(int size)
} else {
if (d->ref.isShared() || size > int(d->alloc)
|| (!d->capacityReserved && size < d->size && size < int(d->alloc) >> 1))
- realloc(qAllocMore(size, sizeof(Data)));
+ realloc(size, true);
if (int(d->alloc) >= size) {
d->size = size;
d->data()[size] = '\0';
@@ -1459,8 +1459,11 @@ QByteArray &QByteArray::fill(char ch, int size)
return *this;
}
-void QByteArray::realloc(int alloc)
+void QByteArray::realloc(int alloc, bool grow)
{
+ if (grow)
+ alloc = qAllocMore(alloc + 1, sizeof(Data)) - 1;
+
if (d->ref.isShared() || IS_RAW_DATA(d)) {
Data *x = static_cast<Data *>(malloc(sizeof(Data) + alloc + 1));
Q_CHECK_PTR(x);
@@ -1563,7 +1566,7 @@ QByteArray &QByteArray::prepend(const char *str, int len)
{
if (str) {
if (d->ref.isShared() || d->size + len > int(d->alloc))
- realloc(qAllocMore(d->size + len, sizeof(Data)));
+ realloc(d->size + len, true);
memmove(d->data()+len, d->data(), d->size);
memcpy(d->data(), str, len);
d->size += len;
@@ -1581,7 +1584,7 @@ QByteArray &QByteArray::prepend(const char *str, int len)
QByteArray &QByteArray::prepend(char ch)
{
if (d->ref.isShared() || d->size + 1 > int(d->alloc))
- realloc(qAllocMore(d->size + 1, sizeof(Data)));
+ realloc(d->size + 1, true);
memmove(d->data()+1, d->data(), d->size);
d->data()[0] = ch;
++d->size;
@@ -1619,7 +1622,7 @@ QByteArray &QByteArray::append(const QByteArray &ba)
*this = ba;
} else if (ba.d != &shared_null.ba) {
if (d->ref.isShared() || d->size + ba.d->size > int(d->alloc))
- realloc(qAllocMore(d->size + ba.d->size, sizeof(Data)));
+ realloc(d->size + ba.d->size, true);
memcpy(d->data() + d->size, ba.d->data(), ba.d->size);
d->size += ba.d->size;
d->data()[d->size] = '\0';
@@ -1653,7 +1656,7 @@ QByteArray& QByteArray::append(const char *str)
if (str) {
int len = strlen(str);
if (d->ref.isShared() || d->size + len > int(d->alloc))
- realloc(qAllocMore(d->size + len, sizeof(Data)));
+ realloc(d->size + len, true);
memcpy(d->data() + d->size, str, len + 1); // include null terminator
d->size += len;
}
@@ -1678,7 +1681,7 @@ QByteArray &QByteArray::append(const char *str, int len)
len = qstrlen(str);
if (str && len) {
if (d->ref.isShared() || d->size + len > int(d->alloc))
- realloc(qAllocMore(d->size + len, sizeof(Data)));
+ realloc(d->size + len, true);
memcpy(d->data() + d->size, str, len); // include null terminator
d->size += len;
d->data()[d->size] = '\0';
@@ -1695,7 +1698,7 @@ QByteArray &QByteArray::append(const char *str, int len)
QByteArray& QByteArray::append(char ch)
{
if (d->ref.isShared() || d->size + 1 > int(d->alloc))
- realloc(qAllocMore(d->size + 1, sizeof(Data)));
+ realloc(d->size + 1, true);
d->data()[d->size++] = ch;
d->data()[d->size] = '\0';
return *this;
diff --git a/src/corelib/tools/qbytearray.h b/src/corelib/tools/qbytearray.h
index 93e241904d..62273c55fd 100644
--- a/src/corelib/tools/qbytearray.h
+++ b/src/corelib/tools/qbytearray.h
@@ -406,7 +406,7 @@ private:
static const QStaticByteArrayData<1> shared_null;
static const QStaticByteArrayData<1> shared_empty;
Data *d;
- void realloc(int alloc);
+ void realloc(int alloc, bool grow = false);
void expand(int i);
QByteArray nulTerminated() const;
diff --git a/src/corelib/tools/qstring.cpp b/src/corelib/tools/qstring.cpp
index c5c43673bc..123d332bad 100644
--- a/src/corelib/tools/qstring.cpp
+++ b/src/corelib/tools/qstring.cpp
@@ -799,11 +799,6 @@ const QString::Null QString::null = { };
const QStaticStringData<1> QString::shared_null = { Q_STATIC_STRING_DATA_HEADER_INITIALIZER(0), { 0 } };
const QStaticStringData<1> QString::shared_empty = { Q_STATIC_STRING_DATA_HEADER_INITIALIZER(0), { 0 } };
-int QString::grow(int size)
-{
- return qAllocMore(size * sizeof(QChar), sizeof(Data)) / sizeof(QChar);
-}
-
/*! \typedef QString::ConstIterator
Qt-style synonym for QString::const_iterator.
@@ -1247,7 +1242,7 @@ void QString::resize(int size)
} else {
if (d->ref.isShared() || size > int(d->alloc) ||
(!d->capacityReserved && size < d->size && size < int(d->alloc) >> 1))
- realloc(grow(size));
+ realloc(size, true);
if (int(d->alloc) >= size) {
d->size = size;
d->data()[size] = '\0';
@@ -1306,8 +1301,11 @@ void QString::resize(int size)
*/
// ### Qt 5: rename reallocData() to avoid confusion. 197625
-void QString::realloc(int alloc)
+void QString::realloc(int alloc, bool grow)
{
+ if (grow)
+ alloc = qAllocMore((alloc+1) * sizeof(QChar), sizeof(Data)) / sizeof(QChar) - 1;
+
if (d->ref.isShared() || IS_RAW_DATA(d)) {
Data *x = static_cast<Data *>(::malloc(sizeof(Data) + (alloc+1) * sizeof(QChar)));
Q_CHECK_PTR(x);
@@ -1534,7 +1532,7 @@ QString &QString::append(const QString &str)
operator=(str);
} else {
if (d->ref.isShared() || d->size + str.d->size > int(d->alloc))
- realloc(grow(d->size + str.d->size));
+ realloc(d->size + str.d->size, true);
memcpy(d->data() + d->size, str.d->data(), str.d->size * sizeof(QChar));
d->size += str.d->size;
d->data()[d->size] = '\0';
@@ -1554,7 +1552,7 @@ QString &QString::append(const QLatin1String &str)
if (s) {
int len = str.size();
if (d->ref.isShared() || d->size + len > int(d->alloc))
- realloc(grow(d->size + len));
+ realloc(d->size + len, true);
ushort *i = d->data() + d->size;
while ((*i++ = *s++))
;
@@ -1597,7 +1595,7 @@ QString &QString::append(const QLatin1String &str)
QString &QString::append(QChar ch)
{
if (d->ref.isShared() || d->size + 1 > int(d->alloc))
- realloc(grow(d->size + 1));
+ realloc(d->size + 1, true);
d->data()[d->size++] = ch.unicode();
d->data()[d->size] = '\0';
return *this;
diff --git a/src/corelib/tools/qstring.h b/src/corelib/tools/qstring.h
index fd22eb78a8..36acf322fc 100644
--- a/src/corelib/tools/qstring.h
+++ b/src/corelib/tools/qstring.h
@@ -372,7 +372,7 @@ public:
inline QString &operator+=(QChar c) {
if (d->ref.isShared() || d->size + 1 > int(d->alloc))
- realloc(grow(d->size + 1));
+ realloc(d->size + 1, true);
d->data()[d->size++] = c.unicode();
d->data()[d->size] = '\0';
return *this;
@@ -649,9 +649,8 @@ private:
static const QStaticStringData<1> shared_empty;
Data *d;
- static int grow(int);
static void free(Data *);
- void realloc(int alloc);
+ void realloc(int alloc, bool grow = false);
void expand(int i);
void updateProperties() const;
QString multiArg(int numArgs, const QString **args) const;