diff options
Diffstat (limited to 'src/corelib/kernel')
-rw-r--r-- | src/corelib/kernel/qmetaobject.cpp | 10 | ||||
-rw-r--r-- | src/corelib/kernel/qobject.cpp | 16 | ||||
-rw-r--r-- | src/corelib/kernel/qobject_p.h | 6 |
3 files changed, 16 insertions, 16 deletions
diff --git a/src/corelib/kernel/qmetaobject.cpp b/src/corelib/kernel/qmetaobject.cpp index 8d4d4d943f..e584fbba8e 100644 --- a/src/corelib/kernel/qmetaobject.cpp +++ b/src/corelib/kernel/qmetaobject.cpp @@ -2309,24 +2309,24 @@ bool QMetaMethod::invoke(QObject *object, } QScopedPointer<QMetaCallEvent> event(new QMetaCallEvent(idx_offset, idx_relative, callFunction, nullptr, -1, paramCount)); - int *types = event->types(); + QMetaType *types = event->types(); void **args = event->args(); int argIndex = 0; for (int i = 1; i < paramCount; ++i) { - types[i] = QMetaType::fromName(typeNames[i]).id(); - if (types[i] == QMetaType::UnknownType && param[i]) { + types[i] = QMetaType::fromName(typeNames[i]); + if (!types[i].isValid() && param[i]) { // Try to register the type and try again before reporting an error. void *argv[] = { &types[i], &argIndex }; QMetaObject::metacall(object, QMetaObject::RegisterMethodArgumentMetaType, idx_relative + idx_offset, argv); - if (types[i] == -1) { + if (!types[i].isValid()) { qWarning("QMetaMethod::invoke: Unable to handle unregistered datatype '%s'", typeNames[i]); return false; } } - if (types[i] != QMetaType::UnknownType) { + if (types[i].isValid()) { args[i] = QMetaType(types[i]).create(param[i]); ++argIndex; } diff --git a/src/corelib/kernel/qobject.cpp b/src/corelib/kernel/qobject.cpp index a84d501a32..1b8646947e 100644 --- a/src/corelib/kernel/qobject.cpp +++ b/src/corelib/kernel/qobject.cpp @@ -506,7 +506,7 @@ inline void QMetaCallEvent::allocArgs() if (!d.nargs_) return; - constexpr size_t each = sizeof(void*) + sizeof(int); + constexpr size_t each = sizeof(void*) + sizeof(QMetaType); void *const memory = d.nargs_ * each > sizeof(prealloc_) ? calloc(d.nargs_, each) : prealloc_; @@ -588,10 +588,10 @@ QMetaCallEvent::QMetaCallEvent(QtPrivate::QSlotObjectBase *slotO, QMetaCallEvent::~QMetaCallEvent() { if (d.nargs_) { - int *typeIDs = types(); + QMetaType *t = types(); for (int i = 0; i < d.nargs_; ++i) { - if (typeIDs[i] && d.args_[i]) - QMetaType(typeIDs[i]).destroy(d.args_[i]); + if (t[i].isValid() && d.args_[i]) + t[i].destroy(d.args_[i]); } if (reinterpret_cast<void*>(d.args_) != reinterpret_cast<void*>(prealloc_)) free(d.args_); @@ -3644,17 +3644,17 @@ static void queued_activate(QObject *sender, int signal, QObjectPrivate::Connect new QMetaCallEvent(c->method_offset, c->method_relative, c->callFunction, sender, signal, nargs); void **args = ev->args(); - int *types = ev->types(); + QMetaType *types = ev->types(); - types[0] = 0; // return type + types[0] = QMetaType(); // return type args[0] = nullptr; // return value if (nargs > 1) { for (int n = 1; n < nargs; ++n) - types[n] = argumentTypes[n-1]; + types[n] = QMetaType(argumentTypes[n-1]); for (int n = 1; n < nargs; ++n) - args[n] = QMetaType(types[n]).create(argv[n]); + args[n] = types[n].create(argv[n]); } locker.relock(); diff --git a/src/corelib/kernel/qobject_p.h b/src/corelib/kernel/qobject_p.h index 2a5104c3dd..4a60d37191 100644 --- a/src/corelib/kernel/qobject_p.h +++ b/src/corelib/kernel/qobject_p.h @@ -548,8 +548,8 @@ public: inline int id() const { return d.method_offset_ + d.method_relative_; } inline const void * const* args() const { return d.args_; } inline void ** args() { return d.args_; } - inline const int *types() const { return reinterpret_cast<int*>(d.args_ + d.nargs_); } - inline int *types() { return reinterpret_cast<int*>(d.args_ + d.nargs_); } + inline const QMetaType *types() const { return reinterpret_cast<QMetaType *>(d.args_ + d.nargs_); } + inline QMetaType *types() { return reinterpret_cast<QMetaType *>(d.args_ + d.nargs_); } virtual void placeMetaCall(QObject *object) override; @@ -565,7 +565,7 @@ private: ushort method_relative_; } d; // preallocate enough space for three arguments - char prealloc_[3*(sizeof(void*) + sizeof(int))]; + alignas(void *) char prealloc_[3*sizeof(void*) + 3*sizeof(QMetaType)]; }; class QBoolBlocker |