From 4256651047bae66d5c81b9ec5d5ff4e361443cf3 Mon Sep 17 00:00:00 2001 From: Giuseppe D'Angelo Date: Tue, 9 Apr 2024 08:40:15 +0200 Subject: [PATCH] QCborValue: avoid a double isAscii check The QCborValue(QL1S) constructor checks if the parameter is ASCII. If it's not, it converts it to a QString and stores as such. However, the QString is checked *again* for being ASCII. We know it isn't -- skip this recheck. Change-Id: I7a4776759b2b14aab955cffebde6e3b64f8ed1d1 Reviewed-by: Thiago Macieira --- src/corelib/serialization/qcborvalue.cpp | 6 ++++++ src/corelib/serialization/qcborvalue_p.h | 6 +++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/corelib/serialization/qcborvalue.cpp b/src/corelib/serialization/qcborvalue.cpp index b83ce226dc..ac8ba481dd 100644 --- a/src/corelib/serialization/qcborvalue.cpp +++ b/src/corelib/serialization/qcborvalue.cpp @@ -1065,6 +1065,12 @@ Q_NEVER_INLINE void QCborContainerPrivate::appendAsciiString(QStringView s) qt_to_latin1_unchecked(l, s.utf16(), len); } +void QCborContainerPrivate::appendNonAsciiString(QStringView s) +{ + appendByteData(reinterpret_cast(s.utf16()), s.size() * 2, + QCborValue::String, QtCbor::Element::StringIsUtf16); +} + QCborValue QCborContainerPrivate::extractAt_complex(Element e) { // create a new container for the returned value, containing the byte data diff --git a/src/corelib/serialization/qcborvalue_p.h b/src/corelib/serialization/qcborvalue_p.h index 9fa640fd63..ec8d559fd0 100644 --- a/src/corelib/serialization/qcborvalue_p.h +++ b/src/corelib/serialization/qcborvalue_p.h @@ -228,13 +228,14 @@ public: void append(QLatin1StringView s) { if (!QtPrivate::isAscii(s)) - return append(QString(s)); + return appendNonAsciiString(QString(s)); // US-ASCII is a subset of UTF-8, so we can keep in 8-bit appendByteData(s.latin1(), s.size(), QCborValue::String, QtCbor::Element::StringIsAscii); } void appendAsciiString(QStringView s); + void appendNonAsciiString(QStringView s); void append(const QString &s) { @@ -246,8 +247,7 @@ public: if (QtPrivate::isAscii(s)) appendAsciiString(s); else - appendByteData(reinterpret_cast(s.utf16()), s.size() * 2, - QCborValue::String, QtCbor::Element::StringIsUtf16); + appendNonAsciiString(s); } void append(const QCborValue &v) {