QStringBuilder: don't allocate memory in convertFromAscii()
Use new QUtf8::convertToUnicode(QChar*, const char*, int) overload instead of QString::fromUtf8(). The QUtf8 overload allocates no memory, and is therefore marked as nothrow. Using this function in convertFromAscii() allows to mark this function nothrow, too. All functions of QAbstractConcatenable can now be marked as nothrow. Since QUtf8::convertToUnicode() does not deal with lengths of -1, insert a strlen() call when the len == -1 ASCII fast path fails due to non-ASCII chars. Saves 1.1KiB in text size on optimized GCC 5.3 Linux AMD64 builds of QtCore (other libraries are compiled without exceptions, so this change should not have an effect on those). Change-Id: I7333e35844033831eae2a04203d13d9792c5d460 Reviewed-by: Olivier Goffart (Woboq GmbH) <ogoffart@woboq.com>
This commit is contained in:
parent
3ec093a758
commit
fb591c7366
@ -10609,7 +10609,7 @@ QString QString::toHtmlEscaped() const
|
||||
/*!
|
||||
\internal
|
||||
*/
|
||||
void QAbstractConcatenable::appendLatin1To(const char *a, int len, QChar *out)
|
||||
void QAbstractConcatenable::appendLatin1To(const char *a, int len, QChar *out) Q_DECL_NOTHROW
|
||||
{
|
||||
qt_from_latin1(reinterpret_cast<ushort *>(out), a, uint(len));
|
||||
}
|
||||
|
@ -39,6 +39,7 @@
|
||||
|
||||
#include "qstringbuilder.h"
|
||||
#include <QtCore/qtextcodec.h>
|
||||
#include <private/qutfcodec_p.h>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
@ -107,7 +108,7 @@ QT_BEGIN_NAMESPACE
|
||||
/*!
|
||||
\internal
|
||||
*/
|
||||
void QAbstractConcatenable::convertFromAscii(const char *a, int len, QChar *&out)
|
||||
void QAbstractConcatenable::convertFromAscii(const char *a, int len, QChar *&out) Q_DECL_NOTHROW
|
||||
{
|
||||
if (len == -1) {
|
||||
if (!a)
|
||||
@ -116,6 +117,7 @@ void QAbstractConcatenable::convertFromAscii(const char *a, int len, QChar *&out
|
||||
*out++ = QLatin1Char(*a++);
|
||||
if (!*a)
|
||||
return;
|
||||
len = int(strlen(a));
|
||||
} else {
|
||||
int i;
|
||||
for (i = 0; i < len && uchar(a[i]) < 0x80U; ++i)
|
||||
@ -127,9 +129,7 @@ void QAbstractConcatenable::convertFromAscii(const char *a, int len, QChar *&out
|
||||
}
|
||||
|
||||
// we need to complement with UTF-8 appending
|
||||
QString tmp = QString::fromUtf8(a, len);
|
||||
memcpy(out, reinterpret_cast<const char *>(tmp.constData()), sizeof(QChar) * tmp.size());
|
||||
out += tmp.size();
|
||||
out = QUtf8::convertToUnicode(out, a, len);
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
@ -58,12 +58,12 @@ QT_BEGIN_NAMESPACE
|
||||
struct Q_CORE_EXPORT QAbstractConcatenable
|
||||
{
|
||||
protected:
|
||||
static void convertFromAscii(const char *a, int len, QChar *&out);
|
||||
static inline void convertFromAscii(char a, QChar *&out)
|
||||
static void convertFromAscii(const char *a, int len, QChar *&out) Q_DECL_NOTHROW;
|
||||
static inline void convertFromAscii(char a, QChar *&out) Q_DECL_NOTHROW
|
||||
{
|
||||
*out++ = QLatin1Char(a);
|
||||
}
|
||||
static void appendLatin1To(const char *a, int len, QChar *out);
|
||||
static void appendLatin1To(const char *a, int len, QChar *out) Q_DECL_NOTHROW;
|
||||
};
|
||||
|
||||
template <typename T> struct QConcatenable {};
|
||||
|
Loading…
Reference in New Issue
Block a user