diff options
Diffstat (limited to 'src/corelib/codecs')
-rw-r--r-- | src/corelib/codecs/qeucjpcodec_p.h | 10 | ||||
-rw-r--r-- | src/corelib/codecs/qeuckrcodec_p.h | 20 | ||||
-rw-r--r-- | src/corelib/codecs/qgb18030codec_p.h | 28 | ||||
-rw-r--r-- | src/corelib/codecs/qiconvcodec_p.h | 8 | ||||
-rw-r--r-- | src/corelib/codecs/qjiscodec_p.h | 10 | ||||
-rw-r--r-- | src/corelib/codecs/qjpunicode.cpp | 54 | ||||
-rw-r--r-- | src/corelib/codecs/qsjiscodec_p.h | 10 | ||||
-rw-r--r-- | src/corelib/codecs/qtextcodec.cpp | 18 | ||||
-rw-r--r-- | src/corelib/codecs/qutfcodec.cpp | 101 | ||||
-rw-r--r-- | src/corelib/codecs/qwindowscodec_p.h | 8 |
10 files changed, 165 insertions, 102 deletions
diff --git a/src/corelib/codecs/qeucjpcodec_p.h b/src/corelib/codecs/qeucjpcodec_p.h index 98ad286e9e..f2a9f923c8 100644 --- a/src/corelib/codecs/qeucjpcodec_p.h +++ b/src/corelib/codecs/qeucjpcodec_p.h @@ -94,12 +94,12 @@ public: static QList<QByteArray> _aliases() { return QList<QByteArray>(); } static int _mibEnum(); - QByteArray name() const { return _name(); } - QList<QByteArray> aliases() const { return _aliases(); } - int mibEnum() const { return _mibEnum(); } + QByteArray name() const override { return _name(); } + QList<QByteArray> aliases() const override { return _aliases(); } + int mibEnum() const override { return _mibEnum(); } - QString convertToUnicode(const char *, int, ConverterState *) const; - QByteArray convertFromUnicode(const QChar *, int, ConverterState *) const; + QString convertToUnicode(const char *, int, ConverterState *) const override; + QByteArray convertFromUnicode(const QChar *, int, ConverterState *) const override; QEucJpCodec(); ~QEucJpCodec(); diff --git a/src/corelib/codecs/qeuckrcodec_p.h b/src/corelib/codecs/qeuckrcodec_p.h index 2cf950a350..bedf0cf822 100644 --- a/src/corelib/codecs/qeuckrcodec_p.h +++ b/src/corelib/codecs/qeuckrcodec_p.h @@ -90,12 +90,12 @@ public: static QList<QByteArray> _aliases() { return QList<QByteArray>(); } static int _mibEnum(); - QByteArray name() const { return _name(); } - QList<QByteArray> aliases() const { return _aliases(); } - int mibEnum() const { return _mibEnum(); } + QByteArray name() const override { return _name(); } + QList<QByteArray> aliases() const override { return _aliases(); } + int mibEnum() const override { return _mibEnum(); } - QString convertToUnicode(const char *, int, ConverterState *) const; - QByteArray convertFromUnicode(const QChar *, int, ConverterState *) const; + QString convertToUnicode(const char *, int, ConverterState *) const override; + QByteArray convertFromUnicode(const QChar *, int, ConverterState *) const override; }; class QCP949Codec : public QTextCodec { @@ -104,12 +104,12 @@ public: static QList<QByteArray> _aliases(); static int _mibEnum(); - QByteArray name() const { return _name(); } - QList<QByteArray> aliases() const { return _aliases(); } - int mibEnum() const { return _mibEnum(); } + QByteArray name() const override { return _name(); } + QList<QByteArray> aliases() const override { return _aliases(); } + int mibEnum() const override { return _mibEnum(); } - QString convertToUnicode(const char *, int, ConverterState *) const; - QByteArray convertFromUnicode(const QChar *, int, ConverterState *) const; + QString convertToUnicode(const char *, int, ConverterState *) const override; + QByteArray convertFromUnicode(const QChar *, int, ConverterState *) const override; }; #endif // QT_NO_BIG_CODECS diff --git a/src/corelib/codecs/qgb18030codec_p.h b/src/corelib/codecs/qgb18030codec_p.h index dd136aeddb..635150b18e 100644 --- a/src/corelib/codecs/qgb18030codec_p.h +++ b/src/corelib/codecs/qgb18030codec_p.h @@ -69,12 +69,12 @@ public: static QList<QByteArray> _aliases() { return QList<QByteArray>(); } static int _mibEnum() { return 114; } - QByteArray name() const { return _name(); } - QList<QByteArray> aliases() const { return _aliases(); } - int mibEnum() const { return _mibEnum(); } + QByteArray name() const override { return _name(); } + QList<QByteArray> aliases() const override { return _aliases(); } + int mibEnum() const override { return _mibEnum(); } - QString convertToUnicode(const char *, int, ConverterState *) const; - QByteArray convertFromUnicode(const QChar *, int, ConverterState *) const; + QString convertToUnicode(const char *, int, ConverterState *) const override; + QByteArray convertFromUnicode(const QChar *, int, ConverterState *) const override; }; class QGbkCodec : public QGb18030Codec { @@ -85,12 +85,12 @@ public: static QList<QByteArray> _aliases(); static int _mibEnum(); - QByteArray name() const { return _name(); } - QList<QByteArray> aliases() const { return _aliases(); } - int mibEnum() const { return _mibEnum(); } + QByteArray name() const override { return _name(); } + QList<QByteArray> aliases() const override { return _aliases(); } + int mibEnum() const override { return _mibEnum(); } - QString convertToUnicode(const char *, int, ConverterState *) const; - QByteArray convertFromUnicode(const QChar *, int, ConverterState *) const; + QString convertToUnicode(const char *, int, ConverterState *) const override; + QByteArray convertFromUnicode(const QChar *, int, ConverterState *) const override; }; class QGb2312Codec : public QGb18030Codec { @@ -101,11 +101,11 @@ public: static QList<QByteArray> _aliases() { return QList<QByteArray>(); } static int _mibEnum(); - QByteArray name() const { return _name(); } - int mibEnum() const { return _mibEnum(); } + QByteArray name() const override { return _name(); } + int mibEnum() const override { return _mibEnum(); } - QString convertToUnicode(const char *, int, ConverterState *) const; - QByteArray convertFromUnicode(const QChar *, int, ConverterState *) const; + QString convertToUnicode(const char *, int, ConverterState *) const override; + QByteArray convertFromUnicode(const QChar *, int, ConverterState *) const override; }; #endif // QT_NO_BIG_CODECS diff --git a/src/corelib/codecs/qiconvcodec_p.h b/src/corelib/codecs/qiconvcodec_p.h index 9b8500538b..7d192232d7 100644 --- a/src/corelib/codecs/qiconvcodec_p.h +++ b/src/corelib/codecs/qiconvcodec_p.h @@ -69,11 +69,11 @@ public: QIconvCodec(); ~QIconvCodec(); - QString convertToUnicode(const char *, int, ConverterState *) const; - QByteArray convertFromUnicode(const QChar *, int, ConverterState *) const; + QString convertToUnicode(const char *, int, ConverterState *) const override; + QByteArray convertFromUnicode(const QChar *, int, ConverterState *) const override; - QByteArray name() const; - int mibEnum() const; + QByteArray name() const override; + int mibEnum() const override; void init() const; iconv_t createIconv_t(const char *to, const char *from) const; diff --git a/src/corelib/codecs/qjiscodec_p.h b/src/corelib/codecs/qjiscodec_p.h index 4db8728817..1ffe4a63f6 100644 --- a/src/corelib/codecs/qjiscodec_p.h +++ b/src/corelib/codecs/qjiscodec_p.h @@ -94,12 +94,12 @@ public: static QList<QByteArray> _aliases(); static int _mibEnum(); - QByteArray name() const { return _name(); } - QList<QByteArray> aliases() const { return _aliases(); } - int mibEnum() const { return _mibEnum(); } + QByteArray name() const override { return _name(); } + QList<QByteArray> aliases() const override { return _aliases(); } + int mibEnum() const override { return _mibEnum(); } - QString convertToUnicode(const char *, int, ConverterState *) const; - QByteArray convertFromUnicode(const QChar *, int, ConverterState *) const; + QString convertToUnicode(const char *, int, ConverterState *) const override; + QByteArray convertFromUnicode(const QChar *, int, ConverterState *) const override; QJisCodec(); ~QJisCodec(); diff --git a/src/corelib/codecs/qjpunicode.cpp b/src/corelib/codecs/qjpunicode.cpp index 0209843ecf..23112ce4d3 100644 --- a/src/corelib/codecs/qjpunicode.cpp +++ b/src/corelib/codecs/qjpunicode.cpp @@ -349,15 +349,15 @@ public: // uint Jisx0201ToUnicode(uint h, uint l) const; // uint Jisx0201LatinToUnicode(uint h, uint l) const; // uint Jisx0201KanaToUnicode(uint h, uint l) const; - uint jisx0208ToUnicode(uint h, uint l) const; - uint jisx0212ToUnicode(uint h, uint l) const; + uint jisx0208ToUnicode(uint h, uint l) const override; + uint jisx0212ToUnicode(uint h, uint l) const override; // uint UnicodeToAscii(uint h, uint l) const; // uint UnicodeToJisx0201(uint h, uint l) const; // uint UnicodeToJisx0201Latin(uint h, uint l) const; // uint UnicodeToJisx0201Kana(uint h, uint l) const; - uint unicodeToJisx0208(uint h, uint l) const; - uint unicodeToJisx0212(uint h, uint l) const; + uint unicodeToJisx0208(uint h, uint l) const override; + uint unicodeToJisx0212(uint h, uint l) const override; }; uint QJpUnicodeConv_Unicode_ASCII::jisx0208ToUnicode(uint h, uint l) const @@ -406,18 +406,18 @@ class QJpUnicodeConv_JISX0221_JISX0201 : public QJpUnicodeConv { public: QJpUnicodeConv_JISX0221_JISX0201(int r) : QJpUnicodeConv(r) {} - uint asciiToUnicode(uint h, uint l) const; + uint asciiToUnicode(uint h, uint l) const override; // uint Jisx0201ToUnicode(uint h, uint l) const; // uint Jisx0201LatinToUnicode(uint h, uint l) const; // uint Jisx0201KanaToUnicode(uint h, uint l) const; - uint jisx0208ToUnicode(uint h, uint l) const; + uint jisx0208ToUnicode(uint h, uint l) const override; // uint Jisx0212ToUnicode(uint h, uint l) const; - uint unicodeToAscii(uint h, uint l) const; + uint unicodeToAscii(uint h, uint l) const override; // uint UnicodeToJisx0201(uint h, uint l) const; // uint UnicodeToJisx0201Latin(uint h, uint l) const; // uint UnicodeToJisx0201Kana(uint h, uint l) const; - uint unicodeToJisx0208(uint h, uint l) const; + uint unicodeToJisx0208(uint h, uint l) const override; // uint UnicodeToJisx0212(uint h, uint l) const; }; @@ -462,17 +462,17 @@ public: // uint AsciiToUnicode(uint h, uint l) const; // uint Jisx0201ToUnicode(uint h, uint l) const; - uint jisx0201LatinToUnicode(uint h, uint l) const; + uint jisx0201LatinToUnicode(uint h, uint l) const override; // uint Jisx0201KanaToUnicode(uint h, uint l) const; - uint jisx0208ToUnicode(uint h, uint l) const; - uint jisx0212ToUnicode(uint h, uint l) const; + uint jisx0208ToUnicode(uint h, uint l) const override; + uint jisx0212ToUnicode(uint h, uint l) const override; // uint UnicodeToAscii(uint h, uint l) const; // uint UnicodeToJisx0201(uint h, uint l) const; - uint unicodeToJisx0201Latin(uint h, uint l) const; + uint unicodeToJisx0201Latin(uint h, uint l) const override; // uint UnicodeToJisx0201Kana(uint h, uint l) const; - uint unicodeToJisx0208(uint h, uint l) const; - uint unicodeToJisx0212(uint h, uint l) const; + uint unicodeToJisx0208(uint h, uint l) const override; + uint unicodeToJisx0212(uint h, uint l) const override; }; uint QJpUnicodeConv_JISX0221_ASCII::jisx0201LatinToUnicode(uint h, uint l) const @@ -558,17 +558,17 @@ public: // uint AsciiToUnicode(uint h, uint l) const; // uint Jisx0201ToUnicode(uint h, uint l) const; - uint jisx0201LatinToUnicode(uint h, uint l) const; + uint jisx0201LatinToUnicode(uint h, uint l) const override; // uint Jisx0201KanaToUnicode(uint h, uint l) const; - uint jisx0208ToUnicode(uint h, uint l) const; - uint jisx0212ToUnicode(uint h, uint l) const; + uint jisx0208ToUnicode(uint h, uint l) const override; + uint jisx0212ToUnicode(uint h, uint l) const override; - uint unicodeToAscii(uint h, uint l) const; + uint unicodeToAscii(uint h, uint l) const override; // uint UnicodeToJisx0201(uint h, uint l) const; - uint unicodeToJisx0201Latin(uint h, uint l) const; + uint unicodeToJisx0201Latin(uint h, uint l) const override; // uint UnicodeToJisx0201Kana(uint h, uint l) const; - uint unicodeToJisx0208(uint h, uint l) const; - uint unicodeToJisx0212(uint h, uint l) const; + uint unicodeToJisx0208(uint h, uint l) const override; + uint unicodeToJisx0212(uint h, uint l) const override; }; uint QJpUnicodeConv_Sun::jisx0201LatinToUnicode(uint h, uint l) const @@ -647,17 +647,17 @@ public: // uint AsciiToUnicode(uint h, uint l) const; // uint Jisx0201ToUnicode(uint h, uint l) const; - uint jisx0201LatinToUnicode(uint h, uint l) const; + uint jisx0201LatinToUnicode(uint h, uint l) const override; // uint Jisx0201KanaToUnicode(uint h, uint l) const; - uint jisx0208ToUnicode(uint h, uint l) const; - uint jisx0212ToUnicode(uint h, uint l) const; + uint jisx0208ToUnicode(uint h, uint l) const override; + uint jisx0212ToUnicode(uint h, uint l) const override; // uint UnicodeToAscii(uint h, uint l) const; // uint UnicodeToJisx0201(uint h, uint l) const; - uint unicodeToJisx0201Latin(uint h, uint l) const; + uint unicodeToJisx0201Latin(uint h, uint l) const override; // uint UnicodeToJisx0201Kana(uint h, uint l) const; - uint unicodeToJisx0208(uint h, uint l) const; - uint unicodeToJisx0212(uint h, uint l) const; + uint unicodeToJisx0208(uint h, uint l) const override; + uint unicodeToJisx0212(uint h, uint l) const override; }; uint QJpUnicodeConv_Microsoft::jisx0201LatinToUnicode(uint h, uint l) const diff --git a/src/corelib/codecs/qsjiscodec_p.h b/src/corelib/codecs/qsjiscodec_p.h index 7dfa6f7fe4..6257a7875c 100644 --- a/src/corelib/codecs/qsjiscodec_p.h +++ b/src/corelib/codecs/qsjiscodec_p.h @@ -94,12 +94,12 @@ public: static QList<QByteArray> _aliases(); static int _mibEnum(); - QByteArray name() const { return _name(); } - QList<QByteArray> aliases() const { return _aliases(); } - int mibEnum() const { return _mibEnum(); } + QByteArray name() const override { return _name(); } + QList<QByteArray> aliases() const override { return _aliases(); } + int mibEnum() const override { return _mibEnum(); } - QString convertToUnicode(const char *, int, ConverterState *) const; - QByteArray convertFromUnicode(const QChar *, int, ConverterState *) const; + QString convertToUnicode(const char *, int, ConverterState *) const override; + QByteArray convertFromUnicode(const QChar *, int, ConverterState *) const override; QSjisCodec(); ~QSjisCodec(); diff --git a/src/corelib/codecs/qtextcodec.cpp b/src/corelib/codecs/qtextcodec.cpp index 1541c498e6..7951e95db5 100644 --- a/src/corelib/codecs/qtextcodec.cpp +++ b/src/corelib/codecs/qtextcodec.cpp @@ -492,6 +492,24 @@ QTextCodec::QTextCodec() */ QTextCodec::~QTextCodec() { + QCoreGlobalData *globalData = QCoreGlobalData::instance(); + if (!globalData) + return; + + globalData->codecForLocale.testAndSetRelaxed(this, nullptr); + + QMutexLocker locker(textCodecsMutex()); + + globalData->allCodecs.removeOne(this); + + auto it = globalData->codecCache.cbegin(); + + while (it != globalData->codecCache.cend()) { + if (it.value() == this) + it = globalData->codecCache.erase(it); + else + ++it; + } } /*! diff --git a/src/corelib/codecs/qutfcodec.cpp b/src/corelib/codecs/qutfcodec.cpp index ce1b092a54..26c68cdee5 100644 --- a/src/corelib/codecs/qutfcodec.cpp +++ b/src/corelib/codecs/qutfcodec.cpp @@ -102,6 +102,26 @@ static inline bool simdEncodeAscii(uchar *&dst, const ushort *&nextAscii, const return false; } } + + if (end - src >= 8) { + // do eight characters at a time + __m128i data = _mm_loadu_si128(reinterpret_cast<const __m128i *>(src)); + __m128i packed = _mm_packus_epi16(data, data); + __m128i nonAscii = _mm_cmpgt_epi8(packed, _mm_setzero_si128()); + + // store even non-ASCII + _mm_storel_epi64(reinterpret_cast<__m128i *>(dst), packed); + + uchar n = ~_mm_movemask_epi8(nonAscii); + if (n) { + nextAscii = src + qBitScanReverse(n) + 1; + n = qCountTrailingZeroBits(n); + dst += n; + src += n; + return false; + } + } + return src == end; } @@ -150,11 +170,52 @@ static inline bool simdDecodeAscii(ushort *&dst, const uchar *&nextAscii, const return false; } + + if (end - src >= 8) { + __m128i data = _mm_loadl_epi64(reinterpret_cast<const __m128i *>(src)); + uint n = _mm_movemask_epi8(data) & 0xff; + if (!n) { + // unpack and store + _mm_storeu_si128(reinterpret_cast<__m128i *>(dst), _mm_unpacklo_epi8(data, _mm_setzero_si128())); + } else { + while (!(n & 1)) { + *dst++ = *src++; + n >>= 1; + } + + n = qBitScanReverse(n); + nextAscii = src + n + 1; + return false; + } + } + return src == end; } static inline const uchar *simdFindNonAscii(const uchar *src, const uchar *end, const uchar *&nextAscii) { +#ifdef __AVX2__ + // do 32 characters at a time + // (this is similar to simdTestMask in qstring.cpp) + const __m256i mask = _mm256_set1_epi8(0x80); + for ( ; end - src >= 32; src += 32) { + __m256i data = _mm256_loadu_si256(reinterpret_cast<const __m256i *>(src)); + if (_mm256_testz_si256(mask, data)) + continue; + + uint n = _mm256_movemask_epi8(data); + Q_ASSUME(n); + + // find the next probable ASCII character + // we don't want to load 32 bytes again in this loop if we know there are non-ASCII + // characters still coming + nextAscii = src + qBitScanReverse(n) + 1; + + // return the non-ASCII character + return src + qCountTrailingZeroBits(n); + } +#endif + // do sixteen characters at a time for ( ; end - src >= 16; src += 16) { __m128i data = _mm_loadu_si128(reinterpret_cast<const __m128i*>(src)); @@ -695,26 +756,16 @@ QByteArray QUtf16::convertFromUnicode(const QChar *uc, int len, QTextCodec::Conv char *data = d.data(); if (!state || !(state->flags & QTextCodec::IgnoreHeader)) { QChar bom(QChar::ByteOrderMark); - if (endian == BigEndianness) { - data[0] = bom.row(); - data[1] = bom.cell(); - } else { - data[0] = bom.cell(); - data[1] = bom.row(); - } + if (endian == BigEndianness) + qToBigEndian(bom.unicode(), data); + else + qToLittleEndian(bom.unicode(), data); data += 2; } - if (endian == BigEndianness) { - for (int i = 0; i < len; ++i) { - *(data++) = uc[i].row(); - *(data++) = uc[i].cell(); - } - } else { - for (int i = 0; i < len; ++i) { - *(data++) = uc[i].cell(); - *(data++) = uc[i].row(); - } - } + if (endian == BigEndianness) + qToBigEndian<ushort>(uc, len, data); + else + qToLittleEndian<ushort>(uc, len, data); if (state) { state->remainingChars = 0; @@ -830,20 +881,14 @@ QByteArray QUtf32::convertFromUnicode(const QChar *uc, int len, QTextCodec::Conv if (endian == BigEndianness) { while (i.hasNext()) { uint cp = i.next(); - - *(data++) = cp >> 24; - *(data++) = (cp >> 16) & 0xff; - *(data++) = (cp >> 8) & 0xff; - *(data++) = cp & 0xff; + qToBigEndian(cp, data); + data += 4; } } else { while (i.hasNext()) { uint cp = i.next(); - - *(data++) = cp & 0xff; - *(data++) = (cp >> 8) & 0xff; - *(data++) = (cp >> 16) & 0xff; - *(data++) = cp >> 24; + qToLittleEndian(cp, data); + data += 4; } } diff --git a/src/corelib/codecs/qwindowscodec_p.h b/src/corelib/codecs/qwindowscodec_p.h index 2fd3c35378..1a74d618be 100644 --- a/src/corelib/codecs/qwindowscodec_p.h +++ b/src/corelib/codecs/qwindowscodec_p.h @@ -61,12 +61,12 @@ public: QWindowsLocalCodec(); ~QWindowsLocalCodec(); - QString convertToUnicode(const char *, int, ConverterState *) const; - QByteArray convertFromUnicode(const QChar *, int, ConverterState *) const; + QString convertToUnicode(const char *, int, ConverterState *) const override; + QByteArray convertFromUnicode(const QChar *, int, ConverterState *) const override; QString convertToUnicodeCharByChar(const char *chars, int length, ConverterState *state) const; - QByteArray name() const; - int mibEnum() const; + QByteArray name() const override; + int mibEnum() const override; }; |