diff options
author | Olivier Goffart <olivier.goffart@nokia.com> | 2011-04-08 12:55:16 (GMT) |
---|---|---|
committer | Olivier Goffart <olivier.goffart@nokia.com> | 2011-04-08 13:12:34 (GMT) |
commit | dd60cf7ba8afdf5c84f5793c1e1d08ab18303a74 (patch) | |
tree | a0fbb6503aa28868e1ee284ebdb8ab080f3289a2 /src/corelib/kernel/qobject.cpp | |
parent | 51900ce698f7873eeabcd8723e61198a2c8d854d (diff) | |
download | Qt-dd60cf7ba8afdf5c84f5793c1e1d08ab18303a74.zip Qt-dd60cf7ba8afdf5c84f5793c1e1d08ab18303a74.tar.gz Qt-dd60cf7ba8afdf5c84f5793c1e1d08ab18303a74.tar.bz2 |
Use the qt_static_metacall in QueuedConnection
And also in QMetaMethod::invoke
Reviewed-by: brad
Diffstat (limited to 'src/corelib/kernel/qobject.cpp')
-rw-r--r-- | src/corelib/kernel/qobject.cpp | 31 |
1 files changed, 18 insertions, 13 deletions
diff --git a/src/corelib/kernel/qobject.cpp b/src/corelib/kernel/qobject.cpp index 4cbeee2..357cfd3 100644 --- a/src/corelib/kernel/qobject.cpp +++ b/src/corelib/kernel/qobject.cpp @@ -490,10 +490,12 @@ void QObjectPrivate::clearGuards(QObject *object) /*! \internal */ -QMetaCallEvent::QMetaCallEvent(int id, const QObject *sender, int signalId, +QMetaCallEvent::QMetaCallEvent(ushort method_offset, ushort method_relative, QObjectPrivate::StaticMetaCallFunction callFunction, + const QObject *sender, int signalId, int nargs, int *types, void **args, QSemaphore *semaphore) - : QEvent(MetaCall), id_(id), sender_(sender), signalId_(signalId), - nargs_(nargs), types_(types), args_(args), semaphore_(semaphore) + : QEvent(MetaCall), sender_(sender), signalId_(signalId), + nargs_(nargs), types_(types), args_(args), semaphore_(semaphore), + callFunction_(callFunction), method_offset_(method_offset), method_relative_(method_relative) { } /*! \internal @@ -516,9 +518,13 @@ QMetaCallEvent::~QMetaCallEvent() /*! \internal */ -int QMetaCallEvent::placeMetaCall(QObject *object) +void QMetaCallEvent::placeMetaCall(QObject *object) { - return QMetaObject::metacall(object, QMetaObject::InvokeMetaMethod, id_, args_); + if (callFunction_) { + callFunction_(object, QMetaObject::InvokeMetaMethod, method_relative_, args_); + } else { + QMetaObject::metacall(object, QMetaObject::InvokeMetaMethod, method_offset_ + method_relative_, args_); + } } /*! @@ -3445,12 +3451,11 @@ static void queued_activate(QObject *sender, int signal, QObjectPrivate::Connect args[0] = 0; // return value for (int n = 1; n < nargs; ++n) args[n] = QMetaType::construct((types[n] = c->argumentTypes[n-1]), argv[n]); - QCoreApplication::postEvent(c->receiver, new QMetaCallEvent(c->method(), - sender, - signal, - nargs, - types, - args)); + QCoreApplication::postEvent(c->receiver, new QMetaCallEvent(c->method_offset, + c->method_relative, + c->callFunction, + sender, signal, nargs, + types, args)); } @@ -3530,7 +3535,6 @@ void QMetaObject::activate(QObject *sender, const QMetaObject *m, int local_sign continue; #ifndef QT_NO_THREAD } else if (c->connectionType == Qt::BlockingQueuedConnection) { - const int method = c->method(); locker.unlock(); if (receiverInSameThread) { qWarning("Qt: Dead lock detected while activating a BlockingQueuedConnection: " @@ -3539,7 +3543,8 @@ void QMetaObject::activate(QObject *sender, const QMetaObject *m, int local_sign receiver->metaObject()->className(), receiver); } QSemaphore semaphore; - QCoreApplication::postEvent(receiver, new QMetaCallEvent(method, + QCoreApplication::postEvent(receiver, new QMetaCallEvent(c->method_offset, c->method_relative, + c->callFunction, sender, signal_absolute_index, 0, 0, argv ? argv : empty_argv, |