From 82edcc1c326a054a4bf842a019dcfeda6fd9f9d9 Mon Sep 17 00:00:00 2001 From: Ahmad Samir Date: Wed, 25 Jun 2025 21:27:19 +0300 Subject: QMetaStringTable: optimize inserting elements into the hash table Prevent double lookup in the hash table. When inserting QBAVs returned from QMetaMethodBuilderPrivate::parameterTypes() into the table use QByteArray::fromRawData(), those views will outlive the `strings` table local variable. Pick-to: 6.10 Change-Id: I3a4dc4d7608e49da09fcc39056a608726fdd8e80 Reviewed-by: Thiago Macieira --- src/corelib/kernel/qmetaobjectbuilder.cpp | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) (limited to 'src/corelib/kernel/qmetaobjectbuilder.cpp') diff --git a/src/corelib/kernel/qmetaobjectbuilder.cpp b/src/corelib/kernel/qmetaobjectbuilder.cpp index efd8dcf76fc..3ba54482f94 100644 --- a/src/corelib/kernel/qmetaobjectbuilder.cpp +++ b/src/corelib/kernel/qmetaobjectbuilder.cpp @@ -1059,13 +1059,10 @@ QMetaStringTable::QMetaStringTable(const QByteArray &className) // entered). Returns the index of the string. int QMetaStringTable::enter(const QByteArray &value) { - Entries::iterator it = m_entries.find(value); - if (it != m_entries.end()) - return it.value(); - int pos = m_index; - m_entries.insert(value, pos); - ++m_index; - return pos; + auto [it, inserted] = m_entries.tryInsert(value, m_index); + if (inserted) + ++m_index; + return it.value(); } int QMetaStringTable::preferredAlignment() @@ -1287,10 +1284,12 @@ static int buildMetaObject(QMetaObjectBuilderPrivate *d, char *buf, auto getTypeInfo = [&](const auto &typeName) { if (QtPrivate::isBuiltinType(typeName)) return QMetaType::fromName(typeName).id(); + int index; if constexpr (std::is_same_v) - return int(IsUnresolvedType | strings.enter(typeName.toByteArray())); + index = strings.enter(QByteArray::fromRawData(typeName.constData(), typeName.size())); else - return int(IsUnresolvedType | strings.enter(typeName)); + index = strings.enter(typeName); + return int(IsUnresolvedType | index); }; // Output the method parameters in the class. -- cgit v1.2.3