summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/corelib/kernel/qmetaobject.cpp1
-rw-r--r--src/corelib/kernel/qmetaobject_p.h4
-rw-r--r--src/corelib/kernel/qmetatype.cpp39
-rw-r--r--tests/auto/corelib/kernel/qobject/tst_qobject.cpp2
4 files changed, 37 insertions, 9 deletions
diff --git a/src/corelib/kernel/qmetaobject.cpp b/src/corelib/kernel/qmetaobject.cpp
index a8639e290a..4e05b63c82 100644
--- a/src/corelib/kernel/qmetaobject.cpp
+++ b/src/corelib/kernel/qmetaobject.cpp
@@ -652,6 +652,7 @@ int QMetaObject::indexOfMethod(const char *method) const
}
// Parses a string of comma-separated types into QArgumentTypes.
+// No normalization of the type names is performed.
static void argumentTypesFromString(const char *str, const char *end,
QArgumentTypeArray &types)
{
diff --git a/src/corelib/kernel/qmetaobject_p.h b/src/corelib/kernel/qmetaobject_p.h
index e78a92085c..5877ab18e4 100644
--- a/src/corelib/kernel/qmetaobject_p.h
+++ b/src/corelib/kernel/qmetaobject_p.h
@@ -110,6 +110,8 @@ enum MetaDataFlags {
TypeNameIndexMask = 0x7FFFFFFF
};
+extern int qMetaTypeTypeInternal(const char *);
+
class QArgumentType
{
public:
@@ -117,7 +119,7 @@ public:
: _type(type)
{}
QArgumentType(const QByteArray &name)
- : _type(QMetaType::type(name.constData())), _name(name)
+ : _type(qMetaTypeTypeInternal(name.constData())), _name(name)
{}
QArgumentType()
: _type(0)
diff --git a/src/corelib/kernel/qmetatype.cpp b/src/corelib/kernel/qmetatype.cpp
index 5ff8281090..809d3bf589 100644
--- a/src/corelib/kernel/qmetatype.cpp
+++ b/src/corelib/kernel/qmetatype.cpp
@@ -606,26 +606,26 @@ bool QMetaType::isRegistered(int type)
}
/*!
- Returns a handle to the type called \a typeName, or QMetaType::UnknownType if there is
- no such type.
+ \internal
- \sa isRegistered(), typeName(), Type
+ Implementation of QMetaType::type().
*/
-int QMetaType::type(const char *typeName)
+template <int tryNormalizedType>
+static inline int qMetaTypeTypeImpl(const char *typeName)
{
int length = qstrlen(typeName);
if (!length)
- return UnknownType;
+ return QMetaType::UnknownType;
int type = qMetaTypeStaticType(typeName, length);
- if (type == UnknownType) {
+ if (type == QMetaType::UnknownType) {
QReadLocker locker(customTypesLock());
type = qMetaTypeCustomType_unlocked(typeName, length);
#ifndef QT_NO_QOBJECT
- if (type == UnknownType) {
+ if ((type == QMetaType::UnknownType) && tryNormalizedType) {
const NS(QByteArray) normalizedTypeName = QMetaObject::normalizedType(typeName);
type = qMetaTypeStaticType(normalizedTypeName.constData(),
normalizedTypeName.size());
- if (type == UnknownType) {
+ if (type == QMetaType::UnknownType) {
type = qMetaTypeCustomType_unlocked(normalizedTypeName.constData(),
normalizedTypeName.size());
}
@@ -635,6 +635,29 @@ int QMetaType::type(const char *typeName)
return type;
}
+/*!
+ Returns a handle to the type called \a typeName, or QMetaType::UnknownType if there is
+ no such type.
+
+ \sa isRegistered(), typeName(), Type
+*/
+int QMetaType::type(const char *typeName)
+{
+ return qMetaTypeTypeImpl</*tryNormalizedType=*/true>(typeName);
+}
+
+/*!
+ \a internal
+
+ Similar to QMetaType::type(); the only difference is that this function
+ doesn't attempt to normalize the type name (i.e., the lookup will fail
+ for type names in non-normalized form).
+*/
+int qMetaTypeTypeInternal(const char *typeName)
+{
+ return qMetaTypeTypeImpl</*tryNormalizedType=*/false>(typeName);
+}
+
#ifndef QT_NO_DATASTREAM
/*!
Writes the object pointed to by \a data with the ID \a type to
diff --git a/tests/auto/corelib/kernel/qobject/tst_qobject.cpp b/tests/auto/corelib/kernel/qobject/tst_qobject.cpp
index fefec5625a..60b92fc27d 100644
--- a/tests/auto/corelib/kernel/qobject/tst_qobject.cpp
+++ b/tests/auto/corelib/kernel/qobject/tst_qobject.cpp
@@ -172,6 +172,7 @@ signals:
void signal4();
QT_MOC_COMPAT void signal5();
void signal6(void);
+ void signal7(int, const QString &);
public slots:
void aPublicSlot() { aPublicSlotCalled++; }
@@ -833,6 +834,7 @@ void tst_QObject::connectDisconnectNotify_data()
QTest::newRow("combo4") << SIGNAL( signal4( void ) )<< SLOT( slot4( void ) );
QTest::newRow("combo5") << SIGNAL( signal6( void ) ) << SLOT( slot4() );
QTest::newRow("combo6") << SIGNAL( signal6() ) << SLOT( slot4() );
+ QTest::newRow("combo7") << SIGNAL( signal7( int , const QString & ) ) << SLOT( slot4() );
}
void tst_QObject::connectDisconnectNotify()