summaryrefslogtreecommitdiffstats
path: root/src/corelib/kernel/qvariant_p.h
diff options
context:
space:
mode:
authorJędrzej Nowacki <jedrzej.nowacki@nokia.com>2011-10-31 10:22:46 +0100
committerQt by Nokia <qt-info@nokia.com>2011-11-09 10:12:34 +0100
commitca26fefc0624264262a2abe630568271cefa2753 (patch)
tree6f0a5acc1263b744dea7c79f0b9c8e164874748e /src/corelib/kernel/qvariant_p.h
parent5bd377274e080234cb7e74679b7477feec9ec294 (diff)
[optimization] QVariants comparison
QMetaType::isRegistered and QMetaType::typeName are quite expensive. To compare two custom objects we need to have their type name (for dereferenced comparison). If the name exist we know for sure that the type is registered and we do not have to call QMetaType::isRegistered anymore. Change-Id: Iba631e012504c8633868a902880fa30d38afb917 Reviewed-by: Olivier Goffart <ogoffart@woboq.com>
Diffstat (limited to 'src/corelib/kernel/qvariant_p.h')
-rw-r--r--src/corelib/kernel/qvariant_p.h4
1 files changed, 2 insertions, 2 deletions
diff --git a/src/corelib/kernel/qvariant_p.h b/src/corelib/kernel/qvariant_p.h
index aa03bb298a..5729c0d2d5 100644
--- a/src/corelib/kernel/qvariant_p.h
+++ b/src/corelib/kernel/qvariant_p.h
@@ -161,13 +161,13 @@ class QVariantComparator {
struct FilteredComparator<T, /* IsAcceptedType = */ false> {
static bool compare(const QVariant::Private *m_a, const QVariant::Private *m_b)
{
- if (!QMetaType::isRegistered(m_a->type))
+ const char *const typeName = QMetaType::typeName(m_a->type);
+ if (Q_UNLIKELY(!typeName) && Q_LIKELY(!QMetaType::isRegistered(m_a->type)))
qFatal("QVariant::compare: type %d unknown to QVariant.", m_a->type);
const void *a_ptr = m_a->is_shared ? m_a->data.shared->ptr : &(m_a->data.ptr);
const void *b_ptr = m_b->is_shared ? m_b->data.shared->ptr : &(m_b->data.ptr);
- const char *const typeName = QMetaType::typeName(m_a->type);
uint typeNameLen = qstrlen(typeName);
if (typeNameLen > 0 && typeName[typeNameLen - 1] == '*')
return *static_cast<void *const *>(a_ptr) == *static_cast<void *const *>(b_ptr);