diff options
Diffstat (limited to 'src/corelib/text/qstring.cpp')
-rw-r--r-- | src/corelib/text/qstring.cpp | 77 |
1 files changed, 40 insertions, 37 deletions
diff --git a/src/corelib/text/qstring.cpp b/src/corelib/text/qstring.cpp index f0bf0c50a3..ad0d062e34 100644 --- a/src/corelib/text/qstring.cpp +++ b/src/corelib/text/qstring.cpp @@ -63,8 +63,8 @@ #endif #define REHASH(a) \ - if (sl_minus_1 < sizeof(std::size_t) * CHAR_BIT) \ - hashHaystack -= std::size_t(a) << sl_minus_1; \ + if (sl_minus_1 < sizeof(sl_minus_1) * CHAR_BIT) \ + hashHaystack -= decltype(hashHaystack)(a) << sl_minus_1; \ hashHaystack <<= 1 QT_BEGIN_NAMESPACE @@ -183,10 +183,10 @@ static qsizetype qLastIndexOf(Haystack haystack0, qsizetype from, const auto needle = needle0.data(); const auto *end = haystack; haystack += from; - const std::size_t sl_minus_1 = sl ? sl - 1 : 0; + const qregisteruint sl_minus_1 = sl ? sl - 1 : 0; const auto *n = needle + sl_minus_1; const auto *h = haystack + sl_minus_1; - std::size_t hashNeedle = 0, hashHaystack = 0; + qregisteruint hashNeedle = 0, hashHaystack = 0; if (cs == Qt::CaseSensitive) { for (qsizetype idx = 0; idx < sl; ++idx) { @@ -361,7 +361,7 @@ extern "C" void qt_toLatin1_mips_dsp_asm(uchar *dst, const char16_t *src, int le #if defined(__SSE2__) && defined(Q_CC_GNU) // We may overrun the buffer, but that's a false positive: // this won't crash nor produce incorrect results -# define ATTRIBUTE_NO_SANITIZE __attribute__((__no_sanitize_address__)) +# define ATTRIBUTE_NO_SANITIZE __attribute__((__no_sanitize_address__, __no_sanitize_thread__)) #else # define ATTRIBUTE_NO_SANITIZE #endif @@ -657,7 +657,7 @@ static int ucstrncmp_sse2(const char16_t *a, const Char *b, size_t l) Q_NEVER_INLINE qsizetype QtPrivate::qustrlen(const char16_t *str) noexcept { -#if defined(__SSE2__) && !(defined(__SANITIZE_ADDRESS__) || __has_feature(address_sanitizer)) +#if defined(__SSE2__) && !(defined(__SANITIZE_ADDRESS__) || __has_feature(address_sanitizer)) && !(defined(__SANITIZE_THREAD__) || __has_feature(thread_sanitizer)) return qustrlen_sse2(str); #endif @@ -1543,6 +1543,8 @@ int QtPrivate::compareStrings(QLatin1StringView lhs, QLatin1StringView rhs, Qt:: { if (lhs.isEmpty()) return qt_lencmp(qsizetype(0), rhs.size()); + if (rhs.isEmpty()) + return qt_lencmp(lhs.size(), qsizetype(0)); if (cs == Qt::CaseInsensitive) return latin1nicmp(lhs.data(), lhs.size(), rhs.data(), rhs.size()); const auto l = std::min(lhs.size(), rhs.size()); @@ -9140,18 +9142,13 @@ namespace { struct Part { Part() = default; // for QVarLengthArray; do not use - constexpr Part(QStringView s, int num = -1) - : tag{QtPrivate::ArgBase::U16}, number{num}, data{s.utf16()}, size{s.size()} {} - constexpr Part(QLatin1StringView s, int num = -1) - : tag{QtPrivate::ArgBase::L1}, number{num}, data{s.data()}, size{s.size()} {} + constexpr Part(QAnyStringView s, int num = -1) + : string{s}, number{num} {} - void reset(QStringView s) noexcept { *this = {s, number}; } - void reset(QLatin1StringView s) noexcept { *this = {s, number}; } + void reset(QAnyStringView s) noexcept { *this = {s, number}; } - QtPrivate::ArgBase::Tag tag; + QAnyStringView string; int number; - const void *data; - qsizetype size; }; } // unnamed namespace @@ -9234,16 +9231,13 @@ static qsizetype resolveStringRefsAndReturnTotalSize(ParseResult &parts, const A } } } - totalSize += part.size; + totalSize += part.string.size(); } return totalSize; } } // unnamed namespace -Q_ALWAYS_INLINE QString to_string(QLatin1StringView s) noexcept { return s; } -Q_ALWAYS_INLINE QString to_string(QStringView s) noexcept { return s.toString(); } - template <typename StringView> static QString argToQStringImpl(StringView pattern, size_t numArgs, const QtPrivate::ArgBase **args) { @@ -9257,7 +9251,7 @@ static QString argToQStringImpl(StringView pattern, size_t numArgs, const QtPriv argIndexToPlaceholderMap.resize(qsizetype(numArgs)); else if (Q_UNLIKELY(static_cast<size_t>(argIndexToPlaceholderMap.size()) < numArgs)) // 3b qWarning("QString::arg: %d argument(s) missing in %ls", - int(numArgs - argIndexToPlaceholderMap.size()), qUtf16Printable(to_string(pattern))); + int(numArgs - argIndexToPlaceholderMap.size()), qUtf16Printable(pattern.toString())); // 5 const qsizetype totalSize = resolveStringRefsAndReturnTotalSize(parts, argIndexToPlaceholderMap, args); @@ -9266,24 +9260,33 @@ static QString argToQStringImpl(StringView pattern, size_t numArgs, const QtPriv QString result(totalSize, Qt::Uninitialized); auto out = const_cast<QChar*>(result.constData()); - for (const Part &part : parts) { - switch (part.tag) { - case QtPrivate::ArgBase::L1: - if (part.size) { + struct Concatenate { + QChar *out; + QChar *operator()(QLatin1String part) noexcept + { + if (part.size()) { qt_from_latin1(reinterpret_cast<char16_t*>(out), - reinterpret_cast<const char*>(part.data), part.size); + part.data(), part.size()); } - break; - case QtPrivate::ArgBase::U8: - Q_UNREACHABLE(); // waiting for QUtf8String - break; - case QtPrivate::ArgBase::U16: - if (part.size) - memcpy(out, part.data, part.size * sizeof(QChar)); - break; + return out + part.size(); } - out += part.size; - } + QChar *operator()(QUtf8StringView part) noexcept + { + return QUtf8::convertToUnicode(out, part); + } + QChar *operator()(QStringView part) noexcept + { + if (part.size()) + memcpy(out, part.data(), part.size() * sizeof(QChar)); + return out + part.size(); + } + }; + + for (const Part &part : parts) + out = part.string.visit(Concatenate{out}); + + // UTF-8 decoding may have caused an overestimate of totalSize - correct it: + result.truncate(out - result.cbegin()); return result; } @@ -9905,8 +9908,8 @@ qsizetype QtPrivate::findString(QStringView haystack0, qsizetype from, QStringVi const char16_t *needle = needle0.utf16(); const char16_t *haystack = haystack0.utf16() + from; const char16_t *end = haystack0.utf16() + (l - sl); - const std::size_t sl_minus_1 = sl - 1; - std::size_t hashNeedle = 0, hashHaystack = 0; + const qregisteruint sl_minus_1 = sl - 1; + qregisteruint hashNeedle = 0, hashHaystack = 0; qsizetype idx; if (cs == Qt::CaseSensitive) { |