summaryrefslogtreecommitdiffstats
path: root/src/corelib/tools
diff options
context:
space:
mode:
authorMarc Mutz <marc.mutz@kdab.com>2015-11-04 13:59:10 +0100
committerMarc Mutz <marc.mutz@kdab.com>2015-11-19 11:30:30 +0000
commit110e82f5e916b6171ca257777ce5cbbbceb35714 (patch)
treefd9b325e2c41c4dae827a86d358a68e0d982bd2f /src/corelib/tools
parente17629e32dff5a85110a1785a98768cdbe3f091d (diff)
QString::vasprintf: avoid allocating memory just to parse a number
Port parse_field_width from constructing a QString and then calling toInt() on it to use qstrtoull(). Not only do we not allocate memory anymore, we even don't need to copy the digits out of the format string - qstrtoull() does it all for us. In order to preserve behavior with the previous code, which consumed all digits before performing error checking on them, we also consume all digits, even if qstrtoull() would have returned the start of the range as the end pointer. Change-Id: Ief941ce3a8ea43d2e5475d9eab77d7d0d7abc450 Reviewed-by: Olivier Goffart (Woboq GmbH) <ogoffart@woboq.com> Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@theqtcompany.com>
Diffstat (limited to 'src/corelib/tools')
-rw-r--r--src/corelib/tools/qstring.cpp13
1 files changed, 9 insertions, 4 deletions
diff --git a/src/corelib/tools/qstring.cpp b/src/corelib/tools/qstring.cpp
index e0d2fc3a5e..b965e35175 100644
--- a/src/corelib/tools/qstring.cpp
+++ b/src/corelib/tools/qstring.cpp
@@ -40,6 +40,7 @@
#include <qtextcodec.h>
#endif
#include <private/qutfcodec_p.h>
+#include <private/qlocale_tools_p.h>
#include "qsimd_p.h"
#include <qnumeric.h>
#include <qdatastream.h>
@@ -5885,13 +5886,17 @@ static uint parse_flag_characters(const char * &c) Q_DECL_NOTHROW
static int parse_field_width(const char * &c)
{
- QString width_str;
- while (*c != '\0' && qIsDigit(*c))
- width_str.append(QLatin1Char(*c++));
+ Q_ASSERT(qIsDigit(*c));
// can't be negative - started with a digit
// contains at least one digit
- return width_str.toInt();
+ const char *endp;
+ bool ok;
+ const qulonglong result = qstrtoull(c, &endp, 10, &ok);
+ c = endp;
+ while (qIsDigit(*c)) // preserve Qt 5.5 behavior of consuming all digits, no matter how many
+ ++c;
+ return ok && result < qulonglong(std::numeric_limits<int>::max()) ? int(result) : 0;
}
/*!