summaryrefslogtreecommitdiffstats
path: root/src/corelib
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib')
-rw-r--r--src/corelib/kernel/qmetaobject.cpp10
-rw-r--r--src/corelib/kernel/qobject.cpp16
-rw-r--r--src/corelib/kernel/qobject_p.h6
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