diff options
| author | Ahmad Samir <a.samirh78@gmail.com> | 2025-06-25 21:27:19 +0300 |
|---|---|---|
| committer | Ahmad Samir <a.samirh78@gmail.com> | 2025-07-31 15:38:26 +0300 |
| commit | 82edcc1c326a054a4bf842a019dcfeda6fd9f9d9 (patch) | |
| tree | 6591dedf5c5fce63ff27c1d6714da26418413284 /src/corelib/kernel/qmetaobjectbuilder.cpp | |
| parent | ae84310e27cad07ba9075f849c1da0537391ddd8 (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.cpp | 17 |
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. |
