Absolute File Name: | /home/qt/qt5_coco/qt5/qtbase/src/corelib/kernel/qobject.cpp |
Switch to Source code | Preprocessed file |
Line | Source | Count | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | - | |||||||||||||||||||
2 | - | |||||||||||||||||||
3 | - | |||||||||||||||||||
4 | - | |||||||||||||||||||
5 | - | |||||||||||||||||||
6 | - | |||||||||||||||||||
7 | - | |||||||||||||||||||
8 | - | |||||||||||||||||||
9 | - | |||||||||||||||||||
10 | static int DIRECT_CONNECTION_ONLY = 0; | - | ||||||||||||||||||
11 | - | |||||||||||||||||||
12 | - | |||||||||||||||||||
13 | QDynamicMetaObjectData::~QDynamicMetaObjectData() | - | ||||||||||||||||||
14 | { | - | ||||||||||||||||||
15 | } | - | ||||||||||||||||||
16 | - | |||||||||||||||||||
17 | QAbstractDynamicMetaObject::~QAbstractDynamicMetaObject() | - | ||||||||||||||||||
18 | { | - | ||||||||||||||||||
19 | } | - | ||||||||||||||||||
20 | - | |||||||||||||||||||
21 | - | |||||||||||||||||||
22 | struct QSlotObjectBaseDeleter { | - | ||||||||||||||||||
23 | static void cleanup(QtPrivate::QSlotObjectBase *slot) { | - | ||||||||||||||||||
24 | if (slot) slot->destroyIfLastRef(); | - | ||||||||||||||||||
25 | } | - | ||||||||||||||||||
26 | }; | - | ||||||||||||||||||
27 | static int *queuedConnectionTypes(const QList<QByteArray> &typeNames) | - | ||||||||||||||||||
28 | { | - | ||||||||||||||||||
29 | int *types = new int [typeNames.count() + 1]; | - | ||||||||||||||||||
30 | do { if (!(types)) qBadAlloc(); } while (0); | - | ||||||||||||||||||
31 | for (int i = 0; i < typeNames.count(); ++i) { | - | ||||||||||||||||||
32 | const QByteArray typeName = typeNames.at(i); | - | ||||||||||||||||||
33 | if (typeName.endsWith('*')) | - | ||||||||||||||||||
34 | types[i] = QMetaType::VoidStar; | - | ||||||||||||||||||
35 | else | - | ||||||||||||||||||
36 | types[i] = QMetaType::type(typeName); | - | ||||||||||||||||||
37 | - | |||||||||||||||||||
38 | if (!types[i]) { | - | ||||||||||||||||||
39 | QMessageLogger(__FILE__, 95102, __PRETTY_FUNCTION__).warning("QObject::connect: Cannot queue arguments of type '%s'\n" | - | ||||||||||||||||||
40 | "(Make sure '%s' is registered using qRegisterMetaType().)", | - | ||||||||||||||||||
41 | typeName.constData(), typeName.constData()); | - | ||||||||||||||||||
42 | delete [] types; | - | ||||||||||||||||||
43 | return 0; | - | ||||||||||||||||||
44 | } | - | ||||||||||||||||||
45 | } | - | ||||||||||||||||||
46 | types[typeNames.count()] = 0; | - | ||||||||||||||||||
47 | - | |||||||||||||||||||
48 | return types; | - | ||||||||||||||||||
49 | } | - | ||||||||||||||||||
50 | - | |||||||||||||||||||
51 | static int *queuedConnectionTypes(const QArgumentType *argumentTypes, int argc) | - | ||||||||||||||||||
52 | { | - | ||||||||||||||||||
53 | QScopedArrayPointer<int> types(new int [argc + 1]); | - | ||||||||||||||||||
54 | for (int i = 0; i < argc; ++i) { | - | ||||||||||||||||||
55 | const QArgumentType &type = argumentTypes[i]; | - | ||||||||||||||||||
56 | if (type.type()) | - | ||||||||||||||||||
57 | types[i] = type.type(); | - | ||||||||||||||||||
58 | else if (type.name().endsWith('*')) | - | ||||||||||||||||||
59 | types[i] = QMetaType::VoidStar; | - | ||||||||||||||||||
60 | else | - | ||||||||||||||||||
61 | types[i] = QMetaType::type(type.name()); | - | ||||||||||||||||||
62 | - | |||||||||||||||||||
63 | if (!types[i]) { | - | ||||||||||||||||||
64 | QMessageLogger(__FILE__, 120127, __PRETTY_FUNCTION__).warning("QObject::connect: Cannot queue arguments of type '%s'\n" | - | ||||||||||||||||||
65 | "(Make sure '%s' is registered using qRegisterMetaType().)", | - | ||||||||||||||||||
66 | type.name().constData(), type.name().constData()); | - | ||||||||||||||||||
67 | return 0; | - | ||||||||||||||||||
68 | } | - | ||||||||||||||||||
69 | } | - | ||||||||||||||||||
70 | types[argc] = 0; | - | ||||||||||||||||||
71 | - | |||||||||||||||||||
72 | return types.take(); | - | ||||||||||||||||||
73 | } | - | ||||||||||||||||||
74 | - | |||||||||||||||||||
75 | static QBasicMutex _q_ObjectMutexPool[131]; | - | ||||||||||||||||||
76 | - | |||||||||||||||||||
77 | - | |||||||||||||||||||
78 | - | |||||||||||||||||||
79 | - | |||||||||||||||||||
80 | - | |||||||||||||||||||
81 | static inline QMutex *signalSlotLock(const QObject *o) | - | ||||||||||||||||||
82 | { | - | ||||||||||||||||||
83 | return static_cast<QMutex *>(&_q_ObjectMutexPool[ | - | ||||||||||||||||||
84 | uint(quintptr(o)) % sizeof(_q_ObjectMutexPool)/sizeof(QBasicMutex)]); | - | ||||||||||||||||||
85 | } | - | ||||||||||||||||||
86 | - | |||||||||||||||||||
87 | - | |||||||||||||||||||
88 | extern "C" __attribute__((visibility("default"))) void qt_addObject(QObject *) | - | ||||||||||||||||||
89 | {} | - | ||||||||||||||||||
90 | - | |||||||||||||||||||
91 | extern "C" __attribute__((visibility("default"))) void qt_removeObject(QObject *) | - | ||||||||||||||||||
92 | {} | - | ||||||||||||||||||
93 | - | |||||||||||||||||||
94 | struct QConnectionSenderSwitcher { | - | ||||||||||||||||||
95 | QObject *receiver; | - | ||||||||||||||||||
96 | QObjectPrivate::Sender *previousSender; | - | ||||||||||||||||||
97 | QObjectPrivate::Sender currentSender; | - | ||||||||||||||||||
98 | bool switched; | - | ||||||||||||||||||
99 | - | |||||||||||||||||||
100 | inline QConnectionSenderSwitcher() : switched(false) {} | - | ||||||||||||||||||
101 | - | |||||||||||||||||||
102 | inline QConnectionSenderSwitcher(QObject *receiver, QObject *sender, int signal_absolute_id) | - | ||||||||||||||||||
103 | { | - | ||||||||||||||||||
104 | switchSender(receiver, sender, signal_absolute_id); | - | ||||||||||||||||||
105 | } | - | ||||||||||||||||||
106 | - | |||||||||||||||||||
107 | inline void switchSender(QObject *receiver, QObject *sender, int signal_absolute_id) | - | ||||||||||||||||||
108 | { | - | ||||||||||||||||||
109 | this->receiver = receiver; | - | ||||||||||||||||||
110 | currentSender.sender = sender; | - | ||||||||||||||||||
111 | currentSender.signal = signal_absolute_id; | - | ||||||||||||||||||
112 | currentSender.ref = 1; | - | ||||||||||||||||||
113 | previousSender = QObjectPrivate::setCurrentSender(receiver, ¤tSender); | - | ||||||||||||||||||
114 | switched = true; | - | ||||||||||||||||||
115 | } | - | ||||||||||||||||||
116 | - | |||||||||||||||||||
117 | inline ~QConnectionSenderSwitcher() | - | ||||||||||||||||||
118 | { | - | ||||||||||||||||||
119 | if (switched) | - | ||||||||||||||||||
120 | QObjectPrivate::resetCurrentSender(receiver, ¤tSender, previousSender); | - | ||||||||||||||||||
121 | } | - | ||||||||||||||||||
122 | private: | - | ||||||||||||||||||
123 | QConnectionSenderSwitcher(const QConnectionSenderSwitcher &) = delete; QConnectionSenderSwitcher &operator=(const QConnectionSenderSwitcher &) = delete; | - | ||||||||||||||||||
124 | }; | - | ||||||||||||||||||
125 | - | |||||||||||||||||||
126 | - | |||||||||||||||||||
127 | void (*QAbstractDeclarativeData::destroyed)(QAbstractDeclarativeData *, QObject *) = 0; | - | ||||||||||||||||||
128 | void (*QAbstractDeclarativeData::destroyed_qml1)(QAbstractDeclarativeData *, QObject *) = 0; | - | ||||||||||||||||||
129 | void (*QAbstractDeclarativeData::parentChanged)(QAbstractDeclarativeData *, QObject *, QObject *) = 0; | - | ||||||||||||||||||
130 | void (*QAbstractDeclarativeData::signalEmitted)(QAbstractDeclarativeData *, QObject *, int, void **) = 0; | - | ||||||||||||||||||
131 | int (*QAbstractDeclarativeData::receivers)(QAbstractDeclarativeData *, const QObject *, int) = 0; | - | ||||||||||||||||||
132 | bool (*QAbstractDeclarativeData::isSignalConnected)(QAbstractDeclarativeData *, const QObject *, int) = 0; | - | ||||||||||||||||||
133 | void (*QAbstractDeclarativeData::setWidgetParent)(QObject *, QObject *) = 0; | - | ||||||||||||||||||
134 | - | |||||||||||||||||||
135 | QObjectData::~QObjectData() {} | - | ||||||||||||||||||
136 | - | |||||||||||||||||||
137 | QMetaObject *QObjectData::dynamicMetaObject() const | - | ||||||||||||||||||
138 | { | - | ||||||||||||||||||
139 | return metaObject->toDynamicMetaObject(q_ptr); | - | ||||||||||||||||||
140 | } | - | ||||||||||||||||||
141 | - | |||||||||||||||||||
142 | QObjectPrivate::QObjectPrivate(int version) | - | ||||||||||||||||||
143 | : threadData(0), connectionLists(0), senders(0), currentSender(0), currentChildBeingDeleted(0) | - | ||||||||||||||||||
144 | { | - | ||||||||||||||||||
145 | - | |||||||||||||||||||
146 | - | |||||||||||||||||||
147 | - | |||||||||||||||||||
148 | (void)version;; | - | ||||||||||||||||||
149 | - | |||||||||||||||||||
150 | - | |||||||||||||||||||
151 | - | |||||||||||||||||||
152 | - | |||||||||||||||||||
153 | - | |||||||||||||||||||
154 | - | |||||||||||||||||||
155 | - | |||||||||||||||||||
156 | q_ptr = 0; | - | ||||||||||||||||||
157 | parent = 0; | - | ||||||||||||||||||
158 | isWidget = false; | - | ||||||||||||||||||
159 | blockSig = false; | - | ||||||||||||||||||
160 | wasDeleted = false; | - | ||||||||||||||||||
161 | isDeletingChildren = false; | - | ||||||||||||||||||
162 | sendChildEvents = true; | - | ||||||||||||||||||
163 | receiveChildEvents = true; | - | ||||||||||||||||||
164 | postedEvents = 0; | - | ||||||||||||||||||
165 | extraData = 0; | - | ||||||||||||||||||
166 | connectedSignals[0] = connectedSignals[1] = 0; | - | ||||||||||||||||||
167 | metaObject = 0; | - | ||||||||||||||||||
168 | isWindow = false; | - | ||||||||||||||||||
169 | } executed 1911164 times by 907 tests: end of block Executed by:
| 1911164 | ||||||||||||||||||
170 | - | |||||||||||||||||||
171 | QObjectPrivate::~QObjectPrivate() | - | ||||||||||||||||||
172 | { | - | ||||||||||||||||||
173 | if (extraData && !extraData->runningTimers.isEmpty()) { | - | ||||||||||||||||||
174 | if (__builtin_expect(!!(threadData->thread == QThread::currentThread()), true)) { | - | ||||||||||||||||||
175 | - | |||||||||||||||||||
176 | if (threadData->eventDispatcher.load()) | - | ||||||||||||||||||
177 | threadData->eventDispatcher.load()->unregisterTimers(q_ptr); | - | ||||||||||||||||||
178 | - | |||||||||||||||||||
179 | - | |||||||||||||||||||
180 | for (int i = 0; i < extraData->runningTimers.size(); ++i) | - | ||||||||||||||||||
181 | QAbstractEventDispatcherPrivate::releaseTimerId(extraData->runningTimers.at(i)); | - | ||||||||||||||||||
182 | } else { | - | ||||||||||||||||||
183 | QMessageLogger(__FILE__, 239246, __PRETTY_FUNCTION__).warning("QObject::~QObject: Timers cannot be stopped from another thread"); | - | ||||||||||||||||||
184 | } | - | ||||||||||||||||||
185 | } | - | ||||||||||||||||||
186 | - | |||||||||||||||||||
187 | if (postedEvents) | - | ||||||||||||||||||
188 | QCoreApplication::removePostedEvents(q_ptr, 0); | - | ||||||||||||||||||
189 | - | |||||||||||||||||||
190 | threadData->deref(); | - | ||||||||||||||||||
191 | - | |||||||||||||||||||
192 | if (metaObject) metaObject->objectDestroyed(q_ptr); | - | ||||||||||||||||||
193 | - | |||||||||||||||||||
194 | - | |||||||||||||||||||
195 | if (extraData) | - | ||||||||||||||||||
196 | qDeleteAll(extraData->userData); | - | ||||||||||||||||||
197 | - | |||||||||||||||||||
198 | delete extraData; | - | ||||||||||||||||||
199 | } | - | ||||||||||||||||||
200 | - | |||||||||||||||||||
201 | - | |||||||||||||||||||
202 | - | |||||||||||||||||||
203 | - | |||||||||||||||||||
204 | - | |||||||||||||||||||
205 | static void computeOffsets(const QMetaObject *metaobject, int *signalOffset, int *methodOffset) | - | ||||||||||||||||||
206 | { | - | ||||||||||||||||||
207 | *signalOffset = *methodOffset = 0; | - | ||||||||||||||||||
208 | const QMetaObject *m = metaobject->d.superdata; | - | ||||||||||||||||||
209 | while (m) { | - | ||||||||||||||||||
210 | const QMetaObjectPrivate *d = QMetaObjectPrivate::get(m); | - | ||||||||||||||||||
211 | *methodOffset += d->methodCount; | - | ||||||||||||||||||
212 | ((!(d->revision >= 4)) ? qt_assert("d->revision >= 4",__FILE__,268275) : qt_noop()); | - | ||||||||||||||||||
213 | *signalOffset += d->signalCount; | - | ||||||||||||||||||
214 | m = m->d.superdata; | - | ||||||||||||||||||
215 | } | - | ||||||||||||||||||
216 | } | - | ||||||||||||||||||
217 | class QObjectConnectionListVector : public QVector<QObjectPrivate::ConnectionList> | - | ||||||||||||||||||
218 | { | - | ||||||||||||||||||
219 | public: | - | ||||||||||||||||||
220 | bool orphaned; | - | ||||||||||||||||||
221 | bool dirty; | - | ||||||||||||||||||
222 | int inUse; | - | ||||||||||||||||||
223 | QObjectPrivate::ConnectionList allsignals; | - | ||||||||||||||||||
224 | - | |||||||||||||||||||
225 | QObjectConnectionListVector() | - | ||||||||||||||||||
226 | : QVector<QObjectPrivate::ConnectionList>(), orphaned(false), dirty(false), inUse(0) | - | ||||||||||||||||||
227 | { } | - | ||||||||||||||||||
228 | - | |||||||||||||||||||
229 | QObjectPrivate::ConnectionList &operator[](int at) | - | ||||||||||||||||||
230 | { | - | ||||||||||||||||||
231 | if (at < 0) | - | ||||||||||||||||||
232 | return allsignals; | - | ||||||||||||||||||
233 | return QVector<QObjectPrivate::ConnectionList>::operator[](at); | - | ||||||||||||||||||
234 | } | - | ||||||||||||||||||
235 | }; | - | ||||||||||||||||||
236 | - | |||||||||||||||||||
237 | - | |||||||||||||||||||
238 | bool QObjectPrivate::isSender(const QObject *receiver, const char *signal) const | - | ||||||||||||||||||
239 | { | - | ||||||||||||||||||
240 | const QObject * const q = q_func(); | - | ||||||||||||||||||
241 | int signal_index = signalIndex(signal); | - | ||||||||||||||||||
242 | if (signal_index < 0) | - | ||||||||||||||||||
243 | return false; | - | ||||||||||||||||||
244 | QMutexLocker locker(signalSlotLock(q)); | - | ||||||||||||||||||
245 | if (connectionLists) { | - | ||||||||||||||||||
246 | if (signal_index < connectionLists->count()) { | - | ||||||||||||||||||
247 | const QObjectPrivate::Connection *c = | - | ||||||||||||||||||
248 | connectionLists->at(signal_index).first; | - | ||||||||||||||||||
249 | - | |||||||||||||||||||
250 | while (c) { | - | ||||||||||||||||||
251 | if (c->receiver == receiver) | - | ||||||||||||||||||
252 | return true; | - | ||||||||||||||||||
253 | c = c->nextConnectionList; | - | ||||||||||||||||||
254 | } | - | ||||||||||||||||||
255 | } | - | ||||||||||||||||||
256 | } | - | ||||||||||||||||||
257 | return false; | - | ||||||||||||||||||
258 | } | - | ||||||||||||||||||
259 | - | |||||||||||||||||||
260 | - | |||||||||||||||||||
261 | QObjectList QObjectPrivate::receiverList(const char *signal) const | - | ||||||||||||||||||
262 | { | - | ||||||||||||||||||
263 | const QObject * const q = q_func(); | - | ||||||||||||||||||
264 | QObjectList returnValue; | - | ||||||||||||||||||
265 | int signal_index = signalIndex(signal); | - | ||||||||||||||||||
266 | if (signal_index < 0) | - | ||||||||||||||||||
267 | return returnValue; | - | ||||||||||||||||||
268 | QMutexLocker locker(signalSlotLock(q)); | - | ||||||||||||||||||
269 | if (connectionLists) { | - | ||||||||||||||||||
270 | if (signal_index < connectionLists->count()) { | - | ||||||||||||||||||
271 | const QObjectPrivate::Connection *c = connectionLists->at(signal_index).first; | - | ||||||||||||||||||
272 | - | |||||||||||||||||||
273 | while (c) { | - | ||||||||||||||||||
274 | if (c->receiver) | - | ||||||||||||||||||
275 | returnValue << c->receiver; | - | ||||||||||||||||||
276 | c = c->nextConnectionList; | - | ||||||||||||||||||
277 | } | - | ||||||||||||||||||
278 | } | - | ||||||||||||||||||
279 | } | - | ||||||||||||||||||
280 | return returnValue; | - | ||||||||||||||||||
281 | } | - | ||||||||||||||||||
282 | - | |||||||||||||||||||
283 | - | |||||||||||||||||||
284 | QObjectList QObjectPrivate::senderList() const | - | ||||||||||||||||||
285 | { | - | ||||||||||||||||||
286 | QObjectList returnValue; | - | ||||||||||||||||||
287 | QMutexLocker locker(signalSlotLock(q_func())); | - | ||||||||||||||||||
288 | for (Connection *c = senders; c; c = c->next) | - | ||||||||||||||||||
289 | returnValue << c->sender; | - | ||||||||||||||||||
290 | return returnValue; | - | ||||||||||||||||||
291 | } | - | ||||||||||||||||||
292 | void QObjectPrivate::addConnection(int signal, Connection *c) | - | ||||||||||||||||||
293 | { | - | ||||||||||||||||||
294 | ((!(c->sender == q_ptr)) ? qt_assert("c->sender == q_ptr",__FILE__,377384) : qt_noop()); | - | ||||||||||||||||||
295 | if (!connectionLists) | - | ||||||||||||||||||
296 | connectionLists = new QObjectConnectionListVector(); | - | ||||||||||||||||||
297 | if (signal >= connectionLists->count()) | - | ||||||||||||||||||
298 | connectionLists->resize(signal + 1); | - | ||||||||||||||||||
299 | - | |||||||||||||||||||
300 | ConnectionList &connectionList = (*connectionLists)[signal]; | - | ||||||||||||||||||
301 | if (connectionList.last) { | - | ||||||||||||||||||
302 | connectionList.last->nextConnectionList = c; | - | ||||||||||||||||||
303 | } else { | - | ||||||||||||||||||
304 | connectionList.first = c; | - | ||||||||||||||||||
305 | } | - | ||||||||||||||||||
306 | connectionList.last = c; | - | ||||||||||||||||||
307 | - | |||||||||||||||||||
308 | cleanConnectionLists(); | - | ||||||||||||||||||
309 | - | |||||||||||||||||||
310 | c->prev = &(QObjectPrivate::get(c->receiver)->senders); | - | ||||||||||||||||||
311 | c->next = *c->prev; | - | ||||||||||||||||||
312 | *c->prev = c; | - | ||||||||||||||||||
313 | if (c->next) | - | ||||||||||||||||||
314 | c->next->prev = &c->next; | - | ||||||||||||||||||
315 | - | |||||||||||||||||||
316 | if (signal < 0) { | - | ||||||||||||||||||
317 | connectedSignals[0] = connectedSignals[1] = ~0; | - | ||||||||||||||||||
318 | } else if (signal < (int)sizeof(connectedSignals) * 8) { | - | ||||||||||||||||||
319 | connectedSignals[signal >> 5] |= (1 << (signal & 0x1f)); | - | ||||||||||||||||||
320 | } | - | ||||||||||||||||||
321 | } | - | ||||||||||||||||||
322 | - | |||||||||||||||||||
323 | void QObjectPrivate::cleanConnectionLists() | - | ||||||||||||||||||
324 | { | - | ||||||||||||||||||
325 | if (connectionLists->dirty && !connectionLists->inUse) { | - | ||||||||||||||||||
326 | - | |||||||||||||||||||
327 | for (int signal = -1; signal < connectionLists->count(); ++signal) { | - | ||||||||||||||||||
328 | QObjectPrivate::ConnectionList &connectionList = | - | ||||||||||||||||||
329 | (*connectionLists)[signal]; | - | ||||||||||||||||||
330 | - | |||||||||||||||||||
331 | - | |||||||||||||||||||
332 | - | |||||||||||||||||||
333 | - | |||||||||||||||||||
334 | QObjectPrivate::Connection *last = 0; | - | ||||||||||||||||||
335 | - | |||||||||||||||||||
336 | QObjectPrivate::Connection **prev = &connectionList.first; | - | ||||||||||||||||||
337 | QObjectPrivate::Connection *c = *prev; | - | ||||||||||||||||||
338 | while (c) { | - | ||||||||||||||||||
339 | if (c->receiver) { | - | ||||||||||||||||||
340 | last = c; | - | ||||||||||||||||||
341 | prev = &c->nextConnectionList; | - | ||||||||||||||||||
342 | c = *prev; | - | ||||||||||||||||||
343 | } else { | - | ||||||||||||||||||
344 | QObjectPrivate::Connection *next = c->nextConnectionList; | - | ||||||||||||||||||
345 | *prev = next; | - | ||||||||||||||||||
346 | c->deref(); | - | ||||||||||||||||||
347 | c = next; | - | ||||||||||||||||||
348 | } | - | ||||||||||||||||||
349 | } | - | ||||||||||||||||||
350 | - | |||||||||||||||||||
351 | - | |||||||||||||||||||
352 | - | |||||||||||||||||||
353 | connectionList.last = last; | - | ||||||||||||||||||
354 | } | - | ||||||||||||||||||
355 | connectionLists->dirty = false; | - | ||||||||||||||||||
356 | } | - | ||||||||||||||||||
357 | } | - | ||||||||||||||||||
358 | - | |||||||||||||||||||
359 | - | |||||||||||||||||||
360 | - | |||||||||||||||||||
361 | - | |||||||||||||||||||
362 | QMetaCallEvent::QMetaCallEvent(ushort method_offset, ushort method_relative, QObjectPrivate::StaticMetaCallFunction callFunction, | - | ||||||||||||||||||
363 | const QObject *sender, int signalId, | - | ||||||||||||||||||
364 | int nargs, int *types, void **args, QSemaphore *semaphore) | - | ||||||||||||||||||
365 | : QEvent(MetaCall), slotObj_(0), sender_(sender), signalId_(signalId), | - | ||||||||||||||||||
366 | nargs_(nargs), types_(types), args_(args), semaphore_(semaphore), | - | ||||||||||||||||||
367 | callFunction_(callFunction), method_offset_(method_offset), method_relative_(method_relative) | - | ||||||||||||||||||
368 | { } | - | ||||||||||||||||||
369 | - | |||||||||||||||||||
370 | - | |||||||||||||||||||
371 | - | |||||||||||||||||||
372 | - | |||||||||||||||||||
373 | QMetaCallEvent::QMetaCallEvent(QtPrivate::QSlotObjectBase *slotO, const QObject *sender, int signalId, | - | ||||||||||||||||||
374 | int nargs, int *types, void **args, QSemaphore *semaphore) | - | ||||||||||||||||||
375 | : QEvent(MetaCall), slotObj_(slotO), sender_(sender), signalId_(signalId), | - | ||||||||||||||||||
376 | nargs_(nargs), types_(types), args_(args), semaphore_(semaphore), | - | ||||||||||||||||||
377 | callFunction_(0), method_offset_(0), method_relative_(ushort(-1)) | - | ||||||||||||||||||
378 | { | - | ||||||||||||||||||
379 | if (slotObj_) | - | ||||||||||||||||||
380 | slotObj_->ref(); | - | ||||||||||||||||||
381 | } | - | ||||||||||||||||||
382 | - | |||||||||||||||||||
383 | - | |||||||||||||||||||
384 | - | |||||||||||||||||||
385 | - | |||||||||||||||||||
386 | QMetaCallEvent::~QMetaCallEvent() | - | ||||||||||||||||||
387 | { | - | ||||||||||||||||||
388 | if (types_) { | - | ||||||||||||||||||
389 | for (int i = 0; i < nargs_; ++i) { | - | ||||||||||||||||||
390 | if (types_[i] && args_[i]) | - | ||||||||||||||||||
391 | QMetaType::destroy(types_[i], args_[i]); | - | ||||||||||||||||||
392 | } | - | ||||||||||||||||||
393 | free(types_); | - | ||||||||||||||||||
394 | free(args_); | - | ||||||||||||||||||
395 | } | - | ||||||||||||||||||
396 | - | |||||||||||||||||||
397 | if (semaphore_) | - | ||||||||||||||||||
398 | semaphore_->release(); | - | ||||||||||||||||||
399 | - | |||||||||||||||||||
400 | if (slotObj_) | - | ||||||||||||||||||
401 | slotObj_->destroyIfLastRef(); | - | ||||||||||||||||||
402 | } | - | ||||||||||||||||||
403 | - | |||||||||||||||||||
404 | - | |||||||||||||||||||
405 | - | |||||||||||||||||||
406 | - | |||||||||||||||||||
407 | void QMetaCallEvent::placeMetaCall(QObject *object) | - | ||||||||||||||||||
408 | { | - | ||||||||||||||||||
409 | if (slotObj_) { | - | ||||||||||||||||||
410 | slotObj_->call(object, args_); | - | ||||||||||||||||||
411 | } else if (callFunction_ && method_offset_ <= object->metaObject()->methodOffset()) { | - | ||||||||||||||||||
412 | callFunction_(object, QMetaObject::InvokeMetaMethod, method_relative_, args_); | - | ||||||||||||||||||
413 | } else { | - | ||||||||||||||||||
414 | QMetaObject::metacall(object, QMetaObject::InvokeMetaMethod, method_offset_ + method_relative_, args_); | - | ||||||||||||||||||
415 | } | - | ||||||||||||||||||
416 | } | - | ||||||||||||||||||
417 | void *qt_find_obj_child(QObject *parent, const char *type, const QString &name) | - | ||||||||||||||||||
418 | { | - | ||||||||||||||||||
419 | QObjectList list = parent->children(); | - | ||||||||||||||||||
420 | if (list.size() == 0) return 0; | - | ||||||||||||||||||
421 | for (int i = 0; i < list.size(); ++i) { | - | ||||||||||||||||||
422 | QObject *obj = list.at(i); | - | ||||||||||||||||||
423 | if (name == obj->objectName() && obj->inherits(type)) | - | ||||||||||||||||||
424 | return obj; | - | ||||||||||||||||||
425 | } | - | ||||||||||||||||||
426 | return 0; | - | ||||||||||||||||||
427 | } | - | ||||||||||||||||||
428 | - | |||||||||||||||||||
429 | - | |||||||||||||||||||
430 | - | |||||||||||||||||||
431 | - | |||||||||||||||||||
432 | - | |||||||||||||||||||
433 | - | |||||||||||||||||||
434 | - | |||||||||||||||||||
435 | static bool check_parent_thread(QObject *parent, | - | ||||||||||||||||||
436 | QThreadData *parentThreadData, | - | ||||||||||||||||||
437 | QThreadData *currentThreadData) | - | ||||||||||||||||||
438 | { | - | ||||||||||||||||||
439 | if (parent && parentThreadData != currentThreadData) { | - | ||||||||||||||||||
440 | QThread *parentThread = parentThreadData->thread; | - | ||||||||||||||||||
441 | QThread *currentThread = currentThreadData->thread; | - | ||||||||||||||||||
442 | QMessageLogger(__FILE__, 786793, __PRETTY_FUNCTION__).warning("QObject: Cannot create children for a parent that is in a different thread.\n" | - | ||||||||||||||||||
443 | "(Parent is %s(%p), parent's thread is %s(%p), current thread is %s(%p)", | - | ||||||||||||||||||
444 | parent->metaObject()->className(), | - | ||||||||||||||||||
445 | parent, | - | ||||||||||||||||||
446 | parentThread ? parentThread->metaObject()->className() : "QThread", | - | ||||||||||||||||||
447 | parentThread, | - | ||||||||||||||||||
448 | currentThread ? currentThread->metaObject()->className() : "QThread", | - | ||||||||||||||||||
449 | currentThread); | - | ||||||||||||||||||
450 | return false; | - | ||||||||||||||||||
451 | } | - | ||||||||||||||||||
452 | return true; | - | ||||||||||||||||||
453 | } | - | ||||||||||||||||||
454 | QObject::QObject(QObject *parent) | - | ||||||||||||||||||
455 | : d_ptr(new QObjectPrivate) | - | ||||||||||||||||||
456 | { | - | ||||||||||||||||||
457 | QObjectPrivate * const d = d_func(); | - | ||||||||||||||||||
458 | d_ptr->q_ptr = this; | - | ||||||||||||||||||
459 | d->threadData = (parent && !parent->thread()) ? parent->d_func()->threadData : QThreadData::current(); | - | ||||||||||||||||||
460 | d->threadData->ref(); | - | ||||||||||||||||||
461 | if (parent) { | - | ||||||||||||||||||
462 | try { | - | ||||||||||||||||||
463 | if (!check_parent_thread(parent, parent ? parent->d_func()->threadData : 0, d->threadData)) | - | ||||||||||||||||||
464 | parent = 0; | - | ||||||||||||||||||
465 | setParent(parent); | - | ||||||||||||||||||
466 | } catch (...) { | - | ||||||||||||||||||
467 | d->threadData->deref(); | - | ||||||||||||||||||
468 | throw; | - | ||||||||||||||||||
469 | } | - | ||||||||||||||||||
470 | } | - | ||||||||||||||||||
471 | qt_addObject(this); | - | ||||||||||||||||||
472 | if (__builtin_expect(!!(qtHookData[QHooks::AddQObject]), false)) | - | ||||||||||||||||||
473 | reinterpret_cast<QHooks::AddQObjectCallback>(qtHookData[QHooks::AddQObject])(this); | - | ||||||||||||||||||
474 | } | - | ||||||||||||||||||
475 | - | |||||||||||||||||||
476 | - | |||||||||||||||||||
477 | - | |||||||||||||||||||
478 | - | |||||||||||||||||||
479 | QObject::QObject(QObjectPrivate &dd, QObject *parent) | - | ||||||||||||||||||
480 | : d_ptr(&dd) | - | ||||||||||||||||||
481 | { | - | ||||||||||||||||||
482 | QObjectPrivate * const d = d_func(); | - | ||||||||||||||||||
483 | d_ptr->q_ptr = this; | - | ||||||||||||||||||
484 | d->threadData = (parent && !parent->thread()) ? parent->d_func()->threadData : QThreadData::current(); | - | ||||||||||||||||||
485 | d->threadData->ref(); | - | ||||||||||||||||||
486 | if (parent) { | - | ||||||||||||||||||
487 | try { | - | ||||||||||||||||||
488 | if (!check_parent_thread(parent, parent ? parent->d_func()->threadData : 0, d->threadData)) | - | ||||||||||||||||||
489 | parent = 0; | - | ||||||||||||||||||
490 | if (d->isWidget) { | - | ||||||||||||||||||
491 | if (parent) { | - | ||||||||||||||||||
492 | d->parent = parent; | - | ||||||||||||||||||
493 | d->parent->d_func()->children.append(this); | - | ||||||||||||||||||
494 | } | - | ||||||||||||||||||
495 | - | |||||||||||||||||||
496 | } else { | - | ||||||||||||||||||
497 | setParent(parent); | - | ||||||||||||||||||
498 | } | - | ||||||||||||||||||
499 | } catch (...) { | - | ||||||||||||||||||
500 | d->threadData->deref(); | - | ||||||||||||||||||
501 | throw; | - | ||||||||||||||||||
502 | } | - | ||||||||||||||||||
503 | } | - | ||||||||||||||||||
504 | qt_addObject(this); | - | ||||||||||||||||||
505 | if (__builtin_expect(!!(qtHookData[QHooks::AddQObject]), false)) | - | ||||||||||||||||||
506 | reinterpret_cast<QHooks::AddQObjectCallback>(qtHookData[QHooks::AddQObject])(this); | - | ||||||||||||||||||
507 | } | - | ||||||||||||||||||
508 | QObject::~QObject() | - | ||||||||||||||||||
509 | { | - | ||||||||||||||||||
510 | QObjectPrivate * const d = d_func(); | - | ||||||||||||||||||
511 | d->wasDeleted = true; | - | ||||||||||||||||||
512 | d->blockSig = 0; | - | ||||||||||||||||||
513 | - | |||||||||||||||||||
514 | QtSharedPointer::ExternalRefCountData *sharedRefcount = d->sharedRefcount.load(); | - | ||||||||||||||||||
515 | if (sharedRefcount) { | - | ||||||||||||||||||
516 | if (sharedRefcount->strongref.load() > 0) { | - | ||||||||||||||||||
517 | QMessageLogger(__FILE__, 902909, __PRETTY_FUNCTION__).warning("QObject: shared QObject was deleted directly. The program is malformed and may crash."); | - | ||||||||||||||||||
518 | - | |||||||||||||||||||
519 | } | - | ||||||||||||||||||
520 | - | |||||||||||||||||||
521 | - | |||||||||||||||||||
522 | sharedRefcount->strongref.store(0); | - | ||||||||||||||||||
523 | if (!sharedRefcount->weakref.deref()) | - | ||||||||||||||||||
524 | delete sharedRefcount; | - | ||||||||||||||||||
525 | } | - | ||||||||||||||||||
526 | - | |||||||||||||||||||
527 | if (!d->isWidget && d->isSignalConnected(0)) { | - | ||||||||||||||||||
528 | destroyed(this); | - | ||||||||||||||||||
529 | } | - | ||||||||||||||||||
530 | - | |||||||||||||||||||
531 | if (d->declarativeData) { | - | ||||||||||||||||||
532 | if (static_cast<QAbstractDeclarativeDataImpl*>(d->declarativeData)->ownedByQml1) { | - | ||||||||||||||||||
533 | if (QAbstractDeclarativeData::destroyed_qml1) | - | ||||||||||||||||||
534 | QAbstractDeclarativeData::destroyed_qml1(d->declarativeData, this); | - | ||||||||||||||||||
535 | } else { | - | ||||||||||||||||||
536 | if (QAbstractDeclarativeData::destroyed) | - | ||||||||||||||||||
537 | QAbstractDeclarativeData::destroyed(d->declarativeData, this); | - | ||||||||||||||||||
538 | } | - | ||||||||||||||||||
539 | } | - | ||||||||||||||||||
540 | - | |||||||||||||||||||
541 | - | |||||||||||||||||||
542 | if (d->currentSender != 0) | - | ||||||||||||||||||
543 | d->currentSender->ref = 0; | - | ||||||||||||||||||
544 | d->currentSender = 0; | - | ||||||||||||||||||
545 | - | |||||||||||||||||||
546 | if (d->connectionLists || d->senders) { | - | ||||||||||||||||||
547 | QMutex *signalSlotMutex = signalSlotLock(this); | - | ||||||||||||||||||
548 | QMutexLocker locker(signalSlotMutex); | - | ||||||||||||||||||
549 | - | |||||||||||||||||||
550 | - | |||||||||||||||||||
551 | if (d->connectionLists) { | - | ||||||||||||||||||
552 | ++d->connectionLists->inUse; | - | ||||||||||||||||||
553 | int connectionListsCount = d->connectionLists->count(); | - | ||||||||||||||||||
554 | for (int signal = -1; signal < connectionListsCount; ++signal) { | - | ||||||||||||||||||
555 | QObjectPrivate::ConnectionList &connectionList = | - | ||||||||||||||||||
556 | (*d->connectionLists)[signal]; | - | ||||||||||||||||||
557 | - | |||||||||||||||||||
558 | while (QObjectPrivate::Connection *c = connectionList.first) { | - | ||||||||||||||||||
559 | if (!c->receiver) { | - | ||||||||||||||||||
560 | connectionList.first = c->nextConnectionList; | - | ||||||||||||||||||
561 | c->deref(); | - | ||||||||||||||||||
562 | continue; | - | ||||||||||||||||||
563 | } | - | ||||||||||||||||||
564 | - | |||||||||||||||||||
565 | QMutex *m = signalSlotLock(c->receiver); | - | ||||||||||||||||||
566 | bool needToUnlock = QOrderedMutexLocker::relock(signalSlotMutex, m); | - | ||||||||||||||||||
567 | - | |||||||||||||||||||
568 | if (c->receiver) { | - | ||||||||||||||||||
569 | *c->prev = c->next; | - | ||||||||||||||||||
570 | if (c->next) c->next->prev = c->prev; | - | ||||||||||||||||||
571 | } | - | ||||||||||||||||||
572 | c->receiver = 0; | - | ||||||||||||||||||
573 | if (needToUnlock) | - | ||||||||||||||||||
574 | m->unlock(); | - | ||||||||||||||||||
575 | - | |||||||||||||||||||
576 | connectionList.first = c->nextConnectionList; | - | ||||||||||||||||||
577 | - | |||||||||||||||||||
578 | - | |||||||||||||||||||
579 | if (c->isSlotObject) { | - | ||||||||||||||||||
580 | c->isSlotObject = false; | - | ||||||||||||||||||
581 | locker.unlock(); | - | ||||||||||||||||||
582 | c->slotObj->destroyIfLastRef(); | - | ||||||||||||||||||
583 | locker.relock(); | - | ||||||||||||||||||
584 | } | - | ||||||||||||||||||
585 | c->deref(); | - | ||||||||||||||||||
586 | } | - | ||||||||||||||||||
587 | } | - | ||||||||||||||||||
588 | - | |||||||||||||||||||
589 | if (!--d->connectionLists->inUse) { | - | ||||||||||||||||||
590 | delete d->connectionLists; | - | ||||||||||||||||||
591 | } else { | - | ||||||||||||||||||
592 | d->connectionLists->orphaned = true; | - | ||||||||||||||||||
593 | } | - | ||||||||||||||||||
594 | d->connectionLists = 0; | - | ||||||||||||||||||
595 | } | - | ||||||||||||||||||
596 | QObjectPrivate::Connection *node = d->senders; | - | ||||||||||||||||||
597 | while (node) { | - | ||||||||||||||||||
598 | QObject *sender = node->sender; | - | ||||||||||||||||||
599 | - | |||||||||||||||||||
600 | - | |||||||||||||||||||
601 | - | |||||||||||||||||||
602 | sender->disconnectNotify(QMetaObjectPrivate::signal(sender->metaObject(), node->signal_index)); | - | ||||||||||||||||||
603 | QMutex *m = signalSlotLock(sender); | - | ||||||||||||||||||
604 | node->prev = &node; | - | ||||||||||||||||||
605 | bool needToUnlock = QOrderedMutexLocker::relock(signalSlotMutex, m); | - | ||||||||||||||||||
606 | - | |||||||||||||||||||
607 | if (!node || node->sender != sender) { | - | ||||||||||||||||||
608 | - | |||||||||||||||||||
609 | ((!(needToUnlock)) ? qt_assert("needToUnlock",__FILE__,10041011) : qt_noop()); | - | ||||||||||||||||||
610 | m->unlock(); | - | ||||||||||||||||||
611 | continue; | - | ||||||||||||||||||
612 | } | - | ||||||||||||||||||
613 | node->receiver = 0; | - | ||||||||||||||||||
614 | QObjectConnectionListVector *senderLists = sender->d_func()->connectionLists; | - | ||||||||||||||||||
615 | if (senderLists) | - | ||||||||||||||||||
616 | senderLists->dirty = true; | - | ||||||||||||||||||
617 | - | |||||||||||||||||||
618 | QtPrivate::QSlotObjectBase *slotObj = nullptr; | - | ||||||||||||||||||
619 | if (node->isSlotObject) { | - | ||||||||||||||||||
620 | slotObj = node->slotObj; | - | ||||||||||||||||||
621 | node->isSlotObject = false; | - | ||||||||||||||||||
622 | } | - | ||||||||||||||||||
623 | - | |||||||||||||||||||
624 | node = node->next; | - | ||||||||||||||||||
625 | if (needToUnlock) | - | ||||||||||||||||||
626 | m->unlock(); | - | ||||||||||||||||||
627 | - | |||||||||||||||||||
628 | if (slotObj) { | - | ||||||||||||||||||
629 | if (node) | - | ||||||||||||||||||
630 | node->prev = &node; | - | ||||||||||||||||||
631 | locker.unlock(); | - | ||||||||||||||||||
632 | slotObj->destroyIfLastRef(); | - | ||||||||||||||||||
633 | locker.relock(); | - | ||||||||||||||||||
634 | } | - | ||||||||||||||||||
635 | } | - | ||||||||||||||||||
636 | } | - | ||||||||||||||||||
637 | - | |||||||||||||||||||
638 | if (!d->children.isEmpty()) | - | ||||||||||||||||||
639 | d->deleteChildren(); | - | ||||||||||||||||||
640 | - | |||||||||||||||||||
641 | qt_removeObject(this); | - | ||||||||||||||||||
642 | if (__builtin_expect(!!(qtHookData[QHooks::RemoveQObject]), false)) | - | ||||||||||||||||||
643 | reinterpret_cast<QHooks::RemoveQObjectCallback>(qtHookData[QHooks::RemoveQObject])(this); | - | ||||||||||||||||||
644 | - | |||||||||||||||||||
645 | if (d->parent) | - | ||||||||||||||||||
646 | d->setParent_helper(0); | - | ||||||||||||||||||
647 | } | - | ||||||||||||||||||
648 | - | |||||||||||||||||||
649 | QObjectPrivate::Connection::~Connection() | - | ||||||||||||||||||
650 | { | - | ||||||||||||||||||
651 | if (ownArgumentTypes) { | - | ||||||||||||||||||
652 | const int *v = argumentTypes.load(); | - | ||||||||||||||||||
653 | if (v != &DIRECT_CONNECTION_ONLY) | - | ||||||||||||||||||
654 | delete [] v; | - | ||||||||||||||||||
655 | } | - | ||||||||||||||||||
656 | if (isSlotObject) | - | ||||||||||||||||||
657 | slotObj->destroyIfLastRef(); | - | ||||||||||||||||||
658 | } | - | ||||||||||||||||||
659 | QString QObject::objectName() const | - | ||||||||||||||||||
660 | { | - | ||||||||||||||||||
661 | const QObjectPrivate * const d = d_func(); | - | ||||||||||||||||||
662 | return d->extraData ? d->extraData->objectName : QString(); | - | ||||||||||||||||||
663 | } | - | ||||||||||||||||||
664 | - | |||||||||||||||||||
665 | - | |||||||||||||||||||
666 | - | |||||||||||||||||||
667 | - | |||||||||||||||||||
668 | void QObject::setObjectName(const QString &name) | - | ||||||||||||||||||
669 | { | - | ||||||||||||||||||
670 | QObjectPrivate * const d = d_func(); | - | ||||||||||||||||||
671 | if (!d->extraData) | - | ||||||||||||||||||
672 | d->extraData = new QObjectPrivate::ExtraData; | - | ||||||||||||||||||
673 | - | |||||||||||||||||||
674 | if (d->extraData->objectName != name) { | - | ||||||||||||||||||
675 | d->extraData->objectName = name; | - | ||||||||||||||||||
676 | objectNameChanged(d->extraData->objectName, QPrivateSignal()); | - | ||||||||||||||||||
677 | } | - | ||||||||||||||||||
678 | } | - | ||||||||||||||||||
679 | bool QObject::event(QEvent *e) | - | ||||||||||||||||||
680 | { | - | ||||||||||||||||||
681 | switch (e->type()) { | - | ||||||||||||||||||
682 | case QEvent::Timer: | - | ||||||||||||||||||
683 | timerEvent((QTimerEvent*)e); | - | ||||||||||||||||||
684 | break; | - | ||||||||||||||||||
685 | - | |||||||||||||||||||
686 | case QEvent::ChildAdded: | - | ||||||||||||||||||
687 | case QEvent::ChildPolished: | - | ||||||||||||||||||
688 | case QEvent::ChildRemoved: | - | ||||||||||||||||||
689 | childEvent((QChildEvent*)e); | - | ||||||||||||||||||
690 | break; | - | ||||||||||||||||||
691 | - | |||||||||||||||||||
692 | case QEvent::DeferredDelete: | - | ||||||||||||||||||
693 | qDeleteInEventHandler(this); | - | ||||||||||||||||||
694 | break; | - | ||||||||||||||||||
695 | - | |||||||||||||||||||
696 | case QEvent::MetaCall: | - | ||||||||||||||||||
697 | { | - | ||||||||||||||||||
698 | QMetaCallEvent *mce = static_cast<QMetaCallEvent*>(e); | - | ||||||||||||||||||
699 | - | |||||||||||||||||||
700 | QConnectionSenderSwitcher sw(this, const_cast<QObject*>(mce->sender()), mce->signalId()); | - | ||||||||||||||||||
701 | - | |||||||||||||||||||
702 | mce->placeMetaCall(this); | - | ||||||||||||||||||
703 | break; | - | ||||||||||||||||||
704 | } | - | ||||||||||||||||||
705 | - | |||||||||||||||||||
706 | case QEvent::ThreadChange: { | - | ||||||||||||||||||
707 | QObjectPrivate * const d = d_func(); | - | ||||||||||||||||||
708 | QThreadData *threadData = d->threadData; | - | ||||||||||||||||||
709 | QAbstractEventDispatcher *eventDispatcher = threadData->eventDispatcher.load(); | - | ||||||||||||||||||
710 | if (eventDispatcher) { | - | ||||||||||||||||||
711 | QList<QAbstractEventDispatcher::TimerInfo> timers = eventDispatcher->registeredTimers(this); | - | ||||||||||||||||||
712 | if (!timers.isEmpty()) { | - | ||||||||||||||||||
713 | - | |||||||||||||||||||
714 | eventDispatcher->unregisterTimers(this); | - | ||||||||||||||||||
715 | QMetaObject::invokeMethod(this, "_q_reregisterTimers", Qt::QueuedConnection, | - | ||||||||||||||||||
716 | QArgument<void* >("void*", (new QList<QAbstractEventDispatcher::TimerInfo>(timers)))); | - | ||||||||||||||||||
717 | } | - | ||||||||||||||||||
718 | } | - | ||||||||||||||||||
719 | break; | - | ||||||||||||||||||
720 | } | - | ||||||||||||||||||
721 | - | |||||||||||||||||||
722 | default: | - | ||||||||||||||||||
723 | if (e->type() >= QEvent::User) { | - | ||||||||||||||||||
724 | customEvent(e); | - | ||||||||||||||||||
725 | break; | - | ||||||||||||||||||
726 | } | - | ||||||||||||||||||
727 | return false; | - | ||||||||||||||||||
728 | } | - | ||||||||||||||||||
729 | return true; | - | ||||||||||||||||||
730 | } | - | ||||||||||||||||||
731 | void QObject::timerEvent(QTimerEvent *) | - | ||||||||||||||||||
732 | { | - | ||||||||||||||||||
733 | } | - | ||||||||||||||||||
734 | void QObject::childEvent(QChildEvent * ) | - | ||||||||||||||||||
735 | { | - | ||||||||||||||||||
736 | } | - | ||||||||||||||||||
737 | void QObject::customEvent(QEvent * ) | - | ||||||||||||||||||
738 | { | - | ||||||||||||||||||
739 | } | - | ||||||||||||||||||
740 | bool QObject::eventFilter(QObject * , QEvent * ) | - | ||||||||||||||||||
741 | { | - | ||||||||||||||||||
742 | return false; | - | ||||||||||||||||||
743 | } | - | ||||||||||||||||||
744 | bool QObject::blockSignals(bool block) noexcept | - | ||||||||||||||||||
745 | { | - | ||||||||||||||||||
746 | QObjectPrivate * const d = d_func(); | - | ||||||||||||||||||
747 | bool previous = d->blockSig; | - | ||||||||||||||||||
748 | d->blockSig = block; | - | ||||||||||||||||||
749 | return executed 39656 times by 104 tests: previous;return previous; Executed by:
executed 39656 times by 104 tests: return previous; Executed by:
| 39656 | ||||||||||||||||||
750 | } | - | ||||||||||||||||||
751 | - | |||||||||||||||||||
752 | - | |||||||||||||||||||
753 | - | |||||||||||||||||||
754 | - | |||||||||||||||||||
755 | - | |||||||||||||||||||
756 | - | |||||||||||||||||||
757 | QThread *QObject::thread() const | - | ||||||||||||||||||
758 | { | - | ||||||||||||||||||
759 | return d_func()->threadData->thread; | - | ||||||||||||||||||
760 | } | - | ||||||||||||||||||
761 | void QObject::moveToThread(QThread *targetThread) | - | ||||||||||||||||||
762 | { | - | ||||||||||||||||||
763 | QObjectPrivate * const d = d_func(); | - | ||||||||||||||||||
764 | - | |||||||||||||||||||
765 | if (d->threadData->thread == targetThread) { | - | ||||||||||||||||||
766 | - | |||||||||||||||||||
767 | return; | - | ||||||||||||||||||
768 | } | - | ||||||||||||||||||
769 | - | |||||||||||||||||||
770 | if (d->parent != 0) { | - | ||||||||||||||||||
771 | QMessageLogger(__FILE__, 14721479, __PRETTY_FUNCTION__).warning("QObject::moveToThread: Cannot move objects with a parent"); | - | ||||||||||||||||||
772 | return; | - | ||||||||||||||||||
773 | } | - | ||||||||||||||||||
774 | if (d->isWidget) { | - | ||||||||||||||||||
775 | QMessageLogger(__FILE__, 14761483, __PRETTY_FUNCTION__).warning("QObject::moveToThread: Widgets cannot be moved to a new thread"); | - | ||||||||||||||||||
776 | return; | - | ||||||||||||||||||
777 | } | - | ||||||||||||||||||
778 | - | |||||||||||||||||||
779 | QThreadData *currentData = QThreadData::current(); | - | ||||||||||||||||||
780 | QThreadData *targetData = targetThread ? QThreadData::get2(targetThread) : nullptr; | - | ||||||||||||||||||
781 | if (d->threadData->thread == 0 && currentData == targetData) { | - | ||||||||||||||||||
782 | - | |||||||||||||||||||
783 | currentData = d->threadData; | - | ||||||||||||||||||
784 | } else if (d->threadData != currentData) { | - | ||||||||||||||||||
785 | QMessageLogger(__FILE__, 14861493, __PRETTY_FUNCTION__).warning("QObject::moveToThread: Current thread (%p) is not the object's thread (%p).\n" | - | ||||||||||||||||||
786 | "Cannot move to target thread (%p)\n", | - | ||||||||||||||||||
787 | currentData->thread.load(), d->threadData->thread.load(), targetData ? targetData->thread.load() : nullptr); | - | ||||||||||||||||||
788 | - | |||||||||||||||||||
789 | - | |||||||||||||||||||
790 | - | |||||||||||||||||||
791 | - | |||||||||||||||||||
792 | - | |||||||||||||||||||
793 | - | |||||||||||||||||||
794 | - | |||||||||||||||||||
795 | return; | - | ||||||||||||||||||
796 | } | - | ||||||||||||||||||
797 | - | |||||||||||||||||||
798 | - | |||||||||||||||||||
799 | d->moveToThread_helper(); | - | ||||||||||||||||||
800 | - | |||||||||||||||||||
801 | if (!targetData) | - | ||||||||||||||||||
802 | targetData = new QThreadData(0); | - | ||||||||||||||||||
803 | - | |||||||||||||||||||
804 | QOrderedMutexLocker locker(¤tData->postEventList.mutex, | - | ||||||||||||||||||
805 | &targetData->postEventList.mutex); | - | ||||||||||||||||||
806 | - | |||||||||||||||||||
807 | - | |||||||||||||||||||
808 | currentData->ref(); | - | ||||||||||||||||||
809 | - | |||||||||||||||||||
810 | - | |||||||||||||||||||
811 | d_func()->setThreadData_helper(currentData, targetData); | - | ||||||||||||||||||
812 | - | |||||||||||||||||||
813 | locker.unlock(); | - | ||||||||||||||||||
814 | - | |||||||||||||||||||
815 | - | |||||||||||||||||||
816 | currentData->deref(); | - | ||||||||||||||||||
817 | } | - | ||||||||||||||||||
818 | - | |||||||||||||||||||
819 | void QObjectPrivate::moveToThread_helper() | - | ||||||||||||||||||
820 | { | - | ||||||||||||||||||
821 | QObject * const q = q_func(); | - | ||||||||||||||||||
822 | QEvent e(QEvent::ThreadChange); | - | ||||||||||||||||||
823 | QCoreApplication::sendEvent(q, &e); | - | ||||||||||||||||||
824 | for (int i = 0; i < children.size(); ++i) { | - | ||||||||||||||||||
825 | QObject *child = children.at(i); | - | ||||||||||||||||||
826 | child->d_func()->moveToThread_helper(); | - | ||||||||||||||||||
827 | } | - | ||||||||||||||||||
828 | } | - | ||||||||||||||||||
829 | - | |||||||||||||||||||
830 | void QObjectPrivate::setThreadData_helper(QThreadData *currentData, QThreadData *targetData) | - | ||||||||||||||||||
831 | { | - | ||||||||||||||||||
832 | QObject * const q = q_func(); | - | ||||||||||||||||||
833 | - | |||||||||||||||||||
834 | - | |||||||||||||||||||
835 | int eventsMoved = 0; | - | ||||||||||||||||||
836 | for (int i = 0; i < currentData->postEventList.size(); ++i) { | - | ||||||||||||||||||
837 | const QPostEvent &pe = currentData->postEventList.at(i); | - | ||||||||||||||||||
838 | if (!pe.event) | - | ||||||||||||||||||
839 | continue; | - | ||||||||||||||||||
840 | if (pe.receiver == q) { | - | ||||||||||||||||||
841 | - | |||||||||||||||||||
842 | targetData->postEventList.addEvent(pe); | - | ||||||||||||||||||
843 | const_cast<QPostEvent &>(pe).event = 0; | - | ||||||||||||||||||
844 | ++eventsMoved; | - | ||||||||||||||||||
845 | } | - | ||||||||||||||||||
846 | } | - | ||||||||||||||||||
847 | if (eventsMoved > 0 && targetData->eventDispatcher.load()) { | - | ||||||||||||||||||
848 | targetData->canWait = false; | - | ||||||||||||||||||
849 | targetData->eventDispatcher.load()->wakeUp(); | - | ||||||||||||||||||
850 | } | - | ||||||||||||||||||
851 | - | |||||||||||||||||||
852 | - | |||||||||||||||||||
853 | if (currentSender) | - | ||||||||||||||||||
854 | currentSender->ref = 0; | - | ||||||||||||||||||
855 | currentSender = 0; | - | ||||||||||||||||||
856 | - | |||||||||||||||||||
857 | - | |||||||||||||||||||
858 | targetData->ref(); | - | ||||||||||||||||||
859 | threadData->deref(); | - | ||||||||||||||||||
860 | threadData = targetData; | - | ||||||||||||||||||
861 | - | |||||||||||||||||||
862 | for (int i = 0; i < children.size(); ++i) { | - | ||||||||||||||||||
863 | QObject *child = children.at(i); | - | ||||||||||||||||||
864 | child->d_func()->setThreadData_helper(currentData, targetData); | - | ||||||||||||||||||
865 | } | - | ||||||||||||||||||
866 | } | - | ||||||||||||||||||
867 | - | |||||||||||||||||||
868 | void QObjectPrivate::_q_reregisterTimers(void *pointer) | - | ||||||||||||||||||
869 | { | - | ||||||||||||||||||
870 | QObject * const q = q_func(); | - | ||||||||||||||||||
871 | QList<QAbstractEventDispatcher::TimerInfo> *timerList = reinterpret_cast<QList<QAbstractEventDispatcher::TimerInfo> *>(pointer); | - | ||||||||||||||||||
872 | QAbstractEventDispatcher *eventDispatcher = threadData->eventDispatcher.load(); | - | ||||||||||||||||||
873 | for (int i = 0; i < timerList->size(); ++i) { | - | ||||||||||||||||||
874 | const QAbstractEventDispatcher::TimerInfo &ti = timerList->at(i); | - | ||||||||||||||||||
875 | eventDispatcher->registerTimer(ti.timerId, ti.interval, ti.timerType, q); | - | ||||||||||||||||||
876 | } | - | ||||||||||||||||||
877 | delete timerList; | - | ||||||||||||||||||
878 | } | - | ||||||||||||||||||
879 | int QObject::startTimer(int interval, Qt::TimerType timerType) | - | ||||||||||||||||||
880 | { | - | ||||||||||||||||||
881 | QObjectPrivate * const d = d_func(); | - | ||||||||||||||||||
882 | - | |||||||||||||||||||
883 | if (__builtin_expect(!!(interval < 0), false)) { | - | ||||||||||||||||||
884 | QMessageLogger(__FILE__, 16281635, __PRETTY_FUNCTION__).warning("QObject::startTimer: Timers cannot have negative intervals"); | - | ||||||||||||||||||
885 | return 0; | - | ||||||||||||||||||
886 | } | - | ||||||||||||||||||
887 | if (__builtin_expect(!!(!d->threadData->eventDispatcher.load()), false)) { | - | ||||||||||||||||||
888 | QMessageLogger(__FILE__, 16321639, __PRETTY_FUNCTION__).warning("QObject::startTimer: Timers can only be used with threads started with QThread"); | - | ||||||||||||||||||
889 | return 0; | - | ||||||||||||||||||
890 | } | - | ||||||||||||||||||
891 | if (__builtin_expect(!!(thread() != QThread::currentThread()), false)) { | - | ||||||||||||||||||
892 | QMessageLogger(__FILE__, 16361643, __PRETTY_FUNCTION__).warning("QObject::startTimer: Timers cannot be started from another thread"); | - | ||||||||||||||||||
893 | return 0; | - | ||||||||||||||||||
894 | } | - | ||||||||||||||||||
895 | int timerId = d->threadData->eventDispatcher.load()->registerTimer(interval, timerType, this); | - | ||||||||||||||||||
896 | if (!d->extraData) | - | ||||||||||||||||||
897 | d->extraData = new QObjectPrivate::ExtraData; | - | ||||||||||||||||||
898 | d->extraData->runningTimers.append(timerId); | - | ||||||||||||||||||
899 | return timerId; | - | ||||||||||||||||||
900 | } | - | ||||||||||||||||||
901 | void QObject::killTimer(int id) | - | ||||||||||||||||||
902 | { | - | ||||||||||||||||||
903 | QObjectPrivate * const d = d_func(); | - | ||||||||||||||||||
904 | if (__builtin_expect(!!(thread() != QThread::currentThread()), false)) { | - | ||||||||||||||||||
905 | QMessageLogger(__FILE__, 16591666, __PRETTY_FUNCTION__).warning("QObject::killTimer: Timers cannot be stopped from another thread"); | - | ||||||||||||||||||
906 | return; | - | ||||||||||||||||||
907 | } | - | ||||||||||||||||||
908 | if (id) { | - | ||||||||||||||||||
909 | int at = d->extraData ? d->extraData->runningTimers.indexOf(id) : -1; | - | ||||||||||||||||||
910 | if (at == -1) { | - | ||||||||||||||||||
911 | - | |||||||||||||||||||
912 | QMessageLogger(__FILE__, 16661673, __PRETTY_FUNCTION__).warning("QObject::killTimer(): Error: timer id %d is not valid for object %p (%s, %s), timer has not been killed", | - | ||||||||||||||||||
913 | id, | - | ||||||||||||||||||
914 | this, | - | ||||||||||||||||||
915 | metaObject()->className(), | - | ||||||||||||||||||
916 | QString(objectName()).toLocal8Bit().constData()); | - | ||||||||||||||||||
917 | return; | - | ||||||||||||||||||
918 | } | - | ||||||||||||||||||
919 | - | |||||||||||||||||||
920 | if (d->threadData->eventDispatcher.load()) | - | ||||||||||||||||||
921 | d->threadData->eventDispatcher.load()->unregisterTimer(id); | - | ||||||||||||||||||
922 | - | |||||||||||||||||||
923 | d->extraData->runningTimers.remove(at); | - | ||||||||||||||||||
924 | QAbstractEventDispatcherPrivate::releaseTimerId(id); | - | ||||||||||||||||||
925 | } | - | ||||||||||||||||||
926 | } | - | ||||||||||||||||||
927 | void qt_qFindChildren_helper(const QObject *parent, const QString &name, | - | ||||||||||||||||||
928 | const QMetaObject &mo, QList<void*> *list, Qt::FindChildOptions options) | - | ||||||||||||||||||
929 | { | - | ||||||||||||||||||
930 | if (!parent || !list) | - | ||||||||||||||||||
931 | return; | - | ||||||||||||||||||
932 | const QObjectList &children = parent->children(); | - | ||||||||||||||||||
933 | QObject *obj; | - | ||||||||||||||||||
934 | for (int i = 0; i < children.size(); ++i) { | - | ||||||||||||||||||
935 | obj = children.at(i); | - | ||||||||||||||||||
936 | if (mo.cast(obj)) { | - | ||||||||||||||||||
937 | if (name.isNull() || obj->objectName() == name) | - | ||||||||||||||||||
938 | list->append(obj); | - | ||||||||||||||||||
939 | } | - | ||||||||||||||||||
940 | if (options & Qt::FindChildrenRecursively) | - | ||||||||||||||||||
941 | qt_qFindChildren_helper(obj, name, mo, list, options); | - | ||||||||||||||||||
942 | } | - | ||||||||||||||||||
943 | } | - | ||||||||||||||||||
944 | - | |||||||||||||||||||
945 | - | |||||||||||||||||||
946 | - | |||||||||||||||||||
947 | - | |||||||||||||||||||
948 | - | |||||||||||||||||||
949 | void qt_qFindChildren_helper(const QObject *parent, const QRegExp &re, | - | ||||||||||||||||||
950 | const QMetaObject &mo, QList<void*> *list, Qt::FindChildOptions options) | - | ||||||||||||||||||
951 | { | - | ||||||||||||||||||
952 | if (!parent || !list) | - | ||||||||||||||||||
953 | return; | - | ||||||||||||||||||
954 | const QObjectList &children = parent->children(); | - | ||||||||||||||||||
955 | QRegExp reCopy = re; | - | ||||||||||||||||||
956 | QObject *obj; | - | ||||||||||||||||||
957 | for (int i = 0; i < children.size(); ++i) { | - | ||||||||||||||||||
958 | obj = children.at(i); | - | ||||||||||||||||||
959 | if (mo.cast(obj) && reCopy.indexIn(obj->objectName()) != -1) | - | ||||||||||||||||||
960 | list->append(obj); | - | ||||||||||||||||||
961 | - | |||||||||||||||||||
962 | if (options & Qt::FindChildrenRecursively) | - | ||||||||||||||||||
963 | qt_qFindChildren_helper(obj, re, mo, list, options); | - | ||||||||||||||||||
964 | } | - | ||||||||||||||||||
965 | } | - | ||||||||||||||||||
966 | - | |||||||||||||||||||
967 | - | |||||||||||||||||||
968 | - | |||||||||||||||||||
969 | - | |||||||||||||||||||
970 | - | |||||||||||||||||||
971 | - | |||||||||||||||||||
972 | void qt_qFindChildren_helper(const QObject *parent, const QRegularExpression &re, | - | ||||||||||||||||||
973 | const QMetaObject &mo, QList<void*> *list, Qt::FindChildOptions options) | - | ||||||||||||||||||
974 | { | - | ||||||||||||||||||
975 | if (!parent || !list) | - | ||||||||||||||||||
976 | return; | - | ||||||||||||||||||
977 | const QObjectList &children = parent->children(); | - | ||||||||||||||||||
978 | QObject *obj; | - | ||||||||||||||||||
979 | for (int i = 0; i < children.size(); ++i) { | - | ||||||||||||||||||
980 | obj = children.at(i); | - | ||||||||||||||||||
981 | if (mo.cast(obj)) { | - | ||||||||||||||||||
982 | QRegularExpressionMatch m = re.match(obj->objectName()); | - | ||||||||||||||||||
983 | if (m.hasMatch()) | - | ||||||||||||||||||
984 | list->append(obj); | - | ||||||||||||||||||
985 | } | - | ||||||||||||||||||
986 | if (options & Qt::FindChildrenRecursively) | - | ||||||||||||||||||
987 | qt_qFindChildren_helper(obj, re, mo, list, options); | - | ||||||||||||||||||
988 | } | - | ||||||||||||||||||
989 | } | - | ||||||||||||||||||
990 | - | |||||||||||||||||||
991 | - | |||||||||||||||||||
992 | - | |||||||||||||||||||
993 | - | |||||||||||||||||||
994 | - | |||||||||||||||||||
995 | QObject *qt_qFindChild_helper(const QObject *parent, const QString &name, const QMetaObject &mo, Qt::FindChildOptions options) | - | ||||||||||||||||||
996 | { | - | ||||||||||||||||||
997 | if (!parent) | - | ||||||||||||||||||
998 | return 0; | - | ||||||||||||||||||
999 | const QObjectList &children = parent->children(); | - | ||||||||||||||||||
1000 | QObject *obj; | - | ||||||||||||||||||
1001 | int i; | - | ||||||||||||||||||
1002 | for (i = 0; i < children.size(); ++i) { | - | ||||||||||||||||||
1003 | obj = children.at(i); | - | ||||||||||||||||||
1004 | if (mo.cast(obj) && (name.isNull() || obj->objectName() == name)) | - | ||||||||||||||||||
1005 | return obj; | - | ||||||||||||||||||
1006 | } | - | ||||||||||||||||||
1007 | if (options & Qt::FindChildrenRecursively) { | - | ||||||||||||||||||
1008 | for (i = 0; i < children.size(); ++i) { | - | ||||||||||||||||||
1009 | obj = qt_qFindChild_helper(children.at(i), name, mo, options); | - | ||||||||||||||||||
1010 | if (obj) | - | ||||||||||||||||||
1011 | return obj; | - | ||||||||||||||||||
1012 | } | - | ||||||||||||||||||
1013 | } | - | ||||||||||||||||||
1014 | return 0; | - | ||||||||||||||||||
1015 | } | - | ||||||||||||||||||
1016 | - | |||||||||||||||||||
1017 | - | |||||||||||||||||||
1018 | - | |||||||||||||||||||
1019 | - | |||||||||||||||||||
1020 | - | |||||||||||||||||||
1021 | - | |||||||||||||||||||
1022 | void QObject::setParent(QObject *parent) | - | ||||||||||||||||||
1023 | { | - | ||||||||||||||||||
1024 | QObjectPrivate * const d = d_func(); | - | ||||||||||||||||||
1025 | ((!(!d->isWidget)) ? qt_assert("!d->isWidget",__FILE__,19491956) : qt_noop()); | - | ||||||||||||||||||
1026 | d->setParent_helper(parent); | - | ||||||||||||||||||
1027 | } | - | ||||||||||||||||||
1028 | - | |||||||||||||||||||
1029 | void QObjectPrivate::deleteChildren() | - | ||||||||||||||||||
1030 | { | - | ||||||||||||||||||
1031 | ((!(!isDeletingChildren)) ? qt_assert_x("QObjectPrivate::deleteChildren()", "isDeletingChildren already set, did this function recurse?",__FILE__,19551962) : qt_noop()); | - | ||||||||||||||||||
1032 | isDeletingChildren = true; | - | ||||||||||||||||||
1033 | - | |||||||||||||||||||
1034 | - | |||||||||||||||||||
1035 | - | |||||||||||||||||||
1036 | for (int i = 0; i < children.count(); ++i) { | - | ||||||||||||||||||
1037 | currentChildBeingDeleted = children.at(i); | - | ||||||||||||||||||
1038 | children[i] = 0; | - | ||||||||||||||||||
1039 | delete currentChildBeingDeleted; | - | ||||||||||||||||||
1040 | } | - | ||||||||||||||||||
1041 | children.clear(); | - | ||||||||||||||||||
1042 | currentChildBeingDeleted = 0; | - | ||||||||||||||||||
1043 | isDeletingChildren = false; | - | ||||||||||||||||||
1044 | } | - | ||||||||||||||||||
1045 | - | |||||||||||||||||||
1046 | void QObjectPrivate::setParent_helper(QObject *o) | - | ||||||||||||||||||
1047 | { | - | ||||||||||||||||||
1048 | QObject * const q = q_func(); | - | ||||||||||||||||||
1049 | if (o == parent) | - | ||||||||||||||||||
1050 | return; | - | ||||||||||||||||||
1051 | if (parent) { | - | ||||||||||||||||||
1052 | QObjectPrivate *parentD = parent->d_func(); | - | ||||||||||||||||||
1053 | if (parentD->isDeletingChildren && wasDeleted | - | ||||||||||||||||||
1054 | && parentD->currentChildBeingDeleted == q) { | - | ||||||||||||||||||
1055 | - | |||||||||||||||||||
1056 | - | |||||||||||||||||||
1057 | } else { | - | ||||||||||||||||||
1058 | const int index = parentD->children.indexOf(q); | - | ||||||||||||||||||
1059 | if (parentD->isDeletingChildren) { | - | ||||||||||||||||||
1060 | parentD->children[index] = 0; | - | ||||||||||||||||||
1061 | } else { | - | ||||||||||||||||||
1062 | parentD->children.removeAt(index); | - | ||||||||||||||||||
1063 | if (sendChildEvents && parentD->receiveChildEvents) { | - | ||||||||||||||||||
1064 | QChildEvent e(QEvent::ChildRemoved, q); | - | ||||||||||||||||||
1065 | QCoreApplication::sendEvent(parent, &e); | - | ||||||||||||||||||
1066 | } | - | ||||||||||||||||||
1067 | } | - | ||||||||||||||||||
1068 | } | - | ||||||||||||||||||
1069 | } | - | ||||||||||||||||||
1070 | parent = o; | - | ||||||||||||||||||
1071 | if (parent) { | - | ||||||||||||||||||
1072 | - | |||||||||||||||||||
1073 | if (threadData != parent->d_func()->threadData) { | - | ||||||||||||||||||
1074 | QMessageLogger(__FILE__, 19982005, __PRETTY_FUNCTION__).warning("QObject::setParent: Cannot set parent, new parent is in a different thread"); | - | ||||||||||||||||||
1075 | parent = 0; | - | ||||||||||||||||||
1076 | return; | - | ||||||||||||||||||
1077 | } | - | ||||||||||||||||||
1078 | parent->d_func()->children.append(q); | - | ||||||||||||||||||
1079 | if(sendChildEvents && parent->d_func()->receiveChildEvents) { | - | ||||||||||||||||||
1080 | if (!isWidget) { | - | ||||||||||||||||||
1081 | QChildEvent e(QEvent::ChildAdded, q); | - | ||||||||||||||||||
1082 | QCoreApplication::sendEvent(parent, &e); | - | ||||||||||||||||||
1083 | } | - | ||||||||||||||||||
1084 | } | - | ||||||||||||||||||
1085 | } | - | ||||||||||||||||||
1086 | if (!wasDeleted && !isDeletingChildren && declarativeData && QAbstractDeclarativeData::parentChanged) | - | ||||||||||||||||||
1087 | QAbstractDeclarativeData::parentChanged(declarativeData, q, o); | - | ||||||||||||||||||
1088 | } | - | ||||||||||||||||||
1089 | void QObject::installEventFilter(QObject *obj) | - | ||||||||||||||||||
1090 | { | - | ||||||||||||||||||
1091 | QObjectPrivate * const d = d_func(); | - | ||||||||||||||||||
1092 | if (!obj) | - | ||||||||||||||||||
1093 | return; | - | ||||||||||||||||||
1094 | if (d->threadData != obj->d_func()->threadData) { | - | ||||||||||||||||||
1095 | QMessageLogger(__FILE__, 20622069, __PRETTY_FUNCTION__).warning("QObject::installEventFilter(): Cannot filter events for objects in a different thread."); | - | ||||||||||||||||||
1096 | return; | - | ||||||||||||||||||
1097 | } | - | ||||||||||||||||||
1098 | - | |||||||||||||||||||
1099 | if (!d->extraData) | - | ||||||||||||||||||
1100 | d->extraData = new QObjectPrivate::ExtraData; | - | ||||||||||||||||||
1101 | - | |||||||||||||||||||
1102 | - | |||||||||||||||||||
1103 | d->extraData->eventFilters.removeAll((QObject*)0); | - | ||||||||||||||||||
1104 | d->extraData->eventFilters.removeAll(obj); | - | ||||||||||||||||||
1105 | d->extraData->eventFilters.prepend(obj); | - | ||||||||||||||||||
1106 | } | - | ||||||||||||||||||
1107 | void QObject::removeEventFilter(QObject *obj) | - | ||||||||||||||||||
1108 | { | - | ||||||||||||||||||
1109 | QObjectPrivate * const d = d_func(); | - | ||||||||||||||||||
1110 | if (d->extraData) { | - | ||||||||||||||||||
1111 | for (int i = 0; i < d->extraData->eventFilters.count(); ++i) { | - | ||||||||||||||||||
1112 | if (d->extraData->eventFilters.at(i) == obj) | - | ||||||||||||||||||
1113 | d->extraData->eventFilters[i] = 0; | - | ||||||||||||||||||
1114 | } | - | ||||||||||||||||||
1115 | } | - | ||||||||||||||||||
1116 | } | - | ||||||||||||||||||
1117 | void QObject::deleteLater() | - | ||||||||||||||||||
1118 | { | - | ||||||||||||||||||
1119 | QCoreApplication::postEvent(this, new QDeferredDeleteEvent()); | - | ||||||||||||||||||
1120 | } | - | ||||||||||||||||||
1121 | const char *qFlagLocation(const char *method) | - | ||||||||||||||||||
1122 | { | - | ||||||||||||||||||
1123 | QThreadData *currentThreadData = QThreadData::current(false); | - | ||||||||||||||||||
1124 | if (currentThreadData != 0) | - | ||||||||||||||||||
1125 | currentThreadData->flaggedSignatures.store(method); | - | ||||||||||||||||||
1126 | return method; | - | ||||||||||||||||||
1127 | } | - | ||||||||||||||||||
1128 | - | |||||||||||||||||||
1129 | static int extract_code(const char *member) | - | ||||||||||||||||||
1130 | { | - | ||||||||||||||||||
1131 | - | |||||||||||||||||||
1132 | return (((int)(*member) - '0') & 0x3); | - | ||||||||||||||||||
1133 | } | - | ||||||||||||||||||
1134 | - | |||||||||||||||||||
1135 | static const char * extract_location(const char *member) | - | ||||||||||||||||||
1136 | { | - | ||||||||||||||||||
1137 | if (QThreadData::current()->flaggedSignatures.contains(member)) { | - | ||||||||||||||||||
1138 | - | |||||||||||||||||||
1139 | const char *location = member + qstrlen(member) + 1; | - | ||||||||||||||||||
1140 | if (*location != '\0') | - | ||||||||||||||||||
1141 | return location; | - | ||||||||||||||||||
1142 | } | - | ||||||||||||||||||
1143 | return 0; | - | ||||||||||||||||||
1144 | } | - | ||||||||||||||||||
1145 | - | |||||||||||||||||||
1146 | static bool check_signal_macro(const QObject *sender, const char *signal, | - | ||||||||||||||||||
1147 | const char *func, const char *op) | - | ||||||||||||||||||
1148 | { | - | ||||||||||||||||||
1149 | int sigcode = extract_code(signal); | - | ||||||||||||||||||
1150 | if (sigcode != 2) { | - | ||||||||||||||||||
1151 | if (sigcode == 1) | - | ||||||||||||||||||
1152 | QMessageLogger(__FILE__, 22402247, __PRETTY_FUNCTION__).warning("QObject::%s: Attempt to %s non-signal %s::%s", | - | ||||||||||||||||||
1153 | func, op, sender->metaObject()->className(), signal+1); | - | ||||||||||||||||||
1154 | else | - | ||||||||||||||||||
1155 | QMessageLogger(__FILE__, 22432250, __PRETTY_FUNCTION__).warning("QObject::%s: Use the SIGNAL macro to %s %s::%s", | - | ||||||||||||||||||
1156 | func, op, sender->metaObject()->className(), signal); | - | ||||||||||||||||||
1157 | return false; | - | ||||||||||||||||||
1158 | } | - | ||||||||||||||||||
1159 | return true; | - | ||||||||||||||||||
1160 | } | - | ||||||||||||||||||
1161 | - | |||||||||||||||||||
1162 | static bool check_method_code(int code, const QObject *object, | - | ||||||||||||||||||
1163 | const char *method, const char *func) | - | ||||||||||||||||||
1164 | { | - | ||||||||||||||||||
1165 | if (code != 1 && code != 2) { | - | ||||||||||||||||||
1166 | QMessageLogger(__FILE__, 22542261, __PRETTY_FUNCTION__).warning("QObject::%s: Use the SLOT or SIGNAL macro to " | - | ||||||||||||||||||
1167 | "%s %s::%s", func, func, object->metaObject()->className(), method); | - | ||||||||||||||||||
1168 | return false; | - | ||||||||||||||||||
1169 | } | - | ||||||||||||||||||
1170 | return true; | - | ||||||||||||||||||
1171 | } | - | ||||||||||||||||||
1172 | - | |||||||||||||||||||
1173 | static void err_method_notfound(const QObject *object, | - | ||||||||||||||||||
1174 | const char *method, const char *func) | - | ||||||||||||||||||
1175 | { | - | ||||||||||||||||||
1176 | const char *type = "method"; | - | ||||||||||||||||||
1177 | switch (extract_code(method)) { | - | ||||||||||||||||||
1178 | case 1: type = "slot"; break; | - | ||||||||||||||||||
1179 | case 2: type = "signal"; break; | - | ||||||||||||||||||
1180 | } | - | ||||||||||||||||||
1181 | const char *loc = extract_location(method); | - | ||||||||||||||||||
1182 | if (strchr(method,')') == 0) | - | ||||||||||||||||||
1183 | QMessageLogger(__FILE__, 22712278, __PRETTY_FUNCTION__).warning("QObject::%s: Parentheses expected, %s %s::%s%s%s", | - | ||||||||||||||||||
1184 | func, type, object->metaObject()->className(), method+1, | - | ||||||||||||||||||
1185 | loc ? " in ": "", loc ? loc : ""); | - | ||||||||||||||||||
1186 | else | - | ||||||||||||||||||
1187 | QMessageLogger(__FILE__, 22752282, __PRETTY_FUNCTION__).warning("QObject::%s: No such %s %s::%s%s%s", | - | ||||||||||||||||||
1188 | func, type, object->metaObject()->className(), method+1, | - | ||||||||||||||||||
1189 | loc ? " in ": "", loc ? loc : ""); | - | ||||||||||||||||||
1190 | - | |||||||||||||||||||
1191 | } | - | ||||||||||||||||||
1192 | - | |||||||||||||||||||
1193 | - | |||||||||||||||||||
1194 | static void err_info_about_objects(const char * func, | - | ||||||||||||||||||
1195 | const QObject * sender, | - | ||||||||||||||||||
1196 | const QObject * receiver) | - | ||||||||||||||||||
1197 | { | - | ||||||||||||||||||
1198 | QString a = sender ? sender->objectName() : QString(); | - | ||||||||||||||||||
1199 | QString b = receiver ? receiver->objectName() : QString(); | - | ||||||||||||||||||
1200 | if (!a.isEmpty()) | - | ||||||||||||||||||
1201 | QMessageLogger(__FILE__, 22892296, __PRETTY_FUNCTION__).warning("QObject::%s: (sender name: '%s')", func, a.toLocal8Bit().data()); | - | ||||||||||||||||||
1202 | if (!b.isEmpty()) | - | ||||||||||||||||||
1203 | QMessageLogger(__FILE__, 22912298, __PRETTY_FUNCTION__).warning("QObject::%s: (receiver name: '%s')", func, b.toLocal8Bit().data()); | - | ||||||||||||||||||
1204 | } | - | ||||||||||||||||||
1205 | QObject *QObject::sender() const | - | ||||||||||||||||||
1206 | { | - | ||||||||||||||||||
1207 | const QObjectPrivate * const d = d_func(); | - | ||||||||||||||||||
1208 | - | |||||||||||||||||||
1209 | QMutexLocker locker(signalSlotLock(this)); | - | ||||||||||||||||||
1210 | if (!d->currentSender) | - | ||||||||||||||||||
1211 | return 0; | - | ||||||||||||||||||
1212 | - | |||||||||||||||||||
1213 | for (QObjectPrivate::Connection *c = d->senders; c; c = c->next) { | - | ||||||||||||||||||
1214 | if (c->sender == d->currentSender->sender) | - | ||||||||||||||||||
1215 | return d->currentSender->sender; | - | ||||||||||||||||||
1216 | } | - | ||||||||||||||||||
1217 | - | |||||||||||||||||||
1218 | return 0; | - | ||||||||||||||||||
1219 | } | - | ||||||||||||||||||
1220 | int QObject::senderSignalIndex() const | - | ||||||||||||||||||
1221 | { | - | ||||||||||||||||||
1222 | const QObjectPrivate * const d = d_func(); | - | ||||||||||||||||||
1223 | - | |||||||||||||||||||
1224 | QMutexLocker locker(signalSlotLock(this)); | - | ||||||||||||||||||
1225 | if (!d->currentSender) | - | ||||||||||||||||||
1226 | return -1; | - | ||||||||||||||||||
1227 | - | |||||||||||||||||||
1228 | for (QObjectPrivate::Connection *c = d->senders; c; c = c->next) { | - | ||||||||||||||||||
1229 | if (c->sender == d->currentSender->sender) { | - | ||||||||||||||||||
1230 | - | |||||||||||||||||||
1231 | return QMetaObjectPrivate::signal(c->sender->metaObject(), d->currentSender->signal).methodIndex(); | - | ||||||||||||||||||
1232 | } | - | ||||||||||||||||||
1233 | } | - | ||||||||||||||||||
1234 | - | |||||||||||||||||||
1235 | return -1; | - | ||||||||||||||||||
1236 | } | - | ||||||||||||||||||
1237 | int QObject::receivers(const char *signal) const | - | ||||||||||||||||||
1238 | { | - | ||||||||||||||||||
1239 | const QObjectPrivate * const d = d_func(); | - | ||||||||||||||||||
1240 | int receivers = 0; | - | ||||||||||||||||||
1241 | if (signal) { | - | ||||||||||||||||||
1242 | QByteArray signal_name = QMetaObject::normalizedSignature(signal); | - | ||||||||||||||||||
1243 | signal = signal_name; | - | ||||||||||||||||||
1244 | - | |||||||||||||||||||
1245 | if (!check_signal_macro(this, signal, "receivers", "bind")) | - | ||||||||||||||||||
1246 | return 0; | - | ||||||||||||||||||
1247 | - | |||||||||||||||||||
1248 | signal++; | - | ||||||||||||||||||
1249 | int signal_index = d->signalIndex(signal); | - | ||||||||||||||||||
1250 | if (signal_index < 0) { | - | ||||||||||||||||||
1251 | - | |||||||||||||||||||
1252 | err_method_notfound(this, signal-1, "receivers"); | - | ||||||||||||||||||
1253 | - | |||||||||||||||||||
1254 | return 0; | - | ||||||||||||||||||
1255 | } | - | ||||||||||||||||||
1256 | - | |||||||||||||||||||
1257 | if (!d->isSignalConnected(signal_index)) | - | ||||||||||||||||||
1258 | return receivers; | - | ||||||||||||||||||
1259 | - | |||||||||||||||||||
1260 | if (d->declarativeData && QAbstractDeclarativeData::receivers) { | - | ||||||||||||||||||
1261 | receivers += QAbstractDeclarativeData::receivers(d->declarativeData, this, | - | ||||||||||||||||||
1262 | signal_index); | - | ||||||||||||||||||
1263 | } | - | ||||||||||||||||||
1264 | - | |||||||||||||||||||
1265 | QMutexLocker locker(signalSlotLock(this)); | - | ||||||||||||||||||
1266 | if (d->connectionLists) { | - | ||||||||||||||||||
1267 | if (signal_index < d->connectionLists->count()) { | - | ||||||||||||||||||
1268 | const QObjectPrivate::Connection *c = | - | ||||||||||||||||||
1269 | d->connectionLists->at(signal_index).first; | - | ||||||||||||||||||
1270 | while (c) { | - | ||||||||||||||||||
1271 | receivers += c->receiver ? 1 : 0; | - | ||||||||||||||||||
1272 | c = c->nextConnectionList; | - | ||||||||||||||||||
1273 | } | - | ||||||||||||||||||
1274 | } | - | ||||||||||||||||||
1275 | } | - | ||||||||||||||||||
1276 | } | - | ||||||||||||||||||
1277 | return receivers; | - | ||||||||||||||||||
1278 | } | - | ||||||||||||||||||
1279 | bool QObject::isSignalConnected(const QMetaMethod &signal) const | - | ||||||||||||||||||
1280 | { | - | ||||||||||||||||||
1281 | const QObjectPrivate * const d = d_func(); | - | ||||||||||||||||||
1282 | if (!signal.mobj) | - | ||||||||||||||||||
1283 | return false; | - | ||||||||||||||||||
1284 | - | |||||||||||||||||||
1285 | ((!(signal.mobj->cast(this) && signal.methodType() == QMetaMethod::Signal)) ? qt_assert_x("QObject::isSignalConnected", "the parameter must be a signal member of the object", | - | ||||||||||||||||||
1286 | __FILE__ | - | ||||||||||||||||||
1287 | , | - | ||||||||||||||||||
1288 | 24642471 | - | ||||||||||||||||||
1289 | ) : qt_noop()) | - | ||||||||||||||||||
1290 | ; | - | ||||||||||||||||||
1291 | uint signalIndex = (signal.handle - QMetaObjectPrivate::get(signal.mobj)->methodData)/5; | - | ||||||||||||||||||
1292 | - | |||||||||||||||||||
1293 | if (signal.mobj->d.data[signal.handle + 4] & MethodCloned) | - | ||||||||||||||||||
1294 | signalIndex = QMetaObjectPrivate::originalClone(signal.mobj, signalIndex); | - | ||||||||||||||||||
1295 | - | |||||||||||||||||||
1296 | signalIndex += QMetaObjectPrivate::signalOffset(signal.mobj); | - | ||||||||||||||||||
1297 | - | |||||||||||||||||||
1298 | if (signalIndex < sizeof(d->connectedSignals) * 8) | - | ||||||||||||||||||
1299 | return d->isSignalConnected(signalIndex); | - | ||||||||||||||||||
1300 | - | |||||||||||||||||||
1301 | QMutexLocker locker(signalSlotLock(this)); | - | ||||||||||||||||||
1302 | if (d->connectionLists) { | - | ||||||||||||||||||
1303 | if (signalIndex < uint(d->connectionLists->count())) { | - | ||||||||||||||||||
1304 | const QObjectPrivate::Connection *c = | - | ||||||||||||||||||
1305 | d->connectionLists->at(signalIndex).first; | - | ||||||||||||||||||
1306 | while (c) { | - | ||||||||||||||||||
1307 | if (c->receiver) | - | ||||||||||||||||||
1308 | return true; | - | ||||||||||||||||||
1309 | c = c->nextConnectionList; | - | ||||||||||||||||||
1310 | } | - | ||||||||||||||||||
1311 | } | - | ||||||||||||||||||
1312 | } | - | ||||||||||||||||||
1313 | return false; | - | ||||||||||||||||||
1314 | } | - | ||||||||||||||||||
1315 | void QMetaObjectPrivate::memberIndexes(const QObject *obj, | - | ||||||||||||||||||
1316 | const QMetaMethod &member, | - | ||||||||||||||||||
1317 | int *signalIndex, int *methodIndex) | - | ||||||||||||||||||
1318 | { | - | ||||||||||||||||||
1319 | *signalIndex = -1; | - | ||||||||||||||||||
1320 | *methodIndex = -1; | - | ||||||||||||||||||
1321 | if (!obj || !member.mobj) | - | ||||||||||||||||||
1322 | return; | - | ||||||||||||||||||
1323 | const QMetaObject *m = obj->metaObject(); | - | ||||||||||||||||||
1324 | - | |||||||||||||||||||
1325 | while (m != 0 && m != member.mobj) | - | ||||||||||||||||||
1326 | m = m->d.superdata; | - | ||||||||||||||||||
1327 | if (!m) | - | ||||||||||||||||||
1328 | return; | - | ||||||||||||||||||
1329 | *signalIndex = *methodIndex = (member.handle - get(member.mobj)->methodData)/5; | - | ||||||||||||||||||
1330 | - | |||||||||||||||||||
1331 | int signalOffset; | - | ||||||||||||||||||
1332 | int methodOffset; | - | ||||||||||||||||||
1333 | computeOffsets(m, &signalOffset, &methodOffset); | - | ||||||||||||||||||
1334 | - | |||||||||||||||||||
1335 | *methodIndex += methodOffset; | - | ||||||||||||||||||
1336 | if (member.methodType() == QMetaMethod::Signal) { | - | ||||||||||||||||||
1337 | *signalIndex = originalClone(m, *signalIndex); | - | ||||||||||||||||||
1338 | *signalIndex += signalOffset; | - | ||||||||||||||||||
1339 | } else { | - | ||||||||||||||||||
1340 | *signalIndex = -1; | - | ||||||||||||||||||
1341 | } | - | ||||||||||||||||||
1342 | } | - | ||||||||||||||||||
1343 | - | |||||||||||||||||||
1344 | - | |||||||||||||||||||
1345 | static inline void check_and_warn_compat(const QMetaObject *sender, const QMetaMethod &signal, | - | ||||||||||||||||||
1346 | const QMetaObject *receiver, const QMetaMethod &method) | - | ||||||||||||||||||
1347 | { | - | ||||||||||||||||||
1348 | if (signal.attributes() & QMetaMethod::Compatibility) { | - | ||||||||||||||||||
1349 | if (!(method.attributes() & QMetaMethod::Compatibility)) | - | ||||||||||||||||||
1350 | QMessageLogger(__FILE__, 25482555, __PRETTY_FUNCTION__).warning("QObject::connect: Connecting from COMPAT signal (%s::%s)", | - | ||||||||||||||||||
1351 | sender->className(), signal.methodSignature().constData()); | - | ||||||||||||||||||
1352 | } else if ((method.attributes() & QMetaMethod::Compatibility) && | - | ||||||||||||||||||
1353 | method.methodType() == QMetaMethod::Signal) { | - | ||||||||||||||||||
1354 | QMessageLogger(__FILE__, 25522559, __PRETTY_FUNCTION__).warning("QObject::connect: Connecting from %s::%s to COMPAT slot (%s::%s)", | - | ||||||||||||||||||
1355 | sender->className(), signal.methodSignature().constData(), | - | ||||||||||||||||||
1356 | receiver->className(), method.methodSignature().constData()); | - | ||||||||||||||||||
1357 | } | - | ||||||||||||||||||
1358 | } | - | ||||||||||||||||||
1359 | QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal, | - | ||||||||||||||||||
1360 | const QObject *receiver, const char *method, | - | ||||||||||||||||||
1361 | Qt::ConnectionType type) | - | ||||||||||||||||||
1362 | { | - | ||||||||||||||||||
1363 | if (sender == 0 || receiver == 0 || signal == 0 || method == 0) { | - | ||||||||||||||||||
1364 | QMessageLogger(__FILE__, 26312638, __PRETTY_FUNCTION__).warning("QObject::connect: Cannot connect %s::%s to %s::%s", | - | ||||||||||||||||||
1365 | sender ? sender->metaObject()->className() : "(null)", | - | ||||||||||||||||||
1366 | (signal && *signal) ? signal+1 : "(null)", | - | ||||||||||||||||||
1367 | receiver ? receiver->metaObject()->className() : "(null)", | - | ||||||||||||||||||
1368 | (method && *method) ? method+1 : "(null)"); | - | ||||||||||||||||||
1369 | return QMetaObject::Connection(0); | - | ||||||||||||||||||
1370 | } | - | ||||||||||||||||||
1371 | QByteArray tmp_signal_name; | - | ||||||||||||||||||
1372 | - | |||||||||||||||||||
1373 | if (!check_signal_macro(sender, signal, "connect", "bind")) | - | ||||||||||||||||||
1374 | return QMetaObject::Connection(0); | - | ||||||||||||||||||
1375 | const QMetaObject *smeta = sender->metaObject(); | - | ||||||||||||||||||
1376 | const char *signal_arg = signal; | - | ||||||||||||||||||
1377 | ++signal; | - | ||||||||||||||||||
1378 | QArgumentTypeArray signalTypes; | - | ||||||||||||||||||
1379 | ((!(QMetaObjectPrivate::get(smeta)->revision >= 7)) ? qt_assert("QMetaObjectPrivate::get(smeta)->revision >= 7",__FILE__,26462653) : qt_noop()); | - | ||||||||||||||||||
1380 | QByteArray signalName = QMetaObjectPrivate::decodeMethodSignature(signal, signalTypes); | - | ||||||||||||||||||
1381 | int signal_index = QMetaObjectPrivate::indexOfSignalRelative( | - | ||||||||||||||||||
1382 | &smeta, signalName, signalTypes.size(), signalTypes.constData()); | - | ||||||||||||||||||
1383 | if (signal_index < 0) { | - | ||||||||||||||||||
1384 | - | |||||||||||||||||||
1385 | tmp_signal_name = QMetaObject::normalizedSignature(signal - 1); | - | ||||||||||||||||||
1386 | signal = tmp_signal_name.constData() + 1; | - | ||||||||||||||||||
1387 | - | |||||||||||||||||||
1388 | signalTypes.clear(); | - | ||||||||||||||||||
1389 | signalName = QMetaObjectPrivate::decodeMethodSignature(signal, signalTypes); | - | ||||||||||||||||||
1390 | smeta = sender->metaObject(); | - | ||||||||||||||||||
1391 | signal_index = QMetaObjectPrivate::indexOfSignalRelative( | - | ||||||||||||||||||
1392 | &smeta, signalName, signalTypes.size(), signalTypes.constData()); | - | ||||||||||||||||||
1393 | } | - | ||||||||||||||||||
1394 | if (signal_index < 0) { | - | ||||||||||||||||||
1395 | err_method_notfound(sender, signal_arg, "connect"); | - | ||||||||||||||||||
1396 | err_info_about_objects("connect", sender, receiver); | - | ||||||||||||||||||
1397 | return QMetaObject::Connection(0); | - | ||||||||||||||||||
1398 | } | - | ||||||||||||||||||
1399 | signal_index = QMetaObjectPrivate::originalClone(smeta, signal_index); | - | ||||||||||||||||||
1400 | signal_index += QMetaObjectPrivate::signalOffset(smeta); | - | ||||||||||||||||||
1401 | - | |||||||||||||||||||
1402 | QByteArray tmp_method_name; | - | ||||||||||||||||||
1403 | int membcode = extract_code(method); | - | ||||||||||||||||||
1404 | - | |||||||||||||||||||
1405 | if (!check_method_code(membcode, receiver, method, "connect")) | - | ||||||||||||||||||
1406 | return QMetaObject::Connection(0); | - | ||||||||||||||||||
1407 | const char *method_arg = method; | - | ||||||||||||||||||
1408 | ++method; | - | ||||||||||||||||||
1409 | - | |||||||||||||||||||
1410 | QArgumentTypeArray methodTypes; | - | ||||||||||||||||||
1411 | QByteArray methodName = QMetaObjectPrivate::decodeMethodSignature(method, methodTypes); | - | ||||||||||||||||||
1412 | const QMetaObject *rmeta = receiver->metaObject(); | - | ||||||||||||||||||
1413 | int method_index_relative = -1; | - | ||||||||||||||||||
1414 | ((!(QMetaObjectPrivate::get(rmeta)->revision >= 7)) ? qt_assert("QMetaObjectPrivate::get(rmeta)->revision >= 7",__FILE__,26812688) : qt_noop()); | - | ||||||||||||||||||
1415 | switch (membcode) { | - | ||||||||||||||||||
1416 | case 1: | - | ||||||||||||||||||
1417 | method_index_relative = QMetaObjectPrivate::indexOfSlotRelative( | - | ||||||||||||||||||
1418 | &rmeta, methodName, methodTypes.size(), methodTypes.constData()); | - | ||||||||||||||||||
1419 | break; | - | ||||||||||||||||||
1420 | case 2: | - | ||||||||||||||||||
1421 | method_index_relative = QMetaObjectPrivate::indexOfSignalRelative( | - | ||||||||||||||||||
1422 | &rmeta, methodName, methodTypes.size(), methodTypes.constData()); | - | ||||||||||||||||||
1423 | break; | - | ||||||||||||||||||
1424 | } | - | ||||||||||||||||||
1425 | if (method_index_relative < 0) { | - | ||||||||||||||||||
1426 | - | |||||||||||||||||||
1427 | tmp_method_name = QMetaObject::normalizedSignature(method); | - | ||||||||||||||||||
1428 | method = tmp_method_name.constData(); | - | ||||||||||||||||||
1429 | - | |||||||||||||||||||
1430 | methodTypes.clear(); | - | ||||||||||||||||||
1431 | methodName = QMetaObjectPrivate::decodeMethodSignature(method, methodTypes); | - | ||||||||||||||||||
1432 | - | |||||||||||||||||||
1433 | rmeta = receiver->metaObject(); | - | ||||||||||||||||||
1434 | switch (membcode) { | - | ||||||||||||||||||
1435 | case 1: | - | ||||||||||||||||||
1436 | method_index_relative = QMetaObjectPrivate::indexOfSlotRelative( | - | ||||||||||||||||||
1437 | &rmeta, methodName, methodTypes.size(), methodTypes.constData()); | - | ||||||||||||||||||
1438 | break; | - | ||||||||||||||||||
1439 | case 2: | - | ||||||||||||||||||
1440 | method_index_relative = QMetaObjectPrivate::indexOfSignalRelative( | - | ||||||||||||||||||
1441 | &rmeta, methodName, methodTypes.size(), methodTypes.constData()); | - | ||||||||||||||||||
1442 | break; | - | ||||||||||||||||||
1443 | } | - | ||||||||||||||||||
1444 | } | - | ||||||||||||||||||
1445 | - | |||||||||||||||||||
1446 | if (method_index_relative < 0) { | - | ||||||||||||||||||
1447 | err_method_notfound(receiver, method_arg, "connect"); | - | ||||||||||||||||||
1448 | err_info_about_objects("connect", sender, receiver); | - | ||||||||||||||||||
1449 | return QMetaObject::Connection(0); | - | ||||||||||||||||||
1450 | } | - | ||||||||||||||||||
1451 | - | |||||||||||||||||||
1452 | if (!QMetaObjectPrivate::checkConnectArgs(signalTypes.size(), signalTypes.constData(), | - | ||||||||||||||||||
1453 | methodTypes.size(), methodTypes.constData())) { | - | ||||||||||||||||||
1454 | QMessageLogger(__FILE__, 27212728, __PRETTY_FUNCTION__).warning("QObject::connect: Incompatible sender/receiver arguments" | - | ||||||||||||||||||
1455 | "\n %s::%s --> %s::%s", | - | ||||||||||||||||||
1456 | sender->metaObject()->className(), signal, | - | ||||||||||||||||||
1457 | receiver->metaObject()->className(), method); | - | ||||||||||||||||||
1458 | return QMetaObject::Connection(0); | - | ||||||||||||||||||
1459 | } | - | ||||||||||||||||||
1460 | - | |||||||||||||||||||
1461 | int *types = 0; | - | ||||||||||||||||||
1462 | if ((type == Qt::QueuedConnection) | - | ||||||||||||||||||
1463 | && !(types = queuedConnectionTypes(signalTypes.constData(), signalTypes.size()))) { | - | ||||||||||||||||||
1464 | return QMetaObject::Connection(0); | - | ||||||||||||||||||
1465 | } | - | ||||||||||||||||||
1466 | - | |||||||||||||||||||
1467 | - | |||||||||||||||||||
1468 | QMetaMethod smethod = QMetaObjectPrivate::signal(smeta, signal_index); | - | ||||||||||||||||||
1469 | QMetaMethod rmethod = rmeta->method(method_index_relative + rmeta->methodOffset()); | - | ||||||||||||||||||
1470 | check_and_warn_compat(smeta, smethod, rmeta, rmethod); | - | ||||||||||||||||||
1471 | - | |||||||||||||||||||
1472 | QMetaObject::Connection handle = QMetaObject::Connection(QMetaObjectPrivate::connect( | - | ||||||||||||||||||
1473 | sender, signal_index, smeta, receiver, method_index_relative, rmeta ,type, types)); | - | ||||||||||||||||||
1474 | return handle; | - | ||||||||||||||||||
1475 | } | - | ||||||||||||||||||
1476 | QMetaObject::Connection QObject::connect(const QObject *sender, const QMetaMethod &signal, | - | ||||||||||||||||||
1477 | const QObject *receiver, const QMetaMethod &method, | - | ||||||||||||||||||
1478 | Qt::ConnectionType type) | - | ||||||||||||||||||
1479 | { | - | ||||||||||||||||||
1480 | if (sender == 0 | - | ||||||||||||||||||
1481 | || receiver == 0 | - | ||||||||||||||||||
1482 | || signal.methodType() != QMetaMethod::Signal | - | ||||||||||||||||||
1483 | || method.methodType() == QMetaMethod::Constructor) { | - | ||||||||||||||||||
1484 | QMessageLogger(__FILE__, 27722779, __PRETTY_FUNCTION__).warning("QObject::connect: Cannot connect %s::%s to %s::%s", | - | ||||||||||||||||||
1485 | sender ? sender->metaObject()->className() : "(null)", | - | ||||||||||||||||||
1486 | signal.methodSignature().constData(), | - | ||||||||||||||||||
1487 | receiver ? receiver->metaObject()->className() : "(null)", | - | ||||||||||||||||||
1488 | method.methodSignature().constData() ); | - | ||||||||||||||||||
1489 | return QMetaObject::Connection(0); | - | ||||||||||||||||||
1490 | } | - | ||||||||||||||||||
1491 | - | |||||||||||||||||||
1492 | int signal_index; | - | ||||||||||||||||||
1493 | int method_index; | - | ||||||||||||||||||
1494 | { | - | ||||||||||||||||||
1495 | int dummy; | - | ||||||||||||||||||
1496 | QMetaObjectPrivate::memberIndexes(sender, signal, &signal_index, &dummy); | - | ||||||||||||||||||
1497 | QMetaObjectPrivate::memberIndexes(receiver, method, &dummy, &method_index); | - | ||||||||||||||||||
1498 | } | - | ||||||||||||||||||
1499 | - | |||||||||||||||||||
1500 | const QMetaObject *smeta = sender->metaObject(); | - | ||||||||||||||||||
1501 | const QMetaObject *rmeta = receiver->metaObject(); | - | ||||||||||||||||||
1502 | if (signal_index == -1) { | - | ||||||||||||||||||
1503 | QMessageLogger(__FILE__, 27912798, __PRETTY_FUNCTION__).warning("QObject::connect: Can't find signal %s on instance of class %s", | - | ||||||||||||||||||
1504 | signal.methodSignature().constData(), smeta->className()); | - | ||||||||||||||||||
1505 | return QMetaObject::Connection(0); | - | ||||||||||||||||||
1506 | } | - | ||||||||||||||||||
1507 | if (method_index == -1) { | - | ||||||||||||||||||
1508 | QMessageLogger(__FILE__, 27962803, __PRETTY_FUNCTION__).warning("QObject::connect: Can't find method %s on instance of class %s", | - | ||||||||||||||||||
1509 | method.methodSignature().constData(), rmeta->className()); | - | ||||||||||||||||||
1510 | return QMetaObject::Connection(0); | - | ||||||||||||||||||
1511 | } | - | ||||||||||||||||||
1512 | - | |||||||||||||||||||
1513 | if (!QMetaObject::checkConnectArgs(signal.methodSignature().constData(), method.methodSignature().constData())) { | - | ||||||||||||||||||
1514 | QMessageLogger(__FILE__, 28022809, __PRETTY_FUNCTION__).warning("QObject::connect: Incompatible sender/receiver arguments" | - | ||||||||||||||||||
1515 | "\n %s::%s --> %s::%s", | - | ||||||||||||||||||
1516 | smeta->className(), signal.methodSignature().constData(), | - | ||||||||||||||||||
1517 | rmeta->className(), method.methodSignature().constData()); | - | ||||||||||||||||||
1518 | return QMetaObject::Connection(0); | - | ||||||||||||||||||
1519 | } | - | ||||||||||||||||||
1520 | - | |||||||||||||||||||
1521 | int *types = 0; | - | ||||||||||||||||||
1522 | if ((type == Qt::QueuedConnection) | - | ||||||||||||||||||
1523 | && !(types = queuedConnectionTypes(signal.parameterTypes()))) | - | ||||||||||||||||||
1524 | return QMetaObject::Connection(0); | - | ||||||||||||||||||
1525 | - | |||||||||||||||||||
1526 | - | |||||||||||||||||||
1527 | check_and_warn_compat(smeta, signal, rmeta, method); | - | ||||||||||||||||||
1528 | - | |||||||||||||||||||
1529 | QMetaObject::Connection handle = QMetaObject::Connection(QMetaObjectPrivate::connect( | - | ||||||||||||||||||
1530 | sender, signal_index, signal.enclosingMetaObject(), receiver, method_index, 0, type, types)); | - | ||||||||||||||||||
1531 | return handle; | - | ||||||||||||||||||
1532 | } | - | ||||||||||||||||||
1533 | bool QObject::disconnect(const QObject *sender, const char *signal, | - | ||||||||||||||||||
1534 | const QObject *receiver, const char *method) | - | ||||||||||||||||||
1535 | { | - | ||||||||||||||||||
1536 | if (sender == 0 || (receiver == 0 && method != 0)) { | - | ||||||||||||||||||
1537 | QMessageLogger(__FILE__, 29022909, __PRETTY_FUNCTION__).warning("QObject::disconnect: Unexpected null parameter"); | - | ||||||||||||||||||
1538 | return false; | - | ||||||||||||||||||
1539 | } | - | ||||||||||||||||||
1540 | - | |||||||||||||||||||
1541 | const char *signal_arg = signal; | - | ||||||||||||||||||
1542 | QByteArray signal_name; | - | ||||||||||||||||||
1543 | bool signal_found = false; | - | ||||||||||||||||||
1544 | if (signal) { | - | ||||||||||||||||||
1545 | try { | - | ||||||||||||||||||
1546 | signal_name = QMetaObject::normalizedSignature(signal); | - | ||||||||||||||||||
1547 | signal = signal_name.constData(); | - | ||||||||||||||||||
1548 | } catch (const std::bad_alloc &) { | - | ||||||||||||||||||
1549 | - | |||||||||||||||||||
1550 | if (sender->metaObject()->indexOfSignal(signal + 1) == -1) | - | ||||||||||||||||||
1551 | throw; | - | ||||||||||||||||||
1552 | } | - | ||||||||||||||||||
1553 | - | |||||||||||||||||||
1554 | if (!check_signal_macro(sender, signal, "disconnect", "unbind")) | - | ||||||||||||||||||
1555 | return false; | - | ||||||||||||||||||
1556 | signal++; | - | ||||||||||||||||||
1557 | } | - | ||||||||||||||||||
1558 | - | |||||||||||||||||||
1559 | QByteArray method_name; | - | ||||||||||||||||||
1560 | const char *method_arg = method; | - | ||||||||||||||||||
1561 | int membcode = -1; | - | ||||||||||||||||||
1562 | bool method_found = false; | - | ||||||||||||||||||
1563 | if (method) { | - | ||||||||||||||||||
1564 | try { | - | ||||||||||||||||||
1565 | method_name = QMetaObject::normalizedSignature(method); | - | ||||||||||||||||||
1566 | method = method_name.constData(); | - | ||||||||||||||||||
1567 | } catch (const std::bad_alloc &) { | - | ||||||||||||||||||
1568 | - | |||||||||||||||||||
1569 | if (receiver->metaObject()->indexOfMethod(method + 1) == -1) | - | ||||||||||||||||||
1570 | throw; | - | ||||||||||||||||||
1571 | } | - | ||||||||||||||||||
1572 | - | |||||||||||||||||||
1573 | membcode = extract_code(method); | - | ||||||||||||||||||
1574 | if (!check_method_code(membcode, receiver, method, "disconnect")) | - | ||||||||||||||||||
1575 | return false; | - | ||||||||||||||||||
1576 | method++; | - | ||||||||||||||||||
1577 | } | - | ||||||||||||||||||
1578 | - | |||||||||||||||||||
1579 | - | |||||||||||||||||||
1580 | - | |||||||||||||||||||
1581 | - | |||||||||||||||||||
1582 | - | |||||||||||||||||||
1583 | bool res = false; | - | ||||||||||||||||||
1584 | const QMetaObject *smeta = sender->metaObject(); | - | ||||||||||||||||||
1585 | QByteArray signalName; | - | ||||||||||||||||||
1586 | QArgumentTypeArray signalTypes; | - | ||||||||||||||||||
1587 | ((!(QMetaObjectPrivate::get(smeta)->revision >= 7)) ? qt_assert("QMetaObjectPrivate::get(smeta)->revision >= 7",__FILE__,29522959) : qt_noop()); | - | ||||||||||||||||||
1588 | if (signal) | - | ||||||||||||||||||
1589 | signalName = QMetaObjectPrivate::decodeMethodSignature(signal, signalTypes); | - | ||||||||||||||||||
1590 | QByteArray methodName; | - | ||||||||||||||||||
1591 | QArgumentTypeArray methodTypes; | - | ||||||||||||||||||
1592 | ((!(!receiver || QMetaObjectPrivate::get(receiver->metaObject())->revision >= 7)) ? qt_assert("!receiver || QMetaObjectPrivate::get(receiver->metaObject())->revision >= 7",__FILE__,29572964) : qt_noop()); | - | ||||||||||||||||||
1593 | if (method) | - | ||||||||||||||||||
1594 | methodName = QMetaObjectPrivate::decodeMethodSignature(method, methodTypes); | - | ||||||||||||||||||
1595 | do { | - | ||||||||||||||||||
1596 | int signal_index = -1; | - | ||||||||||||||||||
1597 | if (signal) { | - | ||||||||||||||||||
1598 | signal_index = QMetaObjectPrivate::indexOfSignalRelative( | - | ||||||||||||||||||
1599 | &smeta, signalName, signalTypes.size(), signalTypes.constData()); | - | ||||||||||||||||||
1600 | if (signal_index < 0) | - | ||||||||||||||||||
1601 | break; | - | ||||||||||||||||||
1602 | signal_index = QMetaObjectPrivate::originalClone(smeta, signal_index); | - | ||||||||||||||||||
1603 | signal_index += QMetaObjectPrivate::signalOffset(smeta); | - | ||||||||||||||||||
1604 | signal_found = true; | - | ||||||||||||||||||
1605 | } | - | ||||||||||||||||||
1606 | - | |||||||||||||||||||
1607 | if (!method) { | - | ||||||||||||||||||
1608 | res |= QMetaObjectPrivate::disconnect(sender, signal_index, smeta, receiver, -1, 0); | - | ||||||||||||||||||
1609 | } else { | - | ||||||||||||||||||
1610 | const QMetaObject *rmeta = receiver->metaObject(); | - | ||||||||||||||||||
1611 | do { | - | ||||||||||||||||||
1612 | int method_index = QMetaObjectPrivate::indexOfMethod( | - | ||||||||||||||||||
1613 | rmeta, methodName, methodTypes.size(), methodTypes.constData()); | - | ||||||||||||||||||
1614 | if (method_index >= 0) | - | ||||||||||||||||||
1615 | while (method_index < rmeta->methodOffset()) | - | ||||||||||||||||||
1616 | rmeta = rmeta->superClass(); | - | ||||||||||||||||||
1617 | if (method_index < 0) | - | ||||||||||||||||||
1618 | break; | - | ||||||||||||||||||
1619 | res |= QMetaObjectPrivate::disconnect(sender, signal_index, smeta, receiver, method_index, 0); | - | ||||||||||||||||||
1620 | method_found = true; | - | ||||||||||||||||||
1621 | } while ((rmeta = rmeta->superClass())); | - | ||||||||||||||||||
1622 | } | - | ||||||||||||||||||
1623 | } while (signal && (smeta = smeta->superClass())); | - | ||||||||||||||||||
1624 | - | |||||||||||||||||||
1625 | if (signal && !signal_found) { | - | ||||||||||||||||||
1626 | err_method_notfound(sender, signal_arg, "disconnect"); | - | ||||||||||||||||||
1627 | err_info_about_objects("disconnect", sender, receiver); | - | ||||||||||||||||||
1628 | } else if (method && !method_found) { | - | ||||||||||||||||||
1629 | err_method_notfound(receiver, method_arg, "disconnect"); | - | ||||||||||||||||||
1630 | err_info_about_objects("disconnect", sender, receiver); | - | ||||||||||||||||||
1631 | } | - | ||||||||||||||||||
1632 | if (res) { | - | ||||||||||||||||||
1633 | if (!signal) | - | ||||||||||||||||||
1634 | const_cast<QObject*>(sender)->disconnectNotify(QMetaMethod()); | - | ||||||||||||||||||
1635 | } | - | ||||||||||||||||||
1636 | return res; | - | ||||||||||||||||||
1637 | } | - | ||||||||||||||||||
1638 | bool QObject::disconnect(const QObject *sender, const QMetaMethod &signal, | - | ||||||||||||||||||
1639 | const QObject *receiver, const QMetaMethod &method) | - | ||||||||||||||||||
1640 | { | - | ||||||||||||||||||
1641 | if (sender == 0 || (receiver == 0 && method.mobj != 0)) { | - | ||||||||||||||||||
1642 | QMessageLogger(__FILE__, 30373044, __PRETTY_FUNCTION__).warning("QObject::disconnect: Unexpected null parameter"); | - | ||||||||||||||||||
1643 | return false; | - | ||||||||||||||||||
1644 | } | - | ||||||||||||||||||
1645 | if (signal.mobj) { | - | ||||||||||||||||||
1646 | if(signal.methodType() != QMetaMethod::Signal) { | - | ||||||||||||||||||
1647 | QMessageLogger(__FILE__, 30423049, __PRETTY_FUNCTION__).warning("QObject::%s: Attempt to %s non-signal %s::%s", | - | ||||||||||||||||||
1648 | "disconnect","unbind", | - | ||||||||||||||||||
1649 | sender->metaObject()->className(), signal.methodSignature().constData()); | - | ||||||||||||||||||
1650 | return false; | - | ||||||||||||||||||
1651 | } | - | ||||||||||||||||||
1652 | } | - | ||||||||||||||||||
1653 | if (method.mobj) { | - | ||||||||||||||||||
1654 | if(method.methodType() == QMetaMethod::Constructor) { | - | ||||||||||||||||||
1655 | QMessageLogger(__FILE__, 30503057, __PRETTY_FUNCTION__).warning("QObject::disconect: cannot use constructor as argument %s::%s", | - | ||||||||||||||||||
1656 | receiver->metaObject()->className(), method.methodSignature().constData()); | - | ||||||||||||||||||
1657 | return false; | - | ||||||||||||||||||
1658 | } | - | ||||||||||||||||||
1659 | } | - | ||||||||||||||||||
1660 | - | |||||||||||||||||||
1661 | - | |||||||||||||||||||
1662 | QByteArray signalSignature; | - | ||||||||||||||||||
1663 | if (signal.mobj) { | - | ||||||||||||||||||
1664 | signalSignature.reserve(signal.methodSignature().size()+1); | - | ||||||||||||||||||
1665 | signalSignature.append((char)(2 + '0')); | - | ||||||||||||||||||
1666 | signalSignature.append(signal.methodSignature()); | - | ||||||||||||||||||
1667 | } | - | ||||||||||||||||||
1668 | - | |||||||||||||||||||
1669 | int signal_index; | - | ||||||||||||||||||
1670 | int method_index; | - | ||||||||||||||||||
1671 | { | - | ||||||||||||||||||
1672 | int dummy; | - | ||||||||||||||||||
1673 | QMetaObjectPrivate::memberIndexes(sender, signal, &signal_index, &dummy); | - | ||||||||||||||||||
1674 | QMetaObjectPrivate::memberIndexes(receiver, method, &dummy, &method_index); | - | ||||||||||||||||||
1675 | } | - | ||||||||||||||||||
1676 | - | |||||||||||||||||||
1677 | - | |||||||||||||||||||
1678 | if (signal.mobj && signal_index == -1) { | - | ||||||||||||||||||
1679 | QMessageLogger(__FILE__, 30743081, __PRETTY_FUNCTION__).warning("QObject::disconect: signal %s not found on class %s", | - | ||||||||||||||||||
1680 | signal.methodSignature().constData(), sender->metaObject()->className()); | - | ||||||||||||||||||
1681 | return false; | - | ||||||||||||||||||
1682 | } | - | ||||||||||||||||||
1683 | - | |||||||||||||||||||
1684 | if (receiver && method.mobj && method_index == -1) { | - | ||||||||||||||||||
1685 | QMessageLogger(__FILE__, 30803087, __PRETTY_FUNCTION__).warning("QObject::disconect: method %s not found on class %s", | - | ||||||||||||||||||
1686 | method.methodSignature().constData(), receiver->metaObject()->className()); | - | ||||||||||||||||||
1687 | return false; | - | ||||||||||||||||||
1688 | } | - | ||||||||||||||||||
1689 | - | |||||||||||||||||||
1690 | if (!QMetaObjectPrivate::disconnect(sender, signal_index, signal.mobj, receiver, method_index, 0)) | - | ||||||||||||||||||
1691 | return false; | - | ||||||||||||||||||
1692 | - | |||||||||||||||||||
1693 | if (!signal.isValid()) { | - | ||||||||||||||||||
1694 | - | |||||||||||||||||||
1695 | - | |||||||||||||||||||
1696 | - | |||||||||||||||||||
1697 | - | |||||||||||||||||||
1698 | const_cast<QObject*>(sender)->disconnectNotify(signal); | - | ||||||||||||||||||
1699 | } | - | ||||||||||||||||||
1700 | return true; | - | ||||||||||||||||||
1701 | } | - | ||||||||||||||||||
1702 | void QObject::connectNotify(const QMetaMethod &signal) | - | ||||||||||||||||||
1703 | { | - | ||||||||||||||||||
1704 | (void)signal;; | - | ||||||||||||||||||
1705 | } | - | ||||||||||||||||||
1706 | void QObject::disconnectNotify(const QMetaMethod &signal) | - | ||||||||||||||||||
1707 | { | - | ||||||||||||||||||
1708 | (void)signal;; | - | ||||||||||||||||||
1709 | } | - | ||||||||||||||||||
1710 | - | |||||||||||||||||||
1711 | - | |||||||||||||||||||
1712 | - | |||||||||||||||||||
1713 | - | |||||||||||||||||||
1714 | - | |||||||||||||||||||
1715 | static int methodIndexToSignalIndex(const QMetaObject **base, int signal_index) | - | ||||||||||||||||||
1716 | { | - | ||||||||||||||||||
1717 | if (signal_index < 0) | - | ||||||||||||||||||
1718 | return signal_index; | - | ||||||||||||||||||
1719 | const QMetaObject *metaObject = *base; | - | ||||||||||||||||||
1720 | while (metaObject && metaObject->methodOffset() > signal_index) | - | ||||||||||||||||||
1721 | metaObject = metaObject->superClass(); | - | ||||||||||||||||||
1722 | - | |||||||||||||||||||
1723 | if (metaObject) { | - | ||||||||||||||||||
1724 | int signalOffset, methodOffset; | - | ||||||||||||||||||
1725 | computeOffsets(metaObject, &signalOffset, &methodOffset); | - | ||||||||||||||||||
1726 | if (signal_index < metaObject->methodCount()) | - | ||||||||||||||||||
1727 | signal_index = QMetaObjectPrivate::originalClone(metaObject, signal_index - methodOffset) + signalOffset; | - | ||||||||||||||||||
1728 | else | - | ||||||||||||||||||
1729 | signal_index = signal_index - methodOffset + signalOffset; | - | ||||||||||||||||||
1730 | *base = metaObject; | - | ||||||||||||||||||
1731 | } | - | ||||||||||||||||||
1732 | return signal_index; | - | ||||||||||||||||||
1733 | } | - | ||||||||||||||||||
1734 | QMetaObject::Connection QMetaObject::connect(const QObject *sender, int signal_index, | - | ||||||||||||||||||
1735 | const QObject *receiver, int method_index, int type, int *types) | - | ||||||||||||||||||
1736 | { | - | ||||||||||||||||||
1737 | const QMetaObject *smeta = sender->metaObject(); | - | ||||||||||||||||||
1738 | signal_index = methodIndexToSignalIndex(&smeta, signal_index); | - | ||||||||||||||||||
1739 | return Connection(QMetaObjectPrivate::connect(sender, signal_index, smeta, | - | ||||||||||||||||||
1740 | receiver, method_index, | - | ||||||||||||||||||
1741 | 0, | - | ||||||||||||||||||
1742 | type, types)); | - | ||||||||||||||||||
1743 | } | - | ||||||||||||||||||
1744 | QObjectPrivate::Connection *QMetaObjectPrivate::connect(const QObject *sender, | - | ||||||||||||||||||
1745 | int signal_index, const QMetaObject *smeta, | - | ||||||||||||||||||
1746 | const QObject *receiver, int method_index, | - | ||||||||||||||||||
1747 | const QMetaObject *rmeta, int type, int *types) | - | ||||||||||||||||||
1748 | { | - | ||||||||||||||||||
1749 | QObject *s = const_cast<QObject *>(sender); | - | ||||||||||||||||||
1750 | QObject *r = const_cast<QObject *>(receiver); | - | ||||||||||||||||||
1751 | - | |||||||||||||||||||
1752 | int method_offset = rmeta ? rmeta->methodOffset() : 0; | - | ||||||||||||||||||
1753 | ((!(!rmeta || QMetaObjectPrivate::get(rmeta)->revision >= 6)) ? qt_assert("!rmeta || QMetaObjectPrivate::get(rmeta)->revision >= 6",__FILE__,32453252) : qt_noop()); | - | ||||||||||||||||||
1754 | QObjectPrivate::StaticMetaCallFunction callFunction = | - | ||||||||||||||||||
1755 | rmeta ? rmeta->d.static_metacall : 0; | - | ||||||||||||||||||
1756 | - | |||||||||||||||||||
1757 | QOrderedMutexLocker locker(signalSlotLock(sender), | - | ||||||||||||||||||
1758 | signalSlotLock(receiver)); | - | ||||||||||||||||||
1759 | - | |||||||||||||||||||
1760 | if (type & Qt::UniqueConnection) { | - | ||||||||||||||||||
1761 | QObjectConnectionListVector *connectionLists = QObjectPrivate::get(s)->connectionLists; | - | ||||||||||||||||||
1762 | if (connectionLists && connectionLists->count() > signal_index) { | - | ||||||||||||||||||
1763 | const QObjectPrivate::Connection *c2 = | - | ||||||||||||||||||
1764 | (*connectionLists)[signal_index].first; | - | ||||||||||||||||||
1765 | - | |||||||||||||||||||
1766 | int method_index_absolute = method_index + method_offset; | - | ||||||||||||||||||
1767 | - | |||||||||||||||||||
1768 | while (c2) { | - | ||||||||||||||||||
1769 | if (!c2->isSlotObject && c2->receiver == receiver && c2->method() == method_index_absolute) | - | ||||||||||||||||||
1770 | return 0; | - | ||||||||||||||||||
1771 | c2 = c2->nextConnectionList; | - | ||||||||||||||||||
1772 | } | - | ||||||||||||||||||
1773 | } | - | ||||||||||||||||||
1774 | type &= Qt::UniqueConnection - 1; | - | ||||||||||||||||||
1775 | } | - | ||||||||||||||||||
1776 | - | |||||||||||||||||||
1777 | QScopedPointer<QObjectPrivate::Connection> c(new QObjectPrivate::Connection); | - | ||||||||||||||||||
1778 | c->sender = s; | - | ||||||||||||||||||
1779 | c->signal_index = signal_index; | - | ||||||||||||||||||
1780 | c->receiver = r; | - | ||||||||||||||||||
1781 | c->method_relative = method_index; | - | ||||||||||||||||||
1782 | c->method_offset = method_offset; | - | ||||||||||||||||||
1783 | c->connectionType = type; | - | ||||||||||||||||||
1784 | c->isSlotObject = false; | - | ||||||||||||||||||
1785 | c->argumentTypes.store(types); | - | ||||||||||||||||||
1786 | c->nextConnectionList = 0; | - | ||||||||||||||||||
1787 | c->callFunction = callFunction; | - | ||||||||||||||||||
1788 | - | |||||||||||||||||||
1789 | QObjectPrivate::get(s)->addConnection(signal_index, c.data()); | - | ||||||||||||||||||
1790 | - | |||||||||||||||||||
1791 | locker.unlock(); | - | ||||||||||||||||||
1792 | QMetaMethod smethod = QMetaObjectPrivate::signal(smeta, signal_index); | - | ||||||||||||||||||
1793 | if (smethod.isValid()) | - | ||||||||||||||||||
1794 | s->connectNotify(smethod); | - | ||||||||||||||||||
1795 | - | |||||||||||||||||||
1796 | return c.take(); | - | ||||||||||||||||||
1797 | } | - | ||||||||||||||||||
1798 | - | |||||||||||||||||||
1799 | - | |||||||||||||||||||
1800 | - | |||||||||||||||||||
1801 | - | |||||||||||||||||||
1802 | bool QMetaObject::disconnect(const QObject *sender, int signal_index, | - | ||||||||||||||||||
1803 | const QObject *receiver, int method_index) | - | ||||||||||||||||||
1804 | { | - | ||||||||||||||||||
1805 | const QMetaObject *smeta = sender->metaObject(); | - | ||||||||||||||||||
1806 | signal_index = methodIndexToSignalIndex(&smeta, signal_index); | - | ||||||||||||||||||
1807 | return QMetaObjectPrivate::disconnect(sender, signal_index, smeta, | - | ||||||||||||||||||
1808 | receiver, method_index, 0); | - | ||||||||||||||||||
1809 | } | - | ||||||||||||||||||
1810 | bool QMetaObject::disconnectOne(const QObject *sender, int signal_index, | - | ||||||||||||||||||
1811 | const QObject *receiver, int method_index) | - | ||||||||||||||||||
1812 | { | - | ||||||||||||||||||
1813 | const QMetaObject *smeta = sender->metaObject(); | - | ||||||||||||||||||
1814 | signal_index = methodIndexToSignalIndex(&smeta, signal_index); | - | ||||||||||||||||||
1815 | return QMetaObjectPrivate::disconnect(sender, signal_index, smeta, | - | ||||||||||||||||||
1816 | receiver, method_index, 0, | - | ||||||||||||||||||
1817 | QMetaObjectPrivate::DisconnectOne); | - | ||||||||||||||||||
1818 | } | - | ||||||||||||||||||
1819 | - | |||||||||||||||||||
1820 | - | |||||||||||||||||||
1821 | - | |||||||||||||||||||
1822 | - | |||||||||||||||||||
1823 | - | |||||||||||||||||||
1824 | bool QMetaObjectPrivate::disconnectHelper(QObjectPrivate::Connection *c, | - | ||||||||||||||||||
1825 | const QObject *receiver, int method_index, void **slot, | - | ||||||||||||||||||
1826 | QMutex *senderMutex, DisconnectType disconnectType) | - | ||||||||||||||||||
1827 | { | - | ||||||||||||||||||
1828 | bool success = false; | - | ||||||||||||||||||
1829 | while (c) { | - | ||||||||||||||||||
1830 | if (c->receiver | - | ||||||||||||||||||
1831 | && (receiver == 0 || (c->receiver == receiver | - | ||||||||||||||||||
1832 | && (method_index < 0 || (!c->isSlotObject && c->method() == method_index)) | - | ||||||||||||||||||
1833 | && (slot == 0 || (c->isSlotObject && c->slotObj->compare(slot)))))) { | - | ||||||||||||||||||
1834 | bool needToUnlock = false; | - | ||||||||||||||||||
1835 | QMutex *receiverMutex = 0; | - | ||||||||||||||||||
1836 | if (c->receiver) { | - | ||||||||||||||||||
1837 | receiverMutex = signalSlotLock(c->receiver); | - | ||||||||||||||||||
1838 | - | |||||||||||||||||||
1839 | needToUnlock = QOrderedMutexLocker::relock(senderMutex, receiverMutex); | - | ||||||||||||||||||
1840 | } | - | ||||||||||||||||||
1841 | if (c->receiver) { | - | ||||||||||||||||||
1842 | *c->prev = c->next; | - | ||||||||||||||||||
1843 | if (c->next) | - | ||||||||||||||||||
1844 | c->next->prev = c->prev; | - | ||||||||||||||||||
1845 | } | - | ||||||||||||||||||
1846 | - | |||||||||||||||||||
1847 | if (needToUnlock) | - | ||||||||||||||||||
1848 | receiverMutex->unlock(); | - | ||||||||||||||||||
1849 | - | |||||||||||||||||||
1850 | c->receiver = 0; | - | ||||||||||||||||||
1851 | - | |||||||||||||||||||
1852 | if (c->isSlotObject) { | - | ||||||||||||||||||
1853 | c->isSlotObject = false; | - | ||||||||||||||||||
1854 | senderMutex->unlock(); | - | ||||||||||||||||||
1855 | c->slotObj->destroyIfLastRef(); | - | ||||||||||||||||||
1856 | senderMutex->lock(); | - | ||||||||||||||||||
1857 | } | - | ||||||||||||||||||
1858 | - | |||||||||||||||||||
1859 | success = true; | - | ||||||||||||||||||
1860 | - | |||||||||||||||||||
1861 | if (disconnectType == DisconnectOne) | - | ||||||||||||||||||
1862 | return success; | - | ||||||||||||||||||
1863 | } | - | ||||||||||||||||||
1864 | c = c->nextConnectionList; | - | ||||||||||||||||||
1865 | } | - | ||||||||||||||||||
1866 | return success; | - | ||||||||||||||||||
1867 | } | - | ||||||||||||||||||
1868 | - | |||||||||||||||||||
1869 | - | |||||||||||||||||||
1870 | - | |||||||||||||||||||
1871 | - | |||||||||||||||||||
1872 | - | |||||||||||||||||||
1873 | bool QMetaObjectPrivate::disconnect(const QObject *sender, | - | ||||||||||||||||||
1874 | int signal_index, const QMetaObject *smeta, | - | ||||||||||||||||||
1875 | const QObject *receiver, int method_index, void **slot, | - | ||||||||||||||||||
1876 | DisconnectType disconnectType) | - | ||||||||||||||||||
1877 | { | - | ||||||||||||||||||
1878 | if (!sender) | - | ||||||||||||||||||
1879 | return false; | - | ||||||||||||||||||
1880 | - | |||||||||||||||||||
1881 | QObject *s = const_cast<QObject *>(sender); | - | ||||||||||||||||||
1882 | - | |||||||||||||||||||
1883 | QMutex *senderMutex = signalSlotLock(sender); | - | ||||||||||||||||||
1884 | QMutexLocker locker(senderMutex); | - | ||||||||||||||||||
1885 | - | |||||||||||||||||||
1886 | QObjectConnectionListVector *connectionLists = QObjectPrivate::get(s)->connectionLists; | - | ||||||||||||||||||
1887 | if (!connectionLists) | - | ||||||||||||||||||
1888 | return false; | - | ||||||||||||||||||
1889 | - | |||||||||||||||||||
1890 | - | |||||||||||||||||||
1891 | ++connectionLists->inUse; | - | ||||||||||||||||||
1892 | - | |||||||||||||||||||
1893 | bool success = false; | - | ||||||||||||||||||
1894 | if (signal_index < 0) { | - | ||||||||||||||||||
1895 | - | |||||||||||||||||||
1896 | for (int sig_index = -1; sig_index < connectionLists->count(); ++sig_index) { | - | ||||||||||||||||||
1897 | QObjectPrivate::Connection *c = | - | ||||||||||||||||||
1898 | (*connectionLists)[sig_index].first; | - | ||||||||||||||||||
1899 | if (disconnectHelper(c, receiver, method_index, slot, senderMutex, disconnectType)) { | - | ||||||||||||||||||
1900 | success = true; | - | ||||||||||||||||||
1901 | connectionLists->dirty = true; | - | ||||||||||||||||||
1902 | } | - | ||||||||||||||||||
1903 | } | - | ||||||||||||||||||
1904 | } else if (signal_index < connectionLists->count()) { | - | ||||||||||||||||||
1905 | QObjectPrivate::Connection *c = | - | ||||||||||||||||||
1906 | (*connectionLists)[signal_index].first; | - | ||||||||||||||||||
1907 | if (disconnectHelper(c, receiver, method_index, slot, senderMutex, disconnectType)) { | - | ||||||||||||||||||
1908 | success = true; | - | ||||||||||||||||||
1909 | connectionLists->dirty = true; | - | ||||||||||||||||||
1910 | } | - | ||||||||||||||||||
1911 | } | - | ||||||||||||||||||
1912 | - | |||||||||||||||||||
1913 | --connectionLists->inUse; | - | ||||||||||||||||||
1914 | ((!(connectionLists->inUse >= 0)) ? qt_assert("connectionLists->inUse >= 0",__FILE__,34143421) : qt_noop()); | - | ||||||||||||||||||
1915 | if (connectionLists->orphaned && !connectionLists->inUse) | - | ||||||||||||||||||
1916 | delete connectionLists; | - | ||||||||||||||||||
1917 | - | |||||||||||||||||||
1918 | locker.unlock(); | - | ||||||||||||||||||
1919 | if (success) { | - | ||||||||||||||||||
1920 | QMetaMethod smethod = QMetaObjectPrivate::signal(smeta, signal_index); | - | ||||||||||||||||||
1921 | if (smethod.isValid()) | - | ||||||||||||||||||
1922 | s->disconnectNotify(smethod); | - | ||||||||||||||||||
1923 | } | - | ||||||||||||||||||
1924 | - | |||||||||||||||||||
1925 | return success; | - | ||||||||||||||||||
1926 | } | - | ||||||||||||||||||
1927 | void QMetaObject::connectSlotsByName(QObject *o) | - | ||||||||||||||||||
1928 | { | - | ||||||||||||||||||
1929 | if (!o) | - | ||||||||||||||||||
1930 | return; | - | ||||||||||||||||||
1931 | const QMetaObject *mo = o->metaObject(); | - | ||||||||||||||||||
1932 | ((!(mo)) ? qt_assert("mo",__FILE__,34523459) : qt_noop()); | - | ||||||||||||||||||
1933 | const QObjectList list = | - | ||||||||||||||||||
1934 | o->findChildren<QObject *>(QString()) | - | ||||||||||||||||||
1935 | << o; | - | ||||||||||||||||||
1936 | - | |||||||||||||||||||
1937 | - | |||||||||||||||||||
1938 | for (int i = 0; i < mo->methodCount(); ++i) { | - | ||||||||||||||||||
1939 | const QByteArray slotSignature = mo->method(i).methodSignature(); | - | ||||||||||||||||||
1940 | const char *slot = slotSignature.constData(); | - | ||||||||||||||||||
1941 | ((!(slot)) ? qt_assert("slot",__FILE__,34613468) : qt_noop()); | - | ||||||||||||||||||
1942 | - | |||||||||||||||||||
1943 | - | |||||||||||||||||||
1944 | if (slot[0] != 'o' || slot[1] != 'n' || slot[2] != '_') | - | ||||||||||||||||||
1945 | continue; | - | ||||||||||||||||||
1946 | - | |||||||||||||||||||
1947 | - | |||||||||||||||||||
1948 | bool foundIt = false; | - | ||||||||||||||||||
1949 | for(int j = 0; j < list.count(); ++j) { | - | ||||||||||||||||||
1950 | const QObject *co = list.at(j); | - | ||||||||||||||||||
1951 | const QByteArray coName = co->objectName().toLatin1(); | - | ||||||||||||||||||
1952 | - | |||||||||||||||||||
1953 | - | |||||||||||||||||||
1954 | if (coName.isEmpty() || qstrncmp(slot + 3, coName.constData(), coName.size()) || slot[coName.size()+3] != '_') | - | ||||||||||||||||||
1955 | continue; | - | ||||||||||||||||||
1956 | - | |||||||||||||||||||
1957 | const char *signal = slot + coName.size() + 4; | - | ||||||||||||||||||
1958 | - | |||||||||||||||||||
1959 | - | |||||||||||||||||||
1960 | const QMetaObject *smeta; | - | ||||||||||||||||||
1961 | int sigIndex = co->d_func()->signalIndex(signal, &smeta); | - | ||||||||||||||||||
1962 | if (sigIndex < 0) { | - | ||||||||||||||||||
1963 | - | |||||||||||||||||||
1964 | - | |||||||||||||||||||
1965 | - | |||||||||||||||||||
1966 | - | |||||||||||||||||||
1967 | QList<QByteArray> compatibleSignals; | - | ||||||||||||||||||
1968 | const QMetaObject *smo = co->metaObject(); | - | ||||||||||||||||||
1969 | int sigLen = qstrlen(signal) - 1; | - | ||||||||||||||||||
1970 | for (int k = QMetaObjectPrivate::absoluteSignalCount(smo)-1; k >= 0; --k) { | - | ||||||||||||||||||
1971 | const QMetaMethod method = QMetaObjectPrivate::signal(smo, k); | - | ||||||||||||||||||
1972 | if (!qstrncmp(method.methodSignature().constData(), signal, sigLen)) { | - | ||||||||||||||||||
1973 | smeta = method.enclosingMetaObject(); | - | ||||||||||||||||||
1974 | sigIndex = k; | - | ||||||||||||||||||
1975 | compatibleSignals.prepend(method.methodSignature()); | - | ||||||||||||||||||
1976 | } | - | ||||||||||||||||||
1977 | } | - | ||||||||||||||||||
1978 | if (compatibleSignals.size() > 1) | - | ||||||||||||||||||
1979 | QMessageLogger(__FILE__, 34993506, __PRETTY_FUNCTION__).warning() << "QMetaObject::connectSlotsByName: Connecting slot" << slot | - | ||||||||||||||||||
1980 | << "with the first of the following compatible signals:" << compatibleSignals; | - | ||||||||||||||||||
1981 | } | - | ||||||||||||||||||
1982 | - | |||||||||||||||||||
1983 | if (sigIndex < 0) | - | ||||||||||||||||||
1984 | continue; | - | ||||||||||||||||||
1985 | - | |||||||||||||||||||
1986 | - | |||||||||||||||||||
1987 | if (Connection(QMetaObjectPrivate::connect(co, sigIndex, smeta, o, i))) { | - | ||||||||||||||||||
1988 | foundIt = true; | - | ||||||||||||||||||
1989 | - | |||||||||||||||||||
1990 | - | |||||||||||||||||||
1991 | - | |||||||||||||||||||
1992 | - | |||||||||||||||||||
1993 | break; | - | ||||||||||||||||||
1994 | } | - | ||||||||||||||||||
1995 | } | - | ||||||||||||||||||
1996 | if (foundIt) { | - | ||||||||||||||||||
1997 | - | |||||||||||||||||||
1998 | while (mo->method(i + 1).attributes() & QMetaMethod::Cloned) | - | ||||||||||||||||||
1999 | ++i; | - | ||||||||||||||||||
2000 | } else if (!(mo->method(i).attributes() & QMetaMethod::Cloned)) { | - | ||||||||||||||||||
2001 | - | |||||||||||||||||||
2002 | int iParen = slotSignature.indexOf('('); | - | ||||||||||||||||||
2003 | int iLastUnderscore = slotSignature.lastIndexOf('_', iParen-1); | - | ||||||||||||||||||
2004 | if (iLastUnderscore > 3) | - | ||||||||||||||||||
2005 | QMessageLogger(__FILE__, 35253532, __PRETTY_FUNCTION__).warning("QMetaObject::connectSlotsByName: No matching signal for %s", slot); | - | ||||||||||||||||||
2006 | } | - | ||||||||||||||||||
2007 | } | - | ||||||||||||||||||
2008 | } | - | ||||||||||||||||||
2009 | - | |||||||||||||||||||
2010 | - | |||||||||||||||||||
2011 | - | |||||||||||||||||||
2012 | - | |||||||||||||||||||
2013 | - | |||||||||||||||||||
2014 | - | |||||||||||||||||||
2015 | static void queued_activate(QObject *sender, int signal, QObjectPrivate::Connection *c, void **argv, | - | ||||||||||||||||||
2016 | QMutexLocker &locker) | - | ||||||||||||||||||
2017 | { | - | ||||||||||||||||||
2018 | const int *argumentTypes = c->argumentTypes.load(); | - | ||||||||||||||||||
2019 | if (!argumentTypes) { | - | ||||||||||||||||||
2020 | QMetaMethod m = QMetaObjectPrivate::signal(sender->metaObject(), signal); | - | ||||||||||||||||||
2021 | argumentTypes = queuedConnectionTypes(m.parameterTypes()); | - | ||||||||||||||||||
2022 | if (!argumentTypes) | - | ||||||||||||||||||
2023 | argumentTypes = &DIRECT_CONNECTION_ONLY; | - | ||||||||||||||||||
2024 | if (!c->argumentTypes.testAndSetOrdered(0, argumentTypes)) { | - | ||||||||||||||||||
2025 | if (argumentTypes != &DIRECT_CONNECTION_ONLY) | - | ||||||||||||||||||
2026 | delete [] argumentTypes; | - | ||||||||||||||||||
2027 | argumentTypes = c->argumentTypes.load(); | - | ||||||||||||||||||
2028 | } | - | ||||||||||||||||||
2029 | } | - | ||||||||||||||||||
2030 | if (argumentTypes == &DIRECT_CONNECTION_ONLY) | - | ||||||||||||||||||
2031 | return; | - | ||||||||||||||||||
2032 | int nargs = 1; | - | ||||||||||||||||||
2033 | while (argumentTypes[nargs-1]) | - | ||||||||||||||||||
2034 | ++nargs; | - | ||||||||||||||||||
2035 | int *types = (int *) malloc(nargs*sizeof(int)); | - | ||||||||||||||||||
2036 | do { if (!(types)) qBadAlloc(); } while (0); | - | ||||||||||||||||||
2037 | void **args = (void **) malloc(nargs*sizeof(void *)); | - | ||||||||||||||||||
2038 | do { if (!(args)) qBadAlloc(); } while (0); | - | ||||||||||||||||||
2039 | types[0] = 0; | - | ||||||||||||||||||
2040 | args[0] = 0; | - | ||||||||||||||||||
2041 | - | |||||||||||||||||||
2042 | if (nargs > 1) { | - | ||||||||||||||||||
2043 | for (int n = 1; n < nargs; ++n) | - | ||||||||||||||||||
2044 | types[n] = argumentTypes[n-1]; | - | ||||||||||||||||||
2045 | - | |||||||||||||||||||
2046 | locker.unlock(); | - | ||||||||||||||||||
2047 | for (int n = 1; n < nargs; ++n) | - | ||||||||||||||||||
2048 | args[n] = QMetaType::create(types[n], argv[n]); | - | ||||||||||||||||||
2049 | locker.relock(); | - | ||||||||||||||||||
2050 | - | |||||||||||||||||||
2051 | if (!c->receiver) { | - | ||||||||||||||||||
2052 | locker.unlock(); | - | ||||||||||||||||||
2053 | - | |||||||||||||||||||
2054 | for (int n = 1; n < nargs; ++n) | - | ||||||||||||||||||
2055 | QMetaType::destroy(types[n], args[n]); | - | ||||||||||||||||||
2056 | free(types); | - | ||||||||||||||||||
2057 | free(args); | - | ||||||||||||||||||
2058 | locker.relock(); | - | ||||||||||||||||||
2059 | return; | - | ||||||||||||||||||
2060 | } | - | ||||||||||||||||||
2061 | } | - | ||||||||||||||||||
2062 | - | |||||||||||||||||||
2063 | QMetaCallEvent *ev = c->isSlotObject ? | - | ||||||||||||||||||
2064 | new QMetaCallEvent(c->slotObj, sender, signal, nargs, types, args) : | - | ||||||||||||||||||
2065 | new QMetaCallEvent(c->method_offset, c->method_relative, c->callFunction, sender, signal, nargs, types, args); | - | ||||||||||||||||||
2066 | QCoreApplication::postEvent(c->receiver, ev); | - | ||||||||||||||||||
2067 | } | - | ||||||||||||||||||
2068 | - | |||||||||||||||||||
2069 | - | |||||||||||||||||||
2070 | - | |||||||||||||||||||
2071 | - | |||||||||||||||||||
2072 | void QMetaObject::activate(QObject *sender, const QMetaObject *m, int local_signal_index, | - | ||||||||||||||||||
2073 | void **argv) | - | ||||||||||||||||||
2074 | { | - | ||||||||||||||||||
2075 | activate(sender, QMetaObjectPrivate::signalOffset(m), local_signal_index, argv); | - | ||||||||||||||||||
2076 | } | - | ||||||||||||||||||
2077 | - | |||||||||||||||||||
2078 | - | |||||||||||||||||||
2079 | - | |||||||||||||||||||
2080 | - | |||||||||||||||||||
2081 | void QMetaObject::activate(QObject *sender, int signalOffset, int local_signal_index, void **argv) | - | ||||||||||||||||||
2082 | { | - | ||||||||||||||||||
2083 | int signal_index = signalOffset + local_signal_index; | - | ||||||||||||||||||
if (!sender->d_func()->isSignalConnected(signal_index) | ||||||||||||||||||||
&& !qt_signal_spy_callback_set.signal_begin_callback | ||||||||||||||||||||
&& !qt_signal_spy_callback_set.signal_end_callback) { | ||||||||||||||||||||
return; | ||||||||||||||||||||
2084 | - | |||||||||||||||||||
2085 | }if (sender->d_func()->blockSig
| 48493-22007731 | ||||||||||||||||||
2086 | return; executed 48493 times by 34 tests: return; Executed by:
| 48493 | ||||||||||||||||||
2087 | - | |||||||||||||||||||
2088 | if (sender->d_func()->declarativeDataisDeclarativeSignalConnected(signal_index)
| 0-22007733 | ||||||||||||||||||
2089 | && QAbstractDeclarativeData::signalEmitted
| 0 | ||||||||||||||||||
2090 | QAbstractDeclarativeData::signalEmitted(sender->d_func()->declarativeData, sender, | - | ||||||||||||||||||
2091 | signal_index, argv); | - | ||||||||||||||||||
2092 | } never executed: end of block | 0 | ||||||||||||||||||
2093 | - | |||||||||||||||||||
2094 | if (!sender->d_func()->isSignalConnected(signal_index, false)
| 7734830-14272902 | ||||||||||||||||||
2095 | && !qt_signal_spy_callback_set.signal_begin_callback
| 0-14272902 | ||||||||||||||||||
2096 | && !qt_signal_spy_callback_set.signal_end_callback
| 0-14272903 | ||||||||||||||||||
2097 | - | |||||||||||||||||||
2098 | return; executed 14272903 times by 1013 tests: return; Executed by:
| 14272903 | ||||||||||||||||||
2099 | } | - | ||||||||||||||||||
2100 | - | |||||||||||||||||||
2101 | void *empty_argv[] = { 0 }; | - | ||||||||||||||||||
2102 | if (qt_signal_spy_callback_set.signal_begin_callback != 0
| 0-7734830 | ||||||||||||||||||
2103 | qt_signal_spy_callback_set.signal_begin_callback(sender, signal_index, | - | ||||||||||||||||||
2104 | argv ? argv : empty_argv); | - | ||||||||||||||||||
2105 | } never executed: end of block | 0 | ||||||||||||||||||
2106 | - | |||||||||||||||||||
2107 | Qt::HANDLE currentThreadId = QThread::currentThreadId();{ | - | ||||||||||||||||||
2108 | QMutexLocker locker(signalSlotLock(sender)); | - | ||||||||||||||||||
2109 | struct ConnectionListsRef { | - | ||||||||||||||||||
2110 | QObjectConnectionListVector *connectionLists; | - | ||||||||||||||||||
2111 | ConnectionListsRef(QObjectConnectionListVector *connectionLists) : connectionLists(connectionLists) | - | ||||||||||||||||||
2112 | { | - | ||||||||||||||||||
2113 | if (connectionLists) | - | ||||||||||||||||||
2114 | ++connectionLists->inUse; | - | ||||||||||||||||||
2115 | } | - | ||||||||||||||||||
2116 | ~ConnectionListsRef() | - | ||||||||||||||||||
2117 | { | - | ||||||||||||||||||
2118 | if (!connectionLists) | - | ||||||||||||||||||
2119 | return; | - | ||||||||||||||||||
2120 | - | |||||||||||||||||||
2121 | --connectionLists->inUse; | - | ||||||||||||||||||
2122 | ((!(connectionLists->inUse >= 0)) ? qt_assert("connectionLists->inUse >= 0",__FILE__,36413649) : qt_noop()); | - | ||||||||||||||||||
2123 | if (connectionLists->orphaned) { | - | ||||||||||||||||||
2124 | if (!connectionLists->inUse) | - | ||||||||||||||||||
2125 | delete connectionLists; | - | ||||||||||||||||||
2126 | } | - | ||||||||||||||||||
2127 | } | - | ||||||||||||||||||
2128 | - | |||||||||||||||||||
2129 | QObjectConnectionListVector *operator->() const { return connectionLists; } | - | ||||||||||||||||||
2130 | }; | - | ||||||||||||||||||
2131 | ConnectionListsRef connectionLists = sender->d_func()->connectionLists; | - | ||||||||||||||||||
2132 | if (!connectionLists.connectionLists
| 0-7734830 | ||||||||||||||||||
2133 | locker.unlock(); | - | ||||||||||||||||||
2134 | if (qt_signal_spy_callback_set.signal_end_callback != 0
| 0 | ||||||||||||||||||
2135 | qt_signal_spy_callback_set.signal_end_callback(sender, signal_index); never executed: qt_signal_spy_callback_set.signal_end_callback(sender, signal_index); | 0 | ||||||||||||||||||
2136 | return; never executed: return; | 0 | ||||||||||||||||||
2137 | } | - | ||||||||||||||||||
2138 | - | |||||||||||||||||||
2139 | const QObjectPrivate::ConnectionList *list; | - | ||||||||||||||||||
2140 | if (signal_index < connectionLists->count()
| 406-7734424 | ||||||||||||||||||
2141 | list = &connectionLists->at(signal_index); executed 7734424 times by 507 tests: list = &connectionLists->at(signal_index); Executed by:
| 7734424 | ||||||||||||||||||
2142 | else | - | ||||||||||||||||||
2143 | list = &connectionLists->allsignals; executed 406 times by 9 tests: list = &connectionLists->allsignals; Executed by:
| 406 | ||||||||||||||||||
2144 | - | |||||||||||||||||||
2145 | Qt::HANDLE currentThreadId = QThread::currentThreadId(); | - | ||||||||||||||||||
2146 | - | |||||||||||||||||||
2147 | do { | - | ||||||||||||||||||
2148 | QObjectPrivate::Connection *c = list->first; | - | ||||||||||||||||||
2149 | if (!c
executed 7734275 times by 507 tests: continue; Executed by:
| 7734275-7734721 | ||||||||||||||||||
2150 | - | |||||||||||||||||||
2151 | - | |||||||||||||||||||
2152 | QObjectPrivate::Connection *last = list->last; | - | ||||||||||||||||||
2153 | - | |||||||||||||||||||
2154 | do { | - | ||||||||||||||||||
2155 | if (!c->receiver
| 22510-8500750 | ||||||||||||||||||
2156 | continue; executed 22510 times by 274 tests: continue; Executed by:
| 22510 | ||||||||||||||||||
2157 | - | |||||||||||||||||||
2158 | QObject * const receiver = c->receiver; | - | ||||||||||||||||||
2159 | const bool receiverInSameThread = currentThreadId == receiver->d_func()->threadData->threadId; | - | ||||||||||||||||||
2160 | - | |||||||||||||||||||
2161 | - | |||||||||||||||||||
2162 | - | |||||||||||||||||||
2163 | if ((c->connectionType == Qt::AutoConnection
| 13222-8270219 | ||||||||||||||||||
2164 | || (
| 146324-8341204 | ||||||||||||||||||
2165 | queued_activate(sender, signal_index, c, argv ? argv : empty_argv, locker); | - | ||||||||||||||||||
2166 | continue; executed 159546 times by 431 tests: continue; Executed by:
| 159546 | ||||||||||||||||||
2167 | - | |||||||||||||||||||
2168 | } else if (c->connectionType == Qt::BlockingQueuedConnection
| 4442-8336762 | ||||||||||||||||||
2169 | if (receiverInSameThread
| 0-4442 | ||||||||||||||||||
2170 | QMessageLogger(__FILE__, 36873697, __PRETTY_FUNCTION__).warning("Qt: Dead lock detected while activating a BlockingQueuedConnection: " | - | ||||||||||||||||||
2171 | "Sender is %s(%p), receiver is %s(%p)", | - | ||||||||||||||||||
2172 | sender->metaObject()->className(), sender, | - | ||||||||||||||||||
2173 | receiver->metaObject()->className(), receiver); | - | ||||||||||||||||||
2174 | } never executed: end of block | 0 | ||||||||||||||||||
2175 | QSemaphore semaphore; | - | ||||||||||||||||||
2176 | QMetaCallEvent *ev = c->isSlotObject
| 641-3801 | ||||||||||||||||||
2177 | new QMetaCallEvent(c->slotObj, sender, signal_index, 0, 0, argv ? argv : empty_argv, &semaphore) : | - | ||||||||||||||||||
2178 | new QMetaCallEvent(c->method_offset, c->method_relative, c->callFunction, sender, signal_index, 0, 0, argv ? argv : empty_argv, &semaphore); | - | ||||||||||||||||||
2179 | QCoreApplication::postEvent(receiver, ev); | - | ||||||||||||||||||
2180 | locker.unlock(); | - | ||||||||||||||||||
2181 | semaphore.acquire(); | - | ||||||||||||||||||
2182 | locker.relock(); | - | ||||||||||||||||||
2183 | continue; executed 4442 times by 315 tests: continue; Executed by:
| 4442 | ||||||||||||||||||
2184 | - | |||||||||||||||||||
2185 | } | - | ||||||||||||||||||
2186 | - | |||||||||||||||||||
2187 | QConnectionSenderSwitcher sw; | - | ||||||||||||||||||
2188 | - | |||||||||||||||||||
2189 | if (receiverInSameThread
| 507-8336255 | ||||||||||||||||||
2190 | sw.switchSender(receiver, sender, signal_index); | - | ||||||||||||||||||
2191 | } executed 8336255 times by 381 tests: end of block Executed by:
| 8336255 | ||||||||||||||||||
2192 | const QObjectPrivate::StaticMetaCallFunction callFunction = c->callFunction; | 28931-8307831 | ||||||||||||||||||
const int method_relative = c->method_relative;if (c->isSlotObject
| ||||||||||||||||||||
2193 | c->slotObj->ref(); | - | ||||||||||||||||||
2194 | QScopedPointer<QtPrivate::QSlotObjectBase, QSlotObjectBaseDeleter> obj(c->slotObj); | - | ||||||||||||||||||
2195 | locker.unlock(); | - | ||||||||||||||||||
2196 | obj->call(receiver, argv ? argv : empty_argv); | - | ||||||||||||||||||
2197 | - | |||||||||||||||||||
2198 | - | |||||||||||||||||||
2199 | - | |||||||||||||||||||
2200 | - | |||||||||||||||||||
2201 | obj.reset(); | - | ||||||||||||||||||
2202 | - | |||||||||||||||||||
2203 | locker.relock(); | - | ||||||||||||||||||
2204 | } executed 28929 times by 301 tests: else if (c->end of block Executed by:
| 3325-8293985 | ||||||||||||||||||
2205 | - | |||||||||||||||||||
2206 | locker.unlock();const int methodIndex = c->method(); | - | ||||||||||||||||||
2207 | const int method_relative = c->method_relative; | - | ||||||||||||||||||
2208 | const auto callFunction = c->callFunction; | - | ||||||||||||||||||
2209 | locker.unlock(); | - | ||||||||||||||||||
2210 | if (qt_signal_spy_callback_set.slot_begin_callback != 0
| 0-8290660 | ||||||||||||||||||
2211 | qt_signal_spy_callback_set.slot_begin_callback(receiver, methodIndex, argv ? argv : empty_argv); never executed: qt_signal_spy_callback_set.slot_begin_callback(receiver, methodIndex, argv ? argv : empty_argv); | 0 | ||||||||||||||||||
2212 | - | |||||||||||||||||||
2213 | callFunction(receiver, QMetaObject::InvokeMetaMethod, method_relative, argv ? argv : empty_argv); | - | ||||||||||||||||||
2214 | - | |||||||||||||||||||
2215 | if (qt_signal_spy_callback_set.slot_end_callback != 0
| 0-8290657 | ||||||||||||||||||
2216 | qt_signal_spy_callback_set.slot_end_callback(receiver, methodIndex); never executed: qt_signal_spy_callback_set.slot_end_callback(receiver, methodIndex); | 0 | ||||||||||||||||||
2217 | locker.relock(); | - | ||||||||||||||||||
2218 | } executed 8290657 times by 229 tests: else {end of block Executed by:
| 8290657 | ||||||||||||||||||
2219 | const int method = c->method_relative + c->method_offset; | - | ||||||||||||||||||
2220 | locker.unlock(); | - | ||||||||||||||||||
2221 | - | |||||||||||||||||||
2222 | if (qt_signal_spy_callback_set.slot_begin_callback != 0
| 0-17171 | ||||||||||||||||||
2223 | qt_signal_spy_callback_set.slot_begin_callback(receiver, | - | ||||||||||||||||||
2224 | method, | - | ||||||||||||||||||
2225 | argv ? argv : empty_argv); | - | ||||||||||||||||||
2226 | } never executed: end of block | 0 | ||||||||||||||||||
2227 | - | |||||||||||||||||||
2228 | metacall(receiver, QMetaObject::InvokeMetaMethod, method, argv ? argv : empty_argv); | - | ||||||||||||||||||
2229 | - | |||||||||||||||||||
2230 | if (qt_signal_spy_callback_set.slot_end_callback != 0
| 0-17171 | ||||||||||||||||||
2231 | qt_signal_spy_callback_set.slot_end_callback(receiver, method); never executed: qt_signal_spy_callback_set.slot_end_callback(receiver, method); | 0 | ||||||||||||||||||
2232 | - | |||||||||||||||||||
2233 | locker.relock(); | - | ||||||||||||||||||
2234 | } executed 17171 times by 148 tests: end of block Executed by:
| 17171 | ||||||||||||||||||
2235 | - | |||||||||||||||||||
2236 | if (connectionLists->orphaned
| 252-8336505 | ||||||||||||||||||
2237 | break; executed 252 times by 15 tests: break; Executed by:
| 252 | ||||||||||||||||||
2238 | } executed 8336505 times by 381 tests: while (c != lastend of block Executed by:
| 0-8336505 | ||||||||||||||||||
2239 | - | |||||||||||||||||||
2240 | if (connectionLists->orphaned
| 253-7734463 | ||||||||||||||||||
2241 | break; executed 253 times by 15 tests: break; Executed by:
| 253 | ||||||||||||||||||
2242 | } executed 7734463 times by 507 tests: while (list != &connectionLists->allsignalsend of block Executed by:
| 7734166-7734572 | ||||||||||||||||||
2243 | - | |||||||||||||||||||
2244 | ((list = &connectionLists->allsignals), true)); | - | ||||||||||||||||||
2245 | - | |||||||||||||||||||
2246 | } | - | ||||||||||||||||||
2247 | - | |||||||||||||||||||
2248 | if (qt_signal_spy_callback_set.signal_end_callback != 0
| 0-7734825 | ||||||||||||||||||
2249 | qt_signal_spy_callback_set.signal_end_callback(sender, signal_index); never executed: qt_signal_spy_callback_set.signal_end_callback(sender, signal_index); | 0 | ||||||||||||||||||
2250 | - | |||||||||||||||||||
2251 | } executed 7734825 times by 507 tests: end of block Executed by:
| 7734825 | ||||||||||||||||||
2252 | - | |||||||||||||||||||
2253 | - | |||||||||||||||||||
2254 | - | |||||||||||||||||||
2255 | - | |||||||||||||||||||
2256 | - | |||||||||||||||||||
2257 | void QMetaObject::activate(QObject *sender, int signal_index, void **argv) | - | ||||||||||||||||||
2258 | { | - | ||||||||||||||||||
2259 | const QMetaObject *mo = sender->metaObject(); | - | ||||||||||||||||||
2260 | while (mo->methodOffset() > signal_index) | - | ||||||||||||||||||
2261 | mo = mo->superClass(); | - | ||||||||||||||||||
2262 | activate(sender, mo, signal_index - mo->methodOffset(), argv); | - | ||||||||||||||||||
2263 | } | - | ||||||||||||||||||
2264 | int QObjectPrivate::signalIndex(const char *signalName, | - | ||||||||||||||||||
2265 | const QMetaObject **meta) const | - | ||||||||||||||||||
2266 | { | - | ||||||||||||||||||
2267 | const QObject * const q = q_func(); | - | ||||||||||||||||||
2268 | const QMetaObject *base = q->metaObject(); | - | ||||||||||||||||||
2269 | ((!(QMetaObjectPrivate::get(base)->revision >= 7)) ? qt_assert("QMetaObjectPrivate::get(base)->revision >= 7",__FILE__,37963806) : qt_noop()); | - | ||||||||||||||||||
2270 | QArgumentTypeArray types; | - | ||||||||||||||||||
2271 | QByteArray name = QMetaObjectPrivate::decodeMethodSignature(signalName, types); | - | ||||||||||||||||||
2272 | int relative_index = QMetaObjectPrivate::indexOfSignalRelative( | - | ||||||||||||||||||
2273 | &base, name, types.size(), types.constData()); | - | ||||||||||||||||||
2274 | if (relative_index < 0) | - | ||||||||||||||||||
2275 | return relative_index; | - | ||||||||||||||||||
2276 | relative_index = QMetaObjectPrivate::originalClone(base, relative_index); | - | ||||||||||||||||||
2277 | if (meta) | - | ||||||||||||||||||
2278 | *meta = base; | - | ||||||||||||||||||
2279 | return relative_index + QMetaObjectPrivate::signalOffset(base); | - | ||||||||||||||||||
2280 | } | - | ||||||||||||||||||
2281 | bool QObject::setProperty(const char *name, const QVariant &value) | - | ||||||||||||||||||
2282 | { | - | ||||||||||||||||||
2283 | QObjectPrivate * const d = d_func(); | - | ||||||||||||||||||
2284 | const QMetaObject* meta = metaObject(); | - | ||||||||||||||||||
2285 | if (!name || !meta) | - | ||||||||||||||||||
2286 | return false; | - | ||||||||||||||||||
2287 | - | |||||||||||||||||||
2288 | int id = meta->indexOfProperty(name); | - | ||||||||||||||||||
2289 | if (id < 0) { | - | ||||||||||||||||||
2290 | if (!d->extraData) | - | ||||||||||||||||||
2291 | d->extraData = new QObjectPrivate::ExtraData; | - | ||||||||||||||||||
2292 | - | |||||||||||||||||||
2293 | const int idx = d->extraData->propertyNames.indexOf(name); | - | ||||||||||||||||||
2294 | - | |||||||||||||||||||
2295 | if (!value.isValid()) { | - | ||||||||||||||||||
2296 | if (idx == -1) | - | ||||||||||||||||||
2297 | return false; | - | ||||||||||||||||||
2298 | d->extraData->propertyNames.removeAt(idx); | - | ||||||||||||||||||
2299 | d->extraData->propertyValues.removeAt(idx); | - | ||||||||||||||||||
2300 | } else { | - | ||||||||||||||||||
2301 | if (idx == -1) { | - | ||||||||||||||||||
2302 | d->extraData->propertyNames.append(name); | - | ||||||||||||||||||
2303 | d->extraData->propertyValues.append(value); | - | ||||||||||||||||||
2304 | } else { | - | ||||||||||||||||||
2305 | if (value == d->extraData->propertyValues.at(idx)) | - | ||||||||||||||||||
2306 | return false; | - | ||||||||||||||||||
2307 | d->extraData->propertyValues[idx] = value; | - | ||||||||||||||||||
2308 | } | - | ||||||||||||||||||
2309 | } | - | ||||||||||||||||||
2310 | - | |||||||||||||||||||
2311 | QDynamicPropertyChangeEvent ev(name); | - | ||||||||||||||||||
2312 | QCoreApplication::sendEvent(this, &ev); | - | ||||||||||||||||||
2313 | - | |||||||||||||||||||
2314 | return false; | - | ||||||||||||||||||
2315 | } | - | ||||||||||||||||||
2316 | QMetaProperty p = meta->property(id); | - | ||||||||||||||||||
2317 | - | |||||||||||||||||||
2318 | if (!p.isWritable()) | - | ||||||||||||||||||
2319 | QMessageLogger(__FILE__, 38743884, __PRETTY_FUNCTION__).warning("%s::setProperty: Property \"%s\" invalid," | - | ||||||||||||||||||
2320 | " read-only or does not exist", metaObject()->className(), name); | - | ||||||||||||||||||
2321 | - | |||||||||||||||||||
2322 | return p.write(this, value); | - | ||||||||||||||||||
2323 | } | - | ||||||||||||||||||
2324 | QVariant QObject::property(const char *name) const | - | ||||||||||||||||||
2325 | { | - | ||||||||||||||||||
2326 | const QObjectPrivate * const d = d_func(); | - | ||||||||||||||||||
2327 | const QMetaObject* meta = metaObject(); | - | ||||||||||||||||||
2328 | if (!name || !meta) | - | ||||||||||||||||||
2329 | return QVariant(); | - | ||||||||||||||||||
2330 | - | |||||||||||||||||||
2331 | int id = meta->indexOfProperty(name); | - | ||||||||||||||||||
2332 | if (id < 0) { | - | ||||||||||||||||||
2333 | if (!d->extraData) | - | ||||||||||||||||||
2334 | return QVariant(); | - | ||||||||||||||||||
2335 | const int i = d->extraData->propertyNames.indexOf(name); | - | ||||||||||||||||||
2336 | return d->extraData->propertyValues.value(i); | - | ||||||||||||||||||
2337 | } | - | ||||||||||||||||||
2338 | QMetaProperty p = meta->property(id); | - | ||||||||||||||||||
2339 | - | |||||||||||||||||||
2340 | if (!p.isReadable()) | - | ||||||||||||||||||
2341 | QMessageLogger(__FILE__, 39073917, __PRETTY_FUNCTION__).warning("%s::property: Property \"%s\" invalid or does not exist", | - | ||||||||||||||||||
2342 | metaObject()->className(), name); | - | ||||||||||||||||||
2343 | - | |||||||||||||||||||
2344 | return p.read(this); | - | ||||||||||||||||||
2345 | } | - | ||||||||||||||||||
2346 | - | |||||||||||||||||||
2347 | - | |||||||||||||||||||
2348 | - | |||||||||||||||||||
2349 | - | |||||||||||||||||||
2350 | - | |||||||||||||||||||
2351 | - | |||||||||||||||||||
2352 | - | |||||||||||||||||||
2353 | QList<QByteArray> QObject::dynamicPropertyNames() const | - | ||||||||||||||||||
2354 | { | - | ||||||||||||||||||
2355 | const QObjectPrivate * const d = d_func(); | - | ||||||||||||||||||
2356 | if (d->extraData) | - | ||||||||||||||||||
2357 | return d->extraData->propertyNames; | - | ||||||||||||||||||
2358 | return QList<QByteArray>(); | - | ||||||||||||||||||
2359 | } | - | ||||||||||||||||||
2360 | static void dumpRecursive(int level, QObject *object) | - | ||||||||||||||||||
2361 | { | - | ||||||||||||||||||
2362 | - | |||||||||||||||||||
2363 | if (object) { | - | ||||||||||||||||||
2364 | QByteArray buf; | - | ||||||||||||||||||
2365 | buf.fill(' ', level / 2 * 8); | - | ||||||||||||||||||
2366 | if (level % 2) | - | ||||||||||||||||||
2367 | buf += " "; | - | ||||||||||||||||||
2368 | QString name = object->objectName(); | - | ||||||||||||||||||
2369 | QString flags = QLatin1String(""); | - | ||||||||||||||||||
2370 | QMessageLogger(__FILE__, 39573967, __PRETTY_FUNCTION__).debug("%s%s::%s %s", (const char*)buf, object->metaObject()->className(), name.toLocal8Bit().data(), | - | ||||||||||||||||||
2371 | flags.toLatin1().data()); | - | ||||||||||||||||||
2372 | QObjectList children = object->children(); | - | ||||||||||||||||||
2373 | if (!children.isEmpty()) { | - | ||||||||||||||||||
2374 | for (int i = 0; i < children.size(); ++i) | - | ||||||||||||||||||
2375 | dumpRecursive(level+1, children.at(i)); | - | ||||||||||||||||||
2376 | } | - | ||||||||||||||||||
2377 | } | - | ||||||||||||||||||
2378 | - | |||||||||||||||||||
2379 | - | |||||||||||||||||||
2380 | - | |||||||||||||||||||
2381 | - | |||||||||||||||||||
2382 | } | - | ||||||||||||||||||
2383 | void QObject::dumpObjectTree() | - | ||||||||||||||||||
2384 | { | - | ||||||||||||||||||
2385 | dumpRecursive(0, this); | - | ||||||||||||||||||
2386 | } | - | ||||||||||||||||||
2387 | void QObject::dumpObjectInfo() | - | ||||||||||||||||||
2388 | { | - | ||||||||||||||||||
2389 | - | |||||||||||||||||||
2390 | QMessageLogger(__FILE__, 40004010, __PRETTY_FUNCTION__).debug("OBJECT %s::%s", metaObject()->className(), | - | ||||||||||||||||||
2391 | objectName().isEmpty() ? "unnamed" : objectName().toLocal8Bit().data()); | - | ||||||||||||||||||
2392 | - | |||||||||||||||||||
2393 | QObjectPrivate * const d = d_func(); | - | ||||||||||||||||||
2394 | QMutexLocker locker(signalSlotLock(this)); | - | ||||||||||||||||||
2395 | - | |||||||||||||||||||
2396 | - | |||||||||||||||||||
2397 | QMessageLogger(__FILE__, 40074017, __PRETTY_FUNCTION__).debug(" SIGNALS OUT"); | - | ||||||||||||||||||
2398 | - | |||||||||||||||||||
2399 | if (d->connectionLists) { | - | ||||||||||||||||||
2400 | for (int signal_index = 0; signal_index < d->connectionLists->count(); ++signal_index) { | - | ||||||||||||||||||
2401 | const QMetaMethod signal = QMetaObjectPrivate::signal(metaObject(), signal_index); | - | ||||||||||||||||||
2402 | QMessageLogger(__FILE__, 40124022, __PRETTY_FUNCTION__).debug(" signal: %s", signal.methodSignature().constData()); | - | ||||||||||||||||||
2403 | - | |||||||||||||||||||
2404 | - | |||||||||||||||||||
2405 | const QObjectPrivate::Connection *c = | - | ||||||||||||||||||
2406 | d->connectionLists->at(signal_index).first; | - | ||||||||||||||||||
2407 | while (c) { | - | ||||||||||||||||||
2408 | if (!c->receiver) { | - | ||||||||||||||||||
2409 | QMessageLogger(__FILE__, 40194029, __PRETTY_FUNCTION__).debug(" <Disconnected receiver>"); | - | ||||||||||||||||||
2410 | c = c->nextConnectionList; | - | ||||||||||||||||||
2411 | continue; | - | ||||||||||||||||||
2412 | } | - | ||||||||||||||||||
2413 | if (c->isSlotObject) { | - | ||||||||||||||||||
2414 | QMessageLogger(__FILE__, 40244034, __PRETTY_FUNCTION__).debug(" <functor or function pointer>"); | - | ||||||||||||||||||
2415 | c = c->nextConnectionList; | - | ||||||||||||||||||
2416 | continue; | - | ||||||||||||||||||
2417 | } | - | ||||||||||||||||||
2418 | const QMetaObject *receiverMetaObject = c->receiver->metaObject(); | - | ||||||||||||||||||
2419 | const QMetaMethod method = receiverMetaObject->method(c->method()); | - | ||||||||||||||||||
2420 | QMessageLogger(__FILE__, 40304040, __PRETTY_FUNCTION__).debug(" --> %s::%s %s", | - | ||||||||||||||||||
2421 | receiverMetaObject->className(), | - | ||||||||||||||||||
2422 | c->receiver->objectName().isEmpty() ? "unnamed" : QString(c->receiver->objectName()).toLocal8Bit().constData(), | - | ||||||||||||||||||
2423 | method.methodSignature().constData()); | - | ||||||||||||||||||
2424 | c = c->nextConnectionList; | - | ||||||||||||||||||
2425 | } | - | ||||||||||||||||||
2426 | } | - | ||||||||||||||||||
2427 | } else { | - | ||||||||||||||||||
2428 | QMessageLogger(__FILE__, 40384048, __PRETTY_FUNCTION__).debug( " <None>" ); | - | ||||||||||||||||||
2429 | } | - | ||||||||||||||||||
2430 | - | |||||||||||||||||||
2431 | - | |||||||||||||||||||
2432 | QMessageLogger(__FILE__, 40424052, __PRETTY_FUNCTION__).debug(" SIGNALS IN"); | - | ||||||||||||||||||
2433 | - | |||||||||||||||||||
2434 | if (d->senders) { | - | ||||||||||||||||||
2435 | for (QObjectPrivate::Connection *s = d->senders; s; s = s->next) { | - | ||||||||||||||||||
2436 | QByteArray slotName = ([]() -> QByteArray { enum { Size = sizeof("<unknown>") - 1 }; static const QStaticByteArrayData<Size> qbytearray_literal = { { { { -1 } }, Size, 0, 0, sizeof(QByteArrayData) }, "<unknown>" }; QByteArrayDataPtr holder = { qbytearray_literal.data_ptr() }; const QByteArray ba(holder); return ba; }()); | - | ||||||||||||||||||
2437 | if (!s->isSlotObject) { | - | ||||||||||||||||||
2438 | const QMetaMethod slot = metaObject()->method(s->method()); | - | ||||||||||||||||||
2439 | slotName = slot.methodSignature(); | - | ||||||||||||||||||
2440 | } | - | ||||||||||||||||||
2441 | QMessageLogger(__FILE__, 40514061, __PRETTY_FUNCTION__).debug(" <-- %s::%s %s", | - | ||||||||||||||||||
2442 | s->sender->metaObject()->className(), | - | ||||||||||||||||||
2443 | s->sender->objectName().isEmpty() ? "unnamed" : QString(s->sender->objectName()).toLocal8Bit().constData(), | - | ||||||||||||||||||
2444 | slotName.constData()); | - | ||||||||||||||||||
2445 | } | - | ||||||||||||||||||
2446 | } else { | - | ||||||||||||||||||
2447 | QMessageLogger(__FILE__, 40574067, __PRETTY_FUNCTION__).debug(" <None>"); | - | ||||||||||||||||||
2448 | } | - | ||||||||||||||||||
2449 | - | |||||||||||||||||||
2450 | } | - | ||||||||||||||||||
2451 | - | |||||||||||||||||||
2452 | - | |||||||||||||||||||
2453 | - | |||||||||||||||||||
2454 | - | |||||||||||||||||||
2455 | - | |||||||||||||||||||
2456 | uint QObject::registerUserData() | - | ||||||||||||||||||
2457 | { | - | ||||||||||||||||||
2458 | static int user_data_registration = 0; | - | ||||||||||||||||||
2459 | return user_data_registration++; | - | ||||||||||||||||||
2460 | } | - | ||||||||||||||||||
2461 | - | |||||||||||||||||||
2462 | - | |||||||||||||||||||
2463 | - | |||||||||||||||||||
2464 | - | |||||||||||||||||||
2465 | QObjectUserData::~QObjectUserData() | - | ||||||||||||||||||
2466 | { | - | ||||||||||||||||||
2467 | } | - | ||||||||||||||||||
2468 | - | |||||||||||||||||||
2469 | - | |||||||||||||||||||
2470 | - | |||||||||||||||||||
2471 | - | |||||||||||||||||||
2472 | void QObject::setUserData(uint id, QObjectUserData* data) | - | ||||||||||||||||||
2473 | { | - | ||||||||||||||||||
2474 | QObjectPrivate * const d = d_func(); | - | ||||||||||||||||||
2475 | if (!d->extraData) | - | ||||||||||||||||||
2476 | d->extraData = new QObjectPrivate::ExtraData; | - | ||||||||||||||||||
2477 | - | |||||||||||||||||||
2478 | if (d->extraData->userData.size() <= (int) id) | - | ||||||||||||||||||
2479 | d->extraData->userData.resize((int) id + 1); | - | ||||||||||||||||||
2480 | d->extraData->userData[id] = data; | - | ||||||||||||||||||
2481 | } | - | ||||||||||||||||||
2482 | - | |||||||||||||||||||
2483 | - | |||||||||||||||||||
2484 | - | |||||||||||||||||||
2485 | - | |||||||||||||||||||
2486 | QObjectUserData* QObject::userData(uint id) const | - | ||||||||||||||||||
2487 | { | - | ||||||||||||||||||
2488 | const QObjectPrivate * const d = d_func(); | - | ||||||||||||||||||
2489 | if (!d->extraData) | - | ||||||||||||||||||
2490 | return 0; | - | ||||||||||||||||||
2491 | if ((int)id < d->extraData->userData.size()) | - | ||||||||||||||||||
2492 | return d->extraData->userData.at(id); | - | ||||||||||||||||||
2493 | return 0; | - | ||||||||||||||||||
2494 | } | - | ||||||||||||||||||
2495 | - | |||||||||||||||||||
2496 | - | |||||||||||||||||||
2497 | - | |||||||||||||||||||
2498 | - | |||||||||||||||||||
2499 | - | |||||||||||||||||||
2500 | QDebug operator<<(QDebug dbg, const QObject *o) | - | ||||||||||||||||||
2501 | { | - | ||||||||||||||||||
2502 | QDebugStateSaver saver(dbg); | - | ||||||||||||||||||
2503 | if (!o) | - | ||||||||||||||||||
2504 | return dbg << "QObject(0x0)"; | - | ||||||||||||||||||
2505 | dbg.nospace() << o->metaObject()->className() << '(' << (const void *)o; | - | ||||||||||||||||||
2506 | if (!o->objectName().isEmpty()) | - | ||||||||||||||||||
2507 | dbg << ", name = " << o->objectName(); | - | ||||||||||||||||||
2508 | dbg << ')'; | - | ||||||||||||||||||
2509 | return dbg; | - | ||||||||||||||||||
2510 | } | - | ||||||||||||||||||
2511 | void qDeleteInEventHandler(QObject *o) | - | ||||||||||||||||||
2512 | { | - | ||||||||||||||||||
2513 | delete o; | - | ||||||||||||||||||
2514 | } | - | ||||||||||||||||||
2515 | QMetaObject::Connection QObject::connectImpl(const QObject *sender, void **signal, | - | ||||||||||||||||||
2516 | const QObject *receiver, void **slot, | - | ||||||||||||||||||
2517 | QtPrivate::QSlotObjectBase *slotObj, Qt::ConnectionType type, | - | ||||||||||||||||||
2518 | const int *types, const QMetaObject *senderMetaObject) | - | ||||||||||||||||||
2519 | { | - | ||||||||||||||||||
2520 | if (!signal) { | - | ||||||||||||||||||
2521 | QMessageLogger(__FILE__, 46394655, __PRETTY_FUNCTION__).warning("QObject::connect: invalid null parameter"); | - | ||||||||||||||||||
2522 | if (slotObj) | - | ||||||||||||||||||
2523 | slotObj->destroyIfLastRef(); | - | ||||||||||||||||||
2524 | return QMetaObject::Connection(); | - | ||||||||||||||||||
2525 | } | - | ||||||||||||||||||
2526 | - | |||||||||||||||||||
2527 | int signal_index = -1; | - | ||||||||||||||||||
2528 | void *args[] = { &signal_index, signal }; | - | ||||||||||||||||||
2529 | for (; senderMetaObject && signal_index < 0; senderMetaObject = senderMetaObject->superClass()) { | - | ||||||||||||||||||
2530 | senderMetaObject->static_metacall(QMetaObject::IndexOfMethod, 0, args); | - | ||||||||||||||||||
2531 | if (signal_index >= 0 && signal_index < QMetaObjectPrivate::get(senderMetaObject)->signalCount) | - | ||||||||||||||||||
2532 | break; | - | ||||||||||||||||||
2533 | } | - | ||||||||||||||||||
2534 | if (!senderMetaObject) { | - | ||||||||||||||||||
2535 | QMessageLogger(__FILE__, 46534669, __PRETTY_FUNCTION__).warning("QObject::connect: signal not found in %s", sender->metaObject()->className()); | - | ||||||||||||||||||
2536 | slotObj->destroyIfLastRef(); | - | ||||||||||||||||||
2537 | return QMetaObject::Connection(0); | - | ||||||||||||||||||
2538 | } | - | ||||||||||||||||||
2539 | signal_index += QMetaObjectPrivate::signalOffset(senderMetaObject); | - | ||||||||||||||||||
2540 | return QObjectPrivate::connectImpl(sender, signal_index, receiver, slot, slotObj, type, types, senderMetaObject); | - | ||||||||||||||||||
2541 | } | - | ||||||||||||||||||
2542 | QMetaObject::Connection QObjectPrivate::connectImpl(const QObject *sender, int signal_index, | - | ||||||||||||||||||
2543 | const QObject *receiver, void **slot, | - | ||||||||||||||||||
2544 | QtPrivate::QSlotObjectBase *slotObj, Qt::ConnectionType type, | - | ||||||||||||||||||
2545 | const int *types, const QMetaObject *senderMetaObject) | - | ||||||||||||||||||
2546 | { | - | ||||||||||||||||||
2547 | if (!sender || !slotObj || !senderMetaObject) { | - | ||||||||||||||||||
2548 | QMessageLogger(__FILE__, 46744690, __PRETTY_FUNCTION__).warning("QObject::connect: invalid null parameter"); | - | ||||||||||||||||||
2549 | if (slotObj) | - | ||||||||||||||||||
2550 | slotObj->destroyIfLastRef(); | - | ||||||||||||||||||
2551 | return QMetaObject::Connection(); | - | ||||||||||||||||||
2552 | } | - | ||||||||||||||||||
2553 | - | |||||||||||||||||||
2554 | QObject *s = const_cast<QObject *>(sender); | - | ||||||||||||||||||
2555 | QObject *r = const_cast<QObject *>(receiver); | - | ||||||||||||||||||
2556 | - | |||||||||||||||||||
2557 | QOrderedMutexLocker locker(signalSlotLock(sender), | - | ||||||||||||||||||
2558 | signalSlotLock(receiver)); | - | ||||||||||||||||||
2559 | - | |||||||||||||||||||
2560 | if (type & Qt::UniqueConnection && slot) { | - | ||||||||||||||||||
2561 | QObjectConnectionListVector *connectionLists = QObjectPrivate::get(s)->connectionLists; | - | ||||||||||||||||||
2562 | if (connectionLists && connectionLists->count() > signal_index) { | - | ||||||||||||||||||
2563 | const QObjectPrivate::Connection *c2 = | - | ||||||||||||||||||
2564 | (*connectionLists)[signal_index].first; | - | ||||||||||||||||||
2565 | - | |||||||||||||||||||
2566 | while (c2) { | - | ||||||||||||||||||
2567 | if (c2->receiver == receiver && c2->isSlotObject && c2->slotObj->compare(slot)) { | - | ||||||||||||||||||
2568 | slotObj->destroyIfLastRef(); | - | ||||||||||||||||||
2569 | return QMetaObject::Connection(); | - | ||||||||||||||||||
2570 | } | - | ||||||||||||||||||
2571 | c2 = c2->nextConnectionList; | - | ||||||||||||||||||
2572 | } | - | ||||||||||||||||||
2573 | } | - | ||||||||||||||||||
2574 | type = static_cast<Qt::ConnectionType>(type ^ Qt::UniqueConnection); | - | ||||||||||||||||||
2575 | } | - | ||||||||||||||||||
2576 | - | |||||||||||||||||||
2577 | QScopedPointer<QObjectPrivate::Connection> c(new QObjectPrivate::Connection); | - | ||||||||||||||||||
2578 | c->sender = s; | - | ||||||||||||||||||
2579 | c->signal_index = signal_index; | - | ||||||||||||||||||
2580 | c->receiver = r; | - | ||||||||||||||||||
2581 | c->slotObj = slotObj; | - | ||||||||||||||||||
2582 | c->connectionType = type; | - | ||||||||||||||||||
2583 | c->isSlotObject = true; | - | ||||||||||||||||||
2584 | if (types) { | - | ||||||||||||||||||
2585 | c->argumentTypes.store(types); | - | ||||||||||||||||||
2586 | c->ownArgumentTypes = false; | - | ||||||||||||||||||
2587 | } | - | ||||||||||||||||||
2588 | - | |||||||||||||||||||
2589 | QObjectPrivate::get(s)->addConnection(signal_index, c.data()); | - | ||||||||||||||||||
2590 | QMetaObject::Connection ret(c.take()); | - | ||||||||||||||||||
2591 | locker.unlock(); | - | ||||||||||||||||||
2592 | - | |||||||||||||||||||
2593 | QMetaMethod method = QMetaObjectPrivate::signal(senderMetaObject, signal_index); | - | ||||||||||||||||||
2594 | ((!(method.isValid())) ? qt_assert("method.isValid()",__FILE__,47204736) : qt_noop()); | - | ||||||||||||||||||
2595 | s->connectNotify(method); | - | ||||||||||||||||||
2596 | - | |||||||||||||||||||
2597 | return ret; | - | ||||||||||||||||||
2598 | } | - | ||||||||||||||||||
2599 | bool QObject::disconnect(const QMetaObject::Connection &connection) | - | ||||||||||||||||||
2600 | { | - | ||||||||||||||||||
2601 | QObjectPrivate::Connection *c = static_cast<QObjectPrivate::Connection *>(connection.d_ptr); | - | ||||||||||||||||||
2602 | - | |||||||||||||||||||
2603 | if (!c
| 1-11 | ||||||||||||||||||
2604 | return executed 4 times by 1 test: false;return false; Executed by:
executed 4 times by 1 test: return false; Executed by:
| 4 | ||||||||||||||||||
2605 | - | |||||||||||||||||||
2606 | QMutex *senderMutex = signalSlotLock(c->sender); | - | ||||||||||||||||||
2607 | QMutex *receiverMutex = signalSlotLock(c->receiver); | - | ||||||||||||||||||
2608 | - | |||||||||||||||||||
2609 | { | - | ||||||||||||||||||
2610 | QOrderedMutexLocker locker(senderMutex, receiverMutex); | - | ||||||||||||||||||
2611 | - | |||||||||||||||||||
2612 | QObjectConnectionListVector *connectionLists = QObjectPrivate::get(c->sender)->connectionLists; | - | ||||||||||||||||||
2613 | ((!(connectionLists)) ? qt_assert("connectionLists",__FILE__,47484764) : qt_noop()); | - | ||||||||||||||||||
2614 | connectionLists->dirty = true; | - | ||||||||||||||||||
2615 | - | |||||||||||||||||||
2616 | *c->prev = c->next; | - | ||||||||||||||||||
2617 | if (c->next
| 1-9 | ||||||||||||||||||
2618 | c->next->prev = c->prev; executed 1 time by 1 test: c->next->prev = c->prev; Executed by:
| 1 | ||||||||||||||||||
2619 | c->receiver = 0; | - | ||||||||||||||||||
2620 | } | - | ||||||||||||||||||
2621 | - | |||||||||||||||||||
2622 | - | |||||||||||||||||||
2623 | if (c->isSlotObject
| 0-10 | ||||||||||||||||||
2624 | c->slotObj->destroyIfLastRef(); | - | ||||||||||||||||||
2625 | c->isSlotObject = false; | - | ||||||||||||||||||
2626 | } executed 10 times by 1 test: end of block Executed by:
| 10 | ||||||||||||||||||
2627 | - | |||||||||||||||||||
2628 | c->sender->disconnectNotify(QMetaObjectPrivate::signal(c->sender->metaObject(), | - | ||||||||||||||||||
c->signal_index));const_cast<QMetaObject::Connection &>(connection).d_ptr = 0; | ||||||||||||||||||||
2629 | c->deref(); | - | ||||||||||||||||||
2630 | - | |||||||||||||||||||
2631 | - | |||||||||||||||||||
2632 | - | |||||||||||||||||||
2633 | return executed 10 times by 1 test: true;return true; Executed by:
executed 10 times by 1 test: return true; Executed by:
| 10 | ||||||||||||||||||
2634 | } | - | ||||||||||||||||||
2635 | bool QObject::disconnectImpl(const QObject *sender, void **signal, const QObject *receiver, void **slot, const QMetaObject *senderMetaObject) | - | ||||||||||||||||||
2636 | { | - | ||||||||||||||||||
2637 | if (sender == 0 || (receiver == 0 && slot != 0)) { | - | ||||||||||||||||||
2638 | QMessageLogger(__FILE__, 48354850, __PRETTY_FUNCTION__).warning("QObject::disconnect: Unexpected null parameter"); | - | ||||||||||||||||||
2639 | return false; | - | ||||||||||||||||||
2640 | } | - | ||||||||||||||||||
2641 | - | |||||||||||||||||||
2642 | int signal_index = -1; | - | ||||||||||||||||||
2643 | if (signal) { | - | ||||||||||||||||||
2644 | void *args[] = { &signal_index, signal }; | - | ||||||||||||||||||
2645 | for (; senderMetaObject && signal_index < 0; senderMetaObject = senderMetaObject->superClass()) { | - | ||||||||||||||||||
2646 | senderMetaObject->static_metacall(QMetaObject::IndexOfMethod, 0, args); | - | ||||||||||||||||||
2647 | if (signal_index >= 0 && signal_index < QMetaObjectPrivate::get(senderMetaObject)->signalCount) | - | ||||||||||||||||||
2648 | break; | - | ||||||||||||||||||
2649 | } | - | ||||||||||||||||||
2650 | if (!senderMetaObject) { | - | ||||||||||||||||||
2651 | QMessageLogger(__FILE__, 48484863, __PRETTY_FUNCTION__).warning("QObject::disconnect: signal not found in %s", sender->metaObject()->className()); | - | ||||||||||||||||||
2652 | return QMetaObject::Connection(0); | - | ||||||||||||||||||
2653 | } | - | ||||||||||||||||||
2654 | signal_index += QMetaObjectPrivate::signalOffset(senderMetaObject); | - | ||||||||||||||||||
2655 | } | - | ||||||||||||||||||
2656 | - | |||||||||||||||||||
2657 | return QMetaObjectPrivate::disconnect(sender, signal_index, senderMetaObject, receiver, -1, slot); | - | ||||||||||||||||||
2658 | } | - | ||||||||||||||||||
2659 | - | |||||||||||||||||||
2660 | - | |||||||||||||||||||
2661 | - | |||||||||||||||||||
2662 | - | |||||||||||||||||||
2663 | - | |||||||||||||||||||
2664 | - | |||||||||||||||||||
2665 | - | |||||||||||||||||||
2666 | QMetaObject::Connection QObjectPrivate::connect(const QObject *sender, int signal_index, QtPrivate::QSlotObjectBase *slotObj, Qt::ConnectionType type) | - | ||||||||||||||||||
2667 | { | - | ||||||||||||||||||
2668 | if (!sender) { | - | ||||||||||||||||||
2669 | QMessageLogger(__FILE__, 48664881, __PRETTY_FUNCTION__).warning("QObject::connect: invalid null parameter"); | - | ||||||||||||||||||
2670 | if (slotObj) | - | ||||||||||||||||||
2671 | slotObj->destroyIfLastRef(); | - | ||||||||||||||||||
2672 | return QMetaObject::Connection(); | - | ||||||||||||||||||
2673 | } | - | ||||||||||||||||||
2674 | const QMetaObject *senderMetaObject = sender->metaObject(); | - | ||||||||||||||||||
2675 | signal_index = methodIndexToSignalIndex(&senderMetaObject, signal_index); | - | ||||||||||||||||||
2676 | - | |||||||||||||||||||
2677 | return QObjectPrivate::connectImpl(sender, signal_index, sender, 0, slotObj, type, 0, senderMetaObject); | - | ||||||||||||||||||
2678 | } | - | ||||||||||||||||||
2679 | - | |||||||||||||||||||
2680 | - | |||||||||||||||||||
2681 | - | |||||||||||||||||||
2682 | - | |||||||||||||||||||
2683 | - | |||||||||||||||||||
2684 | - | |||||||||||||||||||
2685 | - | |||||||||||||||||||
2686 | bool QObjectPrivate::disconnect(const QObject *sender, int signal_index, void **slot) | - | ||||||||||||||||||
2687 | { | - | ||||||||||||||||||
2688 | const QMetaObject *senderMetaObject = sender->metaObject(); | - | ||||||||||||||||||
2689 | signal_index = methodIndexToSignalIndex(&senderMetaObject, signal_index); | - | ||||||||||||||||||
2690 | - | |||||||||||||||||||
2691 | return QMetaObjectPrivate::disconnect(sender, signal_index, senderMetaObject, sender, -1, slot); | - | ||||||||||||||||||
2692 | } | - | ||||||||||||||||||
2693 | QMetaObject::Connection::Connection(const QMetaObject::Connection &other) : d_ptr(other.d_ptr) | - | ||||||||||||||||||
2694 | { | - | ||||||||||||||||||
2695 | if (d_ptr) | - | ||||||||||||||||||
2696 | static_cast<QObjectPrivate::Connection *>(d_ptr)->ref(); | - | ||||||||||||||||||
2697 | } | - | ||||||||||||||||||
2698 | - | |||||||||||||||||||
2699 | QMetaObject::Connection& QMetaObject::Connection::operator=(const QMetaObject::Connection& other) | - | ||||||||||||||||||
2700 | { | - | ||||||||||||||||||
2701 | if (other.d_ptr != d_ptr) { | - | ||||||||||||||||||
2702 | if (d_ptr) | - | ||||||||||||||||||
2703 | static_cast<QObjectPrivate::Connection *>(d_ptr)->deref(); | - | ||||||||||||||||||
2704 | d_ptr = other.d_ptr; | - | ||||||||||||||||||
2705 | if (other.d_ptr) | - | ||||||||||||||||||
2706 | static_cast<QObjectPrivate::Connection *>(other.d_ptr)->ref(); | - | ||||||||||||||||||
2707 | } | - | ||||||||||||||||||
2708 | return *this; | - | ||||||||||||||||||
2709 | } | - | ||||||||||||||||||
2710 | - | |||||||||||||||||||
2711 | - | |||||||||||||||||||
2712 | - | |||||||||||||||||||
2713 | - | |||||||||||||||||||
2714 | - | |||||||||||||||||||
2715 | QMetaObject::Connection::Connection() : d_ptr(0) {} | - | ||||||||||||||||||
2716 | - | |||||||||||||||||||
2717 | - | |||||||||||||||||||
2718 | - | |||||||||||||||||||
2719 | - | |||||||||||||||||||
2720 | QMetaObject::Connection::~Connection() | - | ||||||||||||||||||
2721 | { | - | ||||||||||||||||||
2722 | if (d_ptr) | - | ||||||||||||||||||
2723 | static_cast<QObjectPrivate::Connection *>(d_ptr)->deref(); | - | ||||||||||||||||||
2724 | } | - | ||||||||||||||||||
2725 | - | |||||||||||||||||||
2726 | - | |||||||||||||||||||
2727 | bool QMetaObject::Connection::isConnected_helper() const | - | ||||||||||||||||||
2728 | { | - | ||||||||||||||||||
2729 | ((!(d_ptr)) ? qt_assert("d_ptr",__FILE__,49394954) : qt_noop()); | - | ||||||||||||||||||
2730 | QObjectPrivate::Connection *c = static_cast<QObjectPrivate::Connection *>(d_ptr); | - | ||||||||||||||||||
2731 | - | |||||||||||||||||||
2732 | return c->receiver; | - | ||||||||||||||||||
2733 | } | - | ||||||||||||||||||
2734 | - | |||||||||||||||||||
2735 | - | |||||||||||||||||||
Switch to Source code | Preprocessed file |