summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2020-05-26 11:11:08 +0200
committerVolker Hilsheimer <volker.hilsheimer@qt.io>2020-05-26 13:11:41 +0000
commit9980ba5ba58b30933e951bd8c4f9807c42b978fd (patch)
treeb37079ec1d63dd28127b398c1216d2b9a80fc84b /src
parenta989c9839371782a671112c360a0820834aba641 (diff)
Don't change the implementation of a method depending on QT_USE_QSTRINGUILDER
This is rather evil and caused crashes in static builds, when library and application where compiler with different settings of the QT_USE_QSTRINGBUILDER flag. The reason is that the implementation of QStringDecoder::operator() was different (and returning different data) with or without the setting. The compiler would thus create two very different versions of this method in different .o files. When linking the app, one of the implementations would be chosen, leading to crashes in places where the other one was expected. Fix this by only providing the QStringBuilder enabled version of the methods. They return a temporary object that's converatable to a QString/QByteArray anyway. Make sure that qdoc shows a simple signature. As a drive by fix a compile error in a code path that didn't get hit so far. Change-Id: I312fa564d0bc6b464f2b4466de1d53841f7b7b0f Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/corelib/text/qstringconverter.h36
1 files changed, 13 insertions, 23 deletions
diff --git a/src/corelib/text/qstringconverter.h b/src/corelib/text/qstringconverter.h
index 3d089f46a4..2bbff666e8 100644
--- a/src/corelib/text/qstringconverter.h
+++ b/src/corelib/text/qstringconverter.h
@@ -206,7 +206,11 @@ public:
: QStringConverter(name, flags)
{}
-#if defined(QT_USE_FAST_OPERATOR_PLUS) || defined(QT_USE_QSTRINGBUILDER)
+#if defined(Q_QDOC)
+ QString operator()(const QString &);
+ QString operator()(QStringView);
+ QString operator()(const QChar *, qsizetype);
+#else
template<typename T>
struct DecodedData
{
@@ -218,18 +222,9 @@ public:
{ return DecodedData<const QString &>{this, str}; }
DecodedData<QStringView> operator()(QStringView in)
{ return DecodedData<QStringView>{this, in}; }
-#else
- QByteArray operator()(const QString &in)
- {
- return encode(QStringView(in));
- }
- QByteArray operator()(QStringView in)
- {
- return encode(in);
- }
-#endif
- QByteArray operator()(const QChar *in, qsizetype length)
+ DecodedData<QStringView> operator()(const QChar *in, qsizetype length)
{ return (*this)(QStringView(in, length)); }
+#endif
qsizetype requiredSpace(qsizetype inputLength) const
{ return iface->fromUtf16Len(inputLength); }
@@ -249,14 +244,12 @@ private:
class QStringDecoder : public QStringConverter
{
-#if defined(QT_USE_FAST_OPERATOR_PLUS) || defined(QT_USE_QSTRINGBUILDER)
struct View {
const char *ch;
qsizetype l;
const char *data() const { return ch; }
qsizetype length() const { return l; }
};
-#endif
protected:
QSTRINGCONVERTER_CONSTEXPR QStringDecoder(const Interface *i)
@@ -273,7 +266,11 @@ public:
: QStringConverter(name, f)
{}
-#if defined(QT_USE_FAST_OPERATOR_PLUS) || defined(QT_USE_QSTRINGBUILDER)
+#if defined(Q_QDOC)
+ QString operator()(const QByteArray &ba);
+ QString operator()(const char *in, qsizetype length);
+ QString operator()(const char *chars);
+#else
template<typename T>
struct EncodedData
{
@@ -287,13 +284,6 @@ public:
{ return EncodedData<View>{this, {in, length}}; }
EncodedData<View> operator()(const char *chars)
{ return EncodedData<View>{this, {chars, qsizetype(strlen(chars))}}; }
-#else
- QString operator()(const QByteArray &ba)
- { return decode(ba.data(), ba.length()); }
- QString operator()(const char *in, qsizetype length)
- { return decode(in, length); }
- QString operator()(const char *chars)
- { return decode(chars, strlen(chars)); }
#endif
qsizetype requiredSpace(qsizetype inputLength) const
@@ -338,7 +328,7 @@ struct QConcatenable<QStringEncoder::DecodedData<T>>
static qsizetype size(const QStringEncoder::DecodedData<T> &s) { return s.encoder->requiredSpace(s.data.length()); }
static inline void appendTo(const QStringEncoder::DecodedData<T> &s, char *&out)
{
- out = s.decoder->appendToBuffer(out, s.data.data(), s.data.length());
+ out = s.encoder->appendToBuffer(out, s.data.data(), s.data.length());
}
};