Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qsignaldumper.cpp
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#include <QtTest/private/qsignaldumper_p.h>
5
6#include <QtCore/qlist.h>
7#include <QtCore/qmetaobject.h>
8#include <QtCore/qmetatype.h>
9#include <QtCore/qobject.h>
10#include <QtCore/qvariant.h>
11
12#include <QtTest/private/qtestlog_p.h>
13
14#include <QtCore/private/qmetaobject_p.h>
15
17
18namespace QTest
19{
20
21inline static void qPrintMessage(const QByteArray &ba)
22{
23 QTestLog::info(ba.constData(), nullptr, 0);
24}
25
26Q_GLOBAL_STATIC(QList<QByteArray>, ignoreClasses)
28Q_CONSTINIT thread_local int iLevel = 0;
29Q_CONSTINIT thread_local int ignoreLevel = 0;
30enum { IndentSpacesCount = 4 };
31
32static bool classIsIgnored(const char *className)
33{
34 if (Q_LIKELY(!ignoreClasses.exists()))
35 return false;
37 if (ignoreClasses()->isEmpty())
38 return false;
39 return ignoreClasses()->contains(QByteArrayView(className));
40}
41
42static void qSignalDumperCallback(QObject *caller, int signal_index, void **argv)
43{
44 Q_ASSERT(caller);
45 Q_ASSERT(argv);
46 Q_UNUSED(argv);
47 const QMetaObject *mo = caller->metaObject();
48 Q_ASSERT(mo);
49 QMetaMethod member = QMetaObjectPrivate::signal(mo, signal_index);
50 Q_ASSERT(member.isValid());
51
52 if (classIsIgnored(mo->className())) {
54 return;
55 }
56
59 str += "Signal: ";
60 str += mo->className();
61 str += '(';
62
63 QString objname = caller->objectName();
64 str += objname.toLocal8Bit();
65 if (!objname.isEmpty())
66 str += ' ';
67 str += QByteArray::number(quintptr(caller), 16).rightJustified(8, '0');
68
69 str += ") ";
70 str += member.name();
71 str += " (";
72
73 QList<QByteArray> args = member.parameterTypes();
74 for (int i = 0; i < args.size(); ++i) {
75 const QByteArray &arg = args.at(i);
76 int typeId = QMetaType::fromName(args.at(i).constData()).id();
77 if (arg.endsWith('*') || arg.endsWith('&')) {
78 str += '(';
79 str += arg;
80 str += ')';
81 if (arg.endsWith('&'))
82 str += '@';
83
84 quintptr addr = quintptr(*reinterpret_cast<void **>(argv[i + 1]));
85 str.append(QByteArray::number(addr, 16).rightJustified(8, '0'));
86 } else if (typeId != QMetaType::UnknownType) {
87 Q_ASSERT(typeId != QMetaType::Void); // void parameter => metaobject is corrupt
89 .append('(')
90 .append(QVariant(QMetaType(typeId), argv[i + 1]).toString().toLocal8Bit())
91 .append(')');
92 }
93 str.append(", ");
94 }
95 if (str.endsWith(", "))
96 str.chop(2);
97 str.append(')');
99}
100
101static void qSignalDumperCallbackSlot(QObject *caller, int method_index, void **argv)
102{
103 Q_ASSERT(caller);
104 Q_ASSERT(argv);
105 Q_UNUSED(argv);
106 const QMetaObject *mo = caller->metaObject();
107 Q_ASSERT(mo);
108 QMetaMethod member = mo->method(method_index);
109 if (!member.isValid())
110 return;
111
112 if (QTest::ignoreLevel || classIsIgnored(mo->className()))
113 return;
114
117 str += "Slot: ";
118 str += mo->className();
119 str += '(';
120
121 QString objname = caller->objectName();
122 str += objname.toLocal8Bit();
123 if (!objname.isEmpty())
124 str += ' ';
125 str += QByteArray::number(quintptr(caller), 16).rightJustified(8, '0');
126
127 str += ") ";
128 str += member.methodSignature();
130}
131
132static void qSignalDumperCallbackEndSignal(QObject *caller, int /*signal_index*/)
133{
134 Q_ASSERT(caller); Q_ASSERT(caller->metaObject());
135 if (classIsIgnored(caller->metaObject()->className())) {
138 return;
139 }
142}
143
144}
145
147{
148 s_isEnabled = enabled;
149}
150
160
165
167{
169 if (QTest::ignoreClasses())
170 QTest::ignoreClasses()->append(klass);
171}
172
174{
176 if (QTest::ignoreClasses.exists())
177 QTest::ignoreClasses()->clear();
178}
179
180bool QSignalDumper::s_isEnabled = false;
181
\inmodule QtCore
Definition qbytearray.h:57
const char * constData() const noexcept
Returns a pointer to the const data stored in the byte array.
Definition qbytearray.h:124
static QByteArray number(int, int base=10)
Returns a byte-array representing the whole number n as text.
qsizetype size() const noexcept
Definition qlist.h:397
const_reference at(qsizetype i) const noexcept
Definition qlist.h:446
\inmodule QtCore
Definition qmetaobject.h:19
bool isValid() const
QList< QByteArray > parameterTypes() const
Returns a list of parameter types.
QByteArray methodSignature() const
QByteArray name() const
\inmodule QtCore
Definition qmetatype.h:341
static QMetaType fromName(QByteArrayView name)
Returns a QMetaType matching typeName.
\inmodule QtCore
Definition qmutex.h:313
\inmodule QtCore
Definition qmutex.h:281
\inmodule QtCore
Definition qobject.h:103
static void ignoreClass(const QByteArray &klass)
static void endDump()
static void startDump()
static void setEnabled(bool)
static void clearIgnoredClasses()
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
QString & fill(QChar c, qsizetype size=-1)
Sets every character in the string to character ch.
Definition qstring.cpp:6358
void chop(qsizetype n)
Removes n characters from the end of the string.
Definition qstring.cpp:6340
bool isEmpty() const noexcept
Returns true if the string has no characters; otherwise returns false.
Definition qstring.h:192
bool endsWith(const QString &s, Qt::CaseSensitivity cs=Qt::CaseSensitive) const
Returns true if the string ends with s; otherwise returns false.
Definition qstring.cpp:5506
QByteArray toLocal8Bit() const &
Definition qstring.h:638
QString & append(QChar c)
Definition qstring.cpp:3252
static void info(const char *msg, const char *file, int line)
Definition qtestlog.cpp:596
\inmodule QtCore
Definition qvariant.h:65
QString str
[2]
auto mo
[7]
Combined button and popup list for selecting options.
Q_CONSTINIT thread_local int ignoreLevel
static void qSignalDumperCallback(QObject *caller, int signal_index, void **argv)
char * toString(const MyPoint &point)
static bool classIsIgnored(const char *className)
static void qPrintMessage(const QByteArray &ba)
static void qSignalDumperCallbackSlot(QObject *caller, int method_index, void **argv)
static bool isEmpty(const char *str)
Q_CONSTINIT thread_local int iLevel
@ IndentSpacesCount
static Q_CONSTINIT QBasicMutex ignoreClassesMutex
static void qSignalDumperCallbackEndSignal(QObject *caller, int)
#define Q_LIKELY(x)
#define Q_GLOBAL_STATIC(TYPE, NAME,...)
void qt_register_signal_spy_callbacks(QSignalSpyCallbackSet *callback_set)
Definition qobject.cpp:63
GLenum GLenum GLsizei const GLuint GLboolean enabled
GLenum const void * addr
#define Q_ASSERT(cond)
Definition qrandom.cpp:47
SSL_CTX int void * arg
static char * toLocal8Bit(char *out, QStringView in, QStringConverter::State *state)
#define Q_UNUSED(x)
size_t quintptr
Definition qtypes.h:167
#define enabled
const char className[16]
[1]
Definition qwizard.cpp:100
QFuture< QSet< QChar > > set
[10]
QByteArray ba
[0]
QJSValueList args
static Q_CORE_EXPORT QMetaMethod signal(const QMetaObject *m, int signal_index)
\inmodule QtCore