summaryrefslogtreecommitdiffstats
path: root/src/corelib/kernel/qmetaobjectbuilder.cpp
diff options
context:
space:
mode:
authorAhmad Samir <a.samirh78@gmail.com>2025-06-25 21:27:19 +0300
committerAhmad Samir <a.samirh78@gmail.com>2025-07-31 15:38:26 +0300
commit82edcc1c326a054a4bf842a019dcfeda6fd9f9d9 (patch)
tree6591dedf5c5fce63ff27c1d6714da26418413284 /src/corelib/kernel/qmetaobjectbuilder.cpp
parentae84310e27cad07ba9075f849c1da0537391ddd8 (diff)
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 <thiago.macieira@intel.com>
Diffstat (limited to 'src/corelib/kernel/qmetaobjectbuilder.cpp')
-rw-r--r--src/corelib/kernel/qmetaobjectbuilder.cpp17
1 files changed, 8 insertions, 9 deletions
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<decltype(typeName), const QByteArrayView &>)
- 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.