diff --git a/src/corelib/global/qlogging.cpp b/src/corelib/global/qlogging.cpp index 449b8a1eea9..2e3c1070f8f 100644 --- a/src/corelib/global/qlogging.cpp +++ b/src/corelib/global/qlogging.cpp @@ -382,9 +382,10 @@ static void qt_message(QtMsgType msgType, const QMessageLogContext &context, con */ void QMessageLogger::debug(const char *msg, ...) const { + QInternalMessageLogContext ctxt(context); va_list ap; va_start(ap, msg); // use variable arg list - qt_message(QtDebugMsg, context, msg, ap); + qt_message(QtDebugMsg, ctxt, msg, ap); va_end(ap); } @@ -397,9 +398,10 @@ void QMessageLogger::debug(const char *msg, ...) const */ void QMessageLogger::info(const char *msg, ...) const { + QInternalMessageLogContext ctxt(context); va_list ap; va_start(ap, msg); // use variable arg list - qt_message(QtInfoMsg, context, msg, ap); + qt_message(QtInfoMsg, ctxt, msg, ap); va_end(ap); } @@ -429,9 +431,7 @@ void QMessageLogger::debug(const QLoggingCategory &cat, const char *msg, ...) co if (!cat.isDebugEnabled()) return; - QMessageLogContext ctxt; - ctxt.copyContextFrom(context); - ctxt.category = cat.categoryName(); + QInternalMessageLogContext ctxt(context, cat()); va_list ap; va_start(ap, msg); // use variable arg list @@ -453,9 +453,7 @@ void QMessageLogger::debug(QMessageLogger::CategoryFunction catFunc, if (!cat.isDebugEnabled()) return; - QMessageLogContext ctxt; - ctxt.copyContextFrom(context); - ctxt.category = cat.categoryName(); + QInternalMessageLogContext ctxt(context, cat()); va_list ap; va_start(ap, msg); // use variable arg list @@ -534,9 +532,7 @@ void QMessageLogger::info(const QLoggingCategory &cat, const char *msg, ...) con if (!cat.isInfoEnabled()) return; - QMessageLogContext ctxt; - ctxt.copyContextFrom(context); - ctxt.category = cat.categoryName(); + QInternalMessageLogContext ctxt(context, cat()); va_list ap; va_start(ap, msg); // use variable arg list @@ -558,9 +554,7 @@ void QMessageLogger::info(QMessageLogger::CategoryFunction catFunc, if (!cat.isInfoEnabled()) return; - QMessageLogContext ctxt; - ctxt.copyContextFrom(context); - ctxt.category = cat.categoryName(); + QInternalMessageLogContext ctxt(context, cat()); va_list ap; va_start(ap, msg); // use variable arg list @@ -624,9 +618,10 @@ QDebug QMessageLogger::info(QMessageLogger::CategoryFunction catFunc) const */ void QMessageLogger::warning(const char *msg, ...) const { + QInternalMessageLogContext ctxt(context); va_list ap; va_start(ap, msg); // use variable arg list - qt_message(QtWarningMsg, context, msg, ap); + qt_message(QtWarningMsg, ctxt, msg, ap); va_end(ap); } @@ -642,9 +637,7 @@ void QMessageLogger::warning(const QLoggingCategory &cat, const char *msg, ...) if (!cat.isWarningEnabled()) return; - QMessageLogContext ctxt; - ctxt.copyContextFrom(context); - ctxt.category = cat.categoryName(); + QInternalMessageLogContext ctxt(context, cat()); va_list ap; va_start(ap, msg); // use variable arg list @@ -666,9 +659,7 @@ void QMessageLogger::warning(QMessageLogger::CategoryFunction catFunc, if (!cat.isWarningEnabled()) return; - QMessageLogContext ctxt; - ctxt.copyContextFrom(context); - ctxt.category = cat.categoryName(); + QInternalMessageLogContext ctxt(context, cat()); va_list ap; va_start(ap, msg); // use variable arg list @@ -729,9 +720,10 @@ QDebug QMessageLogger::warning(QMessageLogger::CategoryFunction catFunc) const */ void QMessageLogger::critical(const char *msg, ...) const { + QInternalMessageLogContext ctxt(context); va_list ap; va_start(ap, msg); // use variable arg list - qt_message(QtCriticalMsg, context, msg, ap); + qt_message(QtCriticalMsg, ctxt, msg, ap); va_end(ap); } @@ -747,9 +739,7 @@ void QMessageLogger::critical(const QLoggingCategory &cat, const char *msg, ...) if (!cat.isCriticalEnabled()) return; - QMessageLogContext ctxt; - ctxt.copyContextFrom(context); - ctxt.category = cat.categoryName(); + QInternalMessageLogContext ctxt(context, cat()); va_list ap; va_start(ap, msg); // use variable arg list @@ -771,9 +761,7 @@ void QMessageLogger::critical(QMessageLogger::CategoryFunction catFunc, if (!cat.isCriticalEnabled()) return; - QMessageLogContext ctxt; - ctxt.copyContextFrom(context); - ctxt.category = cat.categoryName(); + QInternalMessageLogContext ctxt(context, cat()); va_list ap; va_start(ap, msg); // use variable arg list @@ -836,9 +824,7 @@ QDebug QMessageLogger::critical(QMessageLogger::CategoryFunction catFunc) const */ void QMessageLogger::fatal(const QLoggingCategory &cat, const char *msg, ...) const noexcept { - QMessageLogContext ctxt; - ctxt.copyContextFrom(context); - ctxt.category = cat.categoryName(); + QInternalMessageLogContext ctxt(context, cat()); va_list ap; va_start(ap, msg); // use variable arg list @@ -862,9 +848,7 @@ void QMessageLogger::fatal(QMessageLogger::CategoryFunction catFunc, { const QLoggingCategory &cat = (*catFunc)(); - QMessageLogContext ctxt; - ctxt.copyContextFrom(context); - ctxt.category = cat.categoryName(); + QInternalMessageLogContext ctxt(context, cat()); va_list ap; va_start(ap, msg); // use variable arg list @@ -884,9 +868,10 @@ void QMessageLogger::fatal(QMessageLogger::CategoryFunction catFunc, */ void QMessageLogger::fatal(const char *msg, ...) const noexcept { + QInternalMessageLogContext ctxt(context); va_list ap; va_start(ap, msg); // use variable arg list - QT_TERMINATE_ON_EXCEPTION(qt_message(QtFatalMsg, context, msg, ap)); + QT_TERMINATE_ON_EXCEPTION(qt_message(QtFatalMsg, ctxt, msg, ap)); va_end(ap); #ifndef Q_CC_MSVC_ONLY @@ -2057,9 +2042,10 @@ static void qt_message_fatal(QtMsgType, const QMessageLogContext &context, Strin */ void qt_message_output(QtMsgType msgType, const QMessageLogContext &context, const QString &message) { - qt_message_print(msgType, context, message); + QInternalMessageLogContext ctx(context); + qt_message_print(msgType, ctx, message); if (isFatal(msgType)) - qt_message_fatal(msgType, context, message); + qt_message_fatal(msgType, ctx, message); } void qErrnoWarning(const char *msg, ...) @@ -2074,7 +2060,7 @@ void qErrnoWarning(const char *msg, ...) va_end(ap); buf += " ("_L1 + error_string + u')'; - QMessageLogContext context; + QInternalMessageLogContext context{QMessageLogContext()}; qt_message_output(QtWarningMsg, context, buf); } @@ -2088,7 +2074,7 @@ void qErrnoWarning(int code, const char *msg, ...) va_end(ap); buf += " ("_L1 + qt_error_string(code) + u')'; - QMessageLogContext context; + QInternalMessageLogContext context{QMessageLogContext()}; qt_message_output(QtWarningMsg, context, buf); } diff --git a/src/corelib/global/qlogging.h b/src/corelib/global/qlogging.h index de822672184..aa0ab93a2d9 100644 --- a/src/corelib/global/qlogging.h +++ b/src/corelib/global/qlogging.h @@ -37,15 +37,17 @@ enum QtMsgType { #endif }; +class QInternalMessageLogContext; class QMessageLogContext { Q_DISABLE_COPY(QMessageLogContext) public: + static constexpr int CurrentVersion = 2; constexpr QMessageLogContext() noexcept = default; constexpr QMessageLogContext(const char *fileName, int lineNumber, const char *functionName, const char *categoryName) noexcept : line(lineNumber), file(fileName), function(functionName), category(categoryName) {} - int version = 2; + int version = CurrentVersion; int line = 0; const char *file = nullptr; const char *function = nullptr; @@ -54,8 +56,8 @@ public: private: QMessageLogContext ©ContextFrom(const QMessageLogContext &logContext) noexcept; + friend class QInternalMessageLogContext; friend class QMessageLogger; - friend class QDebug; }; class QLoggingCategory; diff --git a/src/corelib/global/qlogging_p.h b/src/corelib/global/qlogging_p.h index 9492f10f1ff..03c0cf4af28 100644 --- a/src/corelib/global/qlogging_p.h +++ b/src/corelib/global/qlogging_p.h @@ -16,6 +16,8 @@ // #include +#include "qlogging.h" +#include "qloggingcategory.h" QT_BEGIN_NAMESPACE @@ -25,6 +27,22 @@ Q_CORE_EXPORT bool shouldLogToStderr(); } +class QInternalMessageLogContext : public QMessageLogContext +{ +public: + QInternalMessageLogContext(const QMessageLogContext &logContext) + { + copyContextFrom(logContext); + } + QInternalMessageLogContext(const QMessageLogContext &logContext, + const QLoggingCategory &categoryOverride) + : QInternalMessageLogContext(logContext) + { + category = categoryOverride.categoryName(); + } + +}; + QT_END_NAMESPACE #endif // QLOGGING_P_H diff --git a/src/corelib/io/qdebug.cpp b/src/corelib/io/qdebug.cpp index d87874261ca..64b693fea51 100644 --- a/src/corelib/io/qdebug.cpp +++ b/src/corelib/io/qdebug.cpp @@ -5,6 +5,7 @@ #include "qdebug.h" #include "private/qdebug_p.h" #include "qmetaobject.h" +#include #include #include @@ -150,15 +151,15 @@ QByteArray QtDebugUtils::toPrintable(const char *data, qint64 len, qsizetype max Flushes any pending data to be written and destroys the debug stream. */ -// Has been defined in the header / inlined before Qt 5.4 QDebug::~QDebug() { if (stream && !--stream->ref) { if (stream->space && stream->buffer.endsWith(u' ')) stream->buffer.chop(1); if (stream->message_output) { + QInternalMessageLogContext ctxt(stream->context); qt_message_output(stream->type, - stream->context, + ctxt, stream->buffer); } delete stream;