From 110e82f5e916b6171ca257777ce5cbbbceb35714 Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Wed, 4 Nov 2015 13:59:10 +0100 Subject: 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) Reviewed-by: Oswald Buddenhagen --- src/corelib/tools/qstring.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) (limited to 'src/corelib/tools/qstring.cpp') 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 #endif #include +#include #include "qsimd_p.h" #include #include @@ -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::max()) ? int(result) : 0; } /*! -- cgit v1.2.3