Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Toggle main menu visibility
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
16
QT_BEGIN_NAMESPACE
17
18
namespace
QTest
19
{
20
21
inline
static
void
qPrintMessage
(
const
QByteArray &ba)
22
{
23
QTestLog::info(ba.constData(),
nullptr
, 0);
24
}
25
26
Q_GLOBAL_STATIC
(
QList
<
QByteArray
>,
ignoreClasses
)
27
Q_CONSTINIT
static
QBasicMutex
ignoreClassesMutex
;
28
Q_CONSTINIT
thread_local
int
iLevel
= 0;
29
Q_CONSTINIT
thread_local
int
ignoreLevel
= 0;
30
enum
{
IndentSpacesCount
= 4 };
31
32
static
bool
classIsIgnored
(
const
char
*className)
33
{
34
if
(Q_LIKELY(!ignoreClasses.exists()))
35
return
false
;
36
QMutexLocker locker(&ignoreClassesMutex);
37
if
(ignoreClasses()->isEmpty())
38
return
false
;
39
return
ignoreClasses()->contains(QByteArrayView(className));
40
}
41
42
static
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())) {
53
++QTest::ignoreLevel;
54
return
;
55
}
56
57
QByteArray str;
58
str.fill(
' '
, QTest::iLevel++ *
QTest
::
IndentSpacesCount
);
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()).rawId();
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
88
str.append(arg)
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(
')'
);
98
qPrintMessage(str);
99
}
100
101
static
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
115
QByteArray str;
116
str.fill(
' '
, QTest::iLevel *
QTest
::
IndentSpacesCount
);
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();
129
qPrintMessage(str);
130
}
131
132
static
void
qSignalDumperCallbackEndSignal
(QObject *caller,
int
/*signal_index*/
)
133
{
134
Q_ASSERT(caller); Q_ASSERT(caller->metaObject());
135
if
(classIsIgnored(caller->metaObject()->className())) {
136
--QTest::ignoreLevel;
137
Q_ASSERT(QTest::ignoreLevel >= 0);
138
return
;
139
}
140
--QTest::iLevel;
141
Q_ASSERT(QTest::iLevel >= 0);
142
}
143
144
}
145
146
void
QSignalDumper::setEnabled(
bool
enabled)
147
{
148
s_isEnabled = enabled;
149
}
150
151
void
QSignalDumper::startDump()
152
{
153
if
(!s_isEnabled)
154
return
;
155
156
static
QSignalSpyCallbackSet set = { QTest::qSignalDumperCallback,
157
QTest::qSignalDumperCallbackSlot, QTest::qSignalDumperCallbackEndSignal,
nullptr
};
158
qt_register_signal_spy_callbacks(&set);
159
}
160
161
void
QSignalDumper::endDump()
162
{
163
qt_register_signal_spy_callbacks(
nullptr
);
164
}
165
166
void
QSignalDumper::ignoreClass(
const
QByteArray &klass)
167
{
168
QMutexLocker locker(&QTest::ignoreClassesMutex);
169
if
(QTest::ignoreClasses())
170
QTest::ignoreClasses()->append(klass);
171
}
172
173
void
QSignalDumper::clearIgnoredClasses()
174
{
175
QMutexLocker locker(&QTest::ignoreClassesMutex);
176
if
(QTest::ignoreClasses.exists())
177
QTest::ignoreClasses()->clear();
178
}
179
180
bool
QSignalDumper::s_isEnabled =
false
;
181
182
QT_END_NAMESPACE
QTest
[15]
Definition
qtestsupport_core.h:15
QTest::qSignalDumperCallback
static void qSignalDumperCallback(QObject *caller, int signal_index, void **argv)
Definition
qsignaldumper.cpp:42
QTest::iLevel
Q_CONSTINIT int iLevel
Definition
qsignaldumper.cpp:28
QTest::ignoreLevel
Q_CONSTINIT int ignoreLevel
Definition
qsignaldumper.cpp:29
QTest::classIsIgnored
static bool classIsIgnored(const char *className)
Definition
qsignaldumper.cpp:32
QTest::qPrintMessage
static void qPrintMessage(const QByteArray &ba)
Definition
qsignaldumper.cpp:21
QTest::qSignalDumperCallbackSlot
static void qSignalDumperCallbackSlot(QObject *caller, int method_index, void **argv)
Definition
qsignaldumper.cpp:101
QTest::IndentSpacesCount
@ IndentSpacesCount
Definition
qsignaldumper.cpp:30
QTest::qSignalDumperCallbackEndSignal
static void qSignalDumperCallbackEndSignal(QObject *caller, int)
Definition
qsignaldumper.cpp:132
qtbase
src
testlib
qsignaldumper.cpp
Generated on
for Qt by
1.18.0