summaryrefslogtreecommitdiffstats
path: root/src/corelib/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib/kernel')
-rw-r--r--src/corelib/kernel/qmetaobject.cpp21
-rw-r--r--src/corelib/kernel/qmetaobject.h1
-rw-r--r--src/corelib/kernel/qobject.cpp31
3 files changed, 38 insertions, 15 deletions
diff --git a/src/corelib/kernel/qmetaobject.cpp b/src/corelib/kernel/qmetaobject.cpp
index e584fbba8e..f0cef22b6f 100644
--- a/src/corelib/kernel/qmetaobject.cpp
+++ b/src/corelib/kernel/qmetaobject.cpp
@@ -207,6 +207,7 @@ public:
inline uint parameterTypeInfo(int index) const;
inline int parameterType(int index) const;
inline void getParameterTypes(int *types) const;
+ inline QByteArray parameterTypeName(int index) const;
inline QList<QByteArray> parameterTypes() const;
inline QList<QByteArray> parameterNames() const;
inline QByteArray tag() const;
@@ -1780,6 +1781,12 @@ void QMetaMethodPrivate::getParameterTypes(int *types) const
}
}
+QByteArray QMetaMethodPrivate::parameterTypeName(int index) const
+{
+ int paramsIndex = parametersDataIndex();
+ return typeNameFromTypeInfo(mobj, mobj->d.data[paramsIndex + index]);
+}
+
QList<QByteArray> QMetaMethodPrivate::parameterTypes() const
{
Q_ASSERT(priv(mobj->d.data)->revision >= 7);
@@ -1961,6 +1968,20 @@ QList<QByteArray> QMetaMethod::parameterTypes() const
}
/*!
+ \since 6.0
+ Returns the name of the type at position \a index
+ If there is no parameter at \a index, returns an empty QByteArray
+
+ \sa parameterNames()
+ */
+QByteArray QMetaMethod::parameterTypeName(int index) const
+{
+ if (!mobj || index < 0 || index >= parameterCount())
+ return {};
+ return QMetaMethodPrivate::get(this)->parameterTypeName(index);
+}
+
+/*!
Returns a list of parameter names.
\sa parameterTypes(), methodSignature()
diff --git a/src/corelib/kernel/qmetaobject.h b/src/corelib/kernel/qmetaobject.h
index d013bfce65..8136e04dc9 100644
--- a/src/corelib/kernel/qmetaobject.h
+++ b/src/corelib/kernel/qmetaobject.h
@@ -63,6 +63,7 @@ public:
QMetaType parameterMetaType(int index) const;
void getParameterTypes(int *types) const;
QList<QByteArray> parameterTypes() const;
+ QByteArray parameterTypeName(int index) const;
QList<QByteArray> parameterNames() const;
const char *tag() const;
enum Access { Private, Protected, Public };
diff --git a/src/corelib/kernel/qobject.cpp b/src/corelib/kernel/qobject.cpp
index 1b8646947e..54229a9f71 100644
--- a/src/corelib/kernel/qobject.cpp
+++ b/src/corelib/kernel/qobject.cpp
@@ -95,28 +95,29 @@ QAbstractDynamicMetaObject::~QAbstractDynamicMetaObject()
{
}
-static int *queuedConnectionTypes(const QList<QByteArray> &typeNames)
+static int *queuedConnectionTypes(const QMetaMethod& method)
{
- int *types = new int [typeNames.count() + 1];
- Q_CHECK_PTR(types);
- for (int i = 0; i < typeNames.count(); ++i) {
- const QByteArray typeName = typeNames.at(i);
- if (typeName.endsWith('*'))
- types[i] = QMetaType::VoidStar;
+ const auto parameterCount = method.parameterCount();
+ int *typeIds = new int [parameterCount + 1];
+ Q_CHECK_PTR(typeIds);
+ for (int i = 0; i < parameterCount; ++i) {
+ const QMetaType metaType = method.parameterMetaType(i);
+ if (metaType.flags() & QMetaType::IsPointer)
+ typeIds[i] = QMetaType::VoidStar;
else
- types[i] = QMetaType::fromName(typeName).id();
-
- if (!types[i]) {
+ typeIds[i] = metaType.id();
+ if (!typeIds[i]) {
+ const QByteArray typeName = method.parameterTypeName(i);
qWarning("QObject::connect: Cannot queue arguments of type '%s'\n"
"(Make sure '%s' is registered using qRegisterMetaType().)",
typeName.constData(), typeName.constData());
- delete [] types;
+ delete [] typeIds;
return nullptr;
}
}
- types[typeNames.count()] = 0;
+ typeIds[parameterCount] = 0;
- return types;
+ return typeIds;
}
static int *queuedConnectionTypes(const QArgumentType *argumentTypes, int argc)
@@ -2871,7 +2872,7 @@ QMetaObject::Connection QObject::connect(const QObject *sender, const QMetaMetho
int *types = nullptr;
if ((type == Qt::QueuedConnection)
- && !(types = queuedConnectionTypes(signal.parameterTypes())))
+ && !(types = queuedConnectionTypes(signal)))
return QMetaObject::Connection(nullptr);
#ifndef QT_NO_DEBUG
@@ -3615,7 +3616,7 @@ static void queued_activate(QObject *sender, int signal, QObjectPrivate::Connect
const int *argumentTypes = c->argumentTypes.loadRelaxed();
if (!argumentTypes) {
QMetaMethod m = QMetaObjectPrivate::signal(sender->metaObject(), signal);
- argumentTypes = queuedConnectionTypes(m.parameterTypes());
+ argumentTypes = queuedConnectionTypes(m);
if (!argumentTypes) // cannot queue arguments
argumentTypes = &DIRECT_CONNECTION_ONLY;
if (!c->argumentTypes.testAndSetOrdered(nullptr, argumentTypes)) {