diff options
-rw-r--r-- | src/corelib/kernel/qmetaobject.cpp | 1 | ||||
-rw-r--r-- | src/corelib/kernel/qmetaobject_p.h | 4 | ||||
-rw-r--r-- | src/corelib/kernel/qmetatype.cpp | 39 | ||||
-rw-r--r-- | tests/auto/corelib/kernel/qobject/tst_qobject.cpp | 2 |
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() |