diff options
Diffstat (limited to 'src/corelib/codecs')
-rw-r--r-- | src/corelib/codecs/qlatincodec.cpp | 22 | ||||
-rw-r--r-- | src/corelib/codecs/qtextcodec.cpp | 69 | ||||
-rw-r--r-- | src/corelib/codecs/qtextcodec_p.h | 2 | ||||
-rw-r--r-- | src/corelib/codecs/qutfcodec.cpp | 10 | ||||
-rw-r--r-- | src/corelib/codecs/qutfcodec_p.h | 2 |
5 files changed, 55 insertions, 50 deletions
diff --git a/src/corelib/codecs/qlatincodec.cpp b/src/corelib/codecs/qlatincodec.cpp index 1b53d26ef4..55e6f0ba4d 100644 --- a/src/corelib/codecs/qlatincodec.cpp +++ b/src/corelib/codecs/qlatincodec.cpp @@ -48,7 +48,7 @@ QLatin1Codec::~QLatin1Codec() QString QLatin1Codec::convertToUnicode(const char *chars, int len, ConverterState *) const { - if (chars == 0) + if (chars == nullptr) return QString(); return QString::fromLatin1(chars, len); @@ -62,7 +62,7 @@ QByteArray QLatin1Codec::convertFromUnicode(const QChar *ch, int len, ConverterS char *d = r.data(); int invalid = 0; for (int i = 0; i < len; ++i) { - if (ch[i] > 0xff) { + if (ch[i] > QChar(0xff)) { d[i] = replacement; ++invalid; } else { @@ -104,7 +104,7 @@ QLatin15Codec::~QLatin15Codec() QString QLatin15Codec::convertToUnicode(const char* chars, int len, ConverterState *) const { - if (chars == 0) + if (chars == nullptr) return QString(); QString str = QString::fromLatin1(chars, len); @@ -112,28 +112,28 @@ QString QLatin15Codec::convertToUnicode(const char* chars, int len, ConverterSta while(len--) { switch(uc->unicode()) { case 0xa4: - *uc = 0x20ac; + *uc = QChar(0x20ac); break; case 0xa6: - *uc = 0x0160; + *uc = QChar(0x0160); break; case 0xa8: - *uc = 0x0161; + *uc = QChar(0x0161); break; case 0xb4: - *uc = 0x017d; + *uc = QChar(0x017d); break; case 0xb8: - *uc = 0x017e; + *uc = QChar(0x017e); break; case 0xbc: - *uc = 0x0152; + *uc = QChar(0x0152); break; case 0xbd: - *uc = 0x0153; + *uc = QChar(0x0153); break; case 0xbe: - *uc = 0x0178; + *uc = QChar(0x0178); break; default: break; diff --git a/src/corelib/codecs/qtextcodec.cpp b/src/corelib/codecs/qtextcodec.cpp index b7bb3196af..06fd88da90 100644 --- a/src/corelib/codecs/qtextcodec.cpp +++ b/src/corelib/codecs/qtextcodec.cpp @@ -47,6 +47,7 @@ #include "qendian.h" #include "qfile.h" #include "qlist.h" +#include <private/qlocking_p.h> #include "qstringlist.h" #include "qvarlengtharray.h" #if !defined(QT_BOOTSTRAPPED) @@ -86,7 +87,7 @@ #endif // icu #endif // QT_BOOTSTRAPPED -#include "qmutex.h" +#include <mutex> #include <stdlib.h> #include <ctype.h> @@ -100,8 +101,16 @@ QT_BEGIN_NAMESPACE typedef QList<QTextCodec*>::ConstIterator TextCodecListConstIt; typedef QList<QByteArray>::ConstIterator ByteArrayListConstIt; -Q_GLOBAL_STATIC_WITH_ARGS(QMutex, textCodecsMutex, (QMutex::Recursive)); -QMutex *qTextCodecsMutex() { return textCodecsMutex(); } +Q_GLOBAL_STATIC(QRecursiveMutex, textCodecsMutex); + +class TextCodecsMutexLocker +{ + using Lock = decltype(qt_unique_lock(std::declval<QRecursiveMutex&>())); + // ### FIXME: this is used when textCodecsMutex already == nullptr + const Lock lock = qt_unique_lock(textCodecsMutex()); +public: + TextCodecsMutexLocker() {} // required d/t an ICC 19 bug +}; #if !QT_CONFIG(icu) static char qtolower(char c) @@ -159,10 +168,10 @@ static QTextCodec *setupLocaleMapper() { QCoreGlobalData *globalData = QCoreGlobalData::instance(); - QTextCodec *locale = 0; + QTextCodec *locale = nullptr; { - QMutexLocker locker(textCodecsMutex()); + const TextCodecsMutexLocker locker; if (globalData->allCodecs.isEmpty()) setup(); } @@ -208,7 +217,7 @@ static QTextCodec *setupLocaleMapper() // First part is getting that locale name. First try setlocale() which // definitely knows it, but since we cannot fully trust it, get ready // to fall back to environment variables. - const QByteArray ctype = setlocale(LC_CTYPE, 0); + const QByteArray ctype = setlocale(LC_CTYPE, nullptr); // Get the first nonempty value from $LC_ALL, $LC_CTYPE, and $LANG // environment variables. @@ -477,7 +486,7 @@ QTextCodec::ConverterState::~ConverterState() */ QTextCodec::QTextCodec() { - QMutexLocker locker(textCodecsMutex()); + const TextCodecsMutexLocker locker; QCoreGlobalData *globalInstance = QCoreGlobalData::instance(); if (globalInstance->allCodecs.isEmpty()) @@ -501,7 +510,7 @@ QTextCodec::~QTextCodec() globalData->codecForLocale.testAndSetRelaxed(this, nullptr); - QMutexLocker locker(textCodecsMutex()); + const TextCodecsMutexLocker locker; globalData->allCodecs.removeOne(this); @@ -532,23 +541,21 @@ QTextCodec::~QTextCodec() QTextCodec *QTextCodec::codecForName(const QByteArray &name) { if (name.isEmpty()) - return 0; + return nullptr; - QMutexLocker locker(textCodecsMutex()); + const TextCodecsMutexLocker locker; QCoreGlobalData *globalData = QCoreGlobalData::instance(); if (!globalData) - return 0; + return nullptr; setup(); #if !QT_CONFIG(icu) QTextCodecCache *cache = &globalData->codecCache; QTextCodec *codec; - if (cache) { - codec = cache->value(name); - if (codec) - return codec; - } + codec = cache->value(name); + if (codec) + return codec; for (TextCodecListConstIt it = globalData->allCodecs.constBegin(), cend = globalData->allCodecs.constEnd(); it != cend; ++it) { QTextCodec *cursor = *it; @@ -560,14 +567,13 @@ QTextCodec *QTextCodec::codecForName(const QByteArray &name) QList<QByteArray> aliases = cursor->aliases(); for (ByteArrayListConstIt ait = aliases.constBegin(), acend = aliases.constEnd(); ait != acend; ++ait) { if (qTextCodecNameMatch(*ait, name)) { - if (cache) - cache->insert(name, cursor); + cache->insert(name, cursor); return cursor; } } } - return 0; + return nullptr; #else return QIcuCodec::codecForNameUnlocked(name); #endif @@ -581,11 +587,11 @@ QTextCodec *QTextCodec::codecForName(const QByteArray &name) */ QTextCodec* QTextCodec::codecForMib(int mib) { - QMutexLocker locker(textCodecsMutex()); + const TextCodecsMutexLocker locker; QCoreGlobalData *globalData = QCoreGlobalData::instance(); if (!globalData) - return 0; + return nullptr; if (globalData->allCodecs.isEmpty()) setup(); @@ -611,7 +617,7 @@ QTextCodec* QTextCodec::codecForMib(int mib) #if QT_CONFIG(icu) return QIcuCodec::codecForMibUnlocked(mib); #else - return 0; + return nullptr; #endif } @@ -627,7 +633,7 @@ QTextCodec* QTextCodec::codecForMib(int mib) */ QList<QByteArray> QTextCodec::availableCodecs() { - QMutexLocker locker(textCodecsMutex()); + const TextCodecsMutexLocker locker; QCoreGlobalData *globalData = QCoreGlobalData::instance(); if (globalData->allCodecs.isEmpty()) @@ -659,7 +665,7 @@ QList<int> QTextCodec::availableMibs() #if QT_CONFIG(icu) return QIcuCodec::availableMibs(); #else - QMutexLocker locker(textCodecsMutex()); + const TextCodecsMutexLocker locker; QCoreGlobalData *globalData = QCoreGlobalData::instance(); if (globalData->allCodecs.isEmpty()) @@ -704,14 +710,13 @@ QTextCodec* QTextCodec::codecForLocale() { QCoreGlobalData *globalData = QCoreGlobalData::instance(); if (!globalData) - return 0; + return nullptr; QTextCodec *codec = globalData->codecForLocale.loadAcquire(); if (!codec) { #if QT_CONFIG(icu) - textCodecsMutex()->lock(); + const TextCodecsMutexLocker locker; codec = QIcuCodec::defaultCodecUnlocked(); - textCodecsMutex()->unlock(); #else // setupLocaleMapper locks as necessary codec = setupLocaleMapper(); @@ -830,7 +835,7 @@ QTextEncoder* QTextCodec::makeEncoder(QTextCodec::ConversionFlags flags) const */ QByteArray QTextCodec::fromUnicode(const QString& str) const { - return convertFromUnicode(str.constData(), str.length(), 0); + return convertFromUnicode(str.constData(), str.length(), nullptr); } #endif @@ -863,7 +868,7 @@ QByteArray QTextCodec::fromUnicode(QStringView str) const */ QString QTextCodec::toUnicode(const QByteArray& a) const { - return convertToUnicode(a.constData(), a.length(), 0); + return convertToUnicode(a.constData(), a.length(), nullptr); } /*! @@ -915,7 +920,7 @@ bool QTextCodec::canEncode(QStringView s) const QString QTextCodec::toUnicode(const char *chars) const { int len = qstrlen(chars); - return convertToUnicode(chars, len, 0); + return convertToUnicode(chars, len, nullptr); } @@ -1061,7 +1066,7 @@ QString QTextDecoder::toUnicode(const char *chars, int len) } // in qstring.cpp: -void qt_from_latin1(ushort *dst, const char *str, size_t size) Q_DECL_NOTHROW; +void qt_from_latin1(ushort *dst, const char *str, size_t size) noexcept; /*! \overload @@ -1110,7 +1115,7 @@ QString QTextDecoder::toUnicode(const QByteArray &ba) QTextCodec *QTextCodec::codecForHtml(const QByteArray &ba, QTextCodec *defaultCodec) { // determine charset - QTextCodec *c = QTextCodec::codecForUtfText(ba, 0); + QTextCodec *c = QTextCodec::codecForUtfText(ba, nullptr); if (!c) { static Q_RELAXED_CONSTEXPR auto matcher = qMakeStaticByteArrayMatcher("meta "); QByteArray header = ba.left(1024).toLower(); diff --git a/src/corelib/codecs/qtextcodec_p.h b/src/corelib/codecs/qtextcodec_p.h index 0e449d994c..7fcf6df984 100644 --- a/src/corelib/codecs/qtextcodec_p.h +++ b/src/corelib/codecs/qtextcodec_p.h @@ -98,7 +98,7 @@ public: struct ConverterState { ConverterState(ConversionFlags f = DefaultConversion) - : flags(f), remainingChars(0), invalidChars(0), d(0) { state_data[0] = state_data[1] = state_data[2] = 0; } + : flags(f), remainingChars(0), invalidChars(0), d(nullptr) { state_data[0] = state_data[1] = state_data[2] = 0; } ~ConverterState() { } ConversionFlags flags; int remainingChars; diff --git a/src/corelib/codecs/qutfcodec.cpp b/src/corelib/codecs/qutfcodec.cpp index 643c8ee475..af36bd7e2f 100644 --- a/src/corelib/codecs/qutfcodec.cpp +++ b/src/corelib/codecs/qutfcodec.cpp @@ -54,7 +54,7 @@ static const uchar utf8bom[] = { 0xef, 0xbb, 0xbf }; #if (defined(__SSE2__) && defined(QT_COMPILER_SUPPORTS_SSE2)) \ || (defined(__ARM_NEON__) && defined(Q_PROCESSOR_ARM_64)) -static Q_ALWAYS_INLINE uint qBitScanReverse(unsigned v) Q_DECL_NOTHROW +static Q_ALWAYS_INLINE uint qBitScanReverse(unsigned v) noexcept { uint result = qCountLeadingZeroBits(v); // Now Invert the result: clz will count *down* from the msb to the lsb, so the msb index is 31 @@ -504,7 +504,7 @@ QString QUtf8::convertToUnicode(const char *chars, int len) This function never throws. */ -QChar *QUtf8::convertToUnicode(QChar *buffer, const char *chars, int len) Q_DECL_NOTHROW +QChar *QUtf8::convertToUnicode(QChar *buffer, const char *chars, int len) noexcept { ushort *dst = reinterpret_cast<ushort *>(buffer); const uchar *src = reinterpret_cast<const uchar *>(chars); @@ -951,10 +951,10 @@ QString QUtf32::convertToUnicode(const char *chars, int len, QTextCodec::Convert } uint code = (endian == BigEndianness) ? qFromBigEndian<quint32>(tuple) : qFromLittleEndian<quint32>(tuple); if (QChar::requiresSurrogates(code)) { - *qch++ = QChar::highSurrogate(code); - *qch++ = QChar::lowSurrogate(code); + *qch++ = QChar(QChar::highSurrogate(code)); + *qch++ = QChar(QChar::lowSurrogate(code)); } else { - *qch++ = code; + *qch++ = QChar(code); } num = 0; } diff --git a/src/corelib/codecs/qutfcodec_p.h b/src/corelib/codecs/qutfcodec_p.h index b24283ac5e..083e16317a 100644 --- a/src/corelib/codecs/qutfcodec_p.h +++ b/src/corelib/codecs/qutfcodec_p.h @@ -291,7 +291,7 @@ enum DataEndianness struct QUtf8 { - static QChar *convertToUnicode(QChar *, const char *, int) Q_DECL_NOTHROW; + static QChar *convertToUnicode(QChar *, const char *, int) noexcept; static QString convertToUnicode(const char *, int); static QString convertToUnicode(const char *, int, QTextCodec::ConverterState *); static QByteArray convertFromUnicode(const QChar *, int); |