From b98cf4fc4afaf55145c34ba06d61fec38fadc25d Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Fri, 6 Dec 2024 08:19:20 -0800 Subject: [PATCH] QString::fromUcs4: use std::char_traits or wcslen() to find the size ... when the user passes size = -1. std::char_traits::length() doesn't appear to be an any better implementation than our simple loop, but maybe some compiler will optimize it. wcslen() is usually optimized in the C libraries, even for Unix platforms that hardly ever use it (it's used as a fallback in qustrlen() for non-x86 Windows systems). Pick-to: 6.8 6.9 Change-Id: Ia143270869a3a7cf5754fffdc17e500fc454397b Reviewed-by: Edward Welbourne --- src/corelib/text/qstring.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/corelib/text/qstring.cpp b/src/corelib/text/qstring.cpp index 63519c99753..6c522b81bbc 100644 --- a/src/corelib/text/qstring.cpp +++ b/src/corelib/text/qstring.cpp @@ -6115,9 +6115,10 @@ QString QString::fromUcs4(const char32_t *unicode, qsizetype size) if (!unicode) return QString(); if (size < 0) { - size = 0; - while (unicode[size] != 0) - ++size; + if constexpr (sizeof(char32_t) == sizeof(wchar_t)) + size = wcslen(reinterpret_cast(unicode)); + else + size = std::char_traits::length(unicode); } QStringDecoder toUtf16(QStringDecoder::Utf32, QStringDecoder::Flag::Stateless); return toUtf16(QByteArrayView(reinterpret_cast(unicode), size * 4));