diff options
| author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2023-11-28 09:42:42 +0100 |
|---|---|---|
| committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2023-11-28 18:18:43 +0100 |
| commit | daf77773a72980a369ba6aabcb8cf1ca835bbbe7 (patch) | |
| tree | d8fb58dd9930f588eed0d071a0b3241d34a022f9 /sources/pyside6/libpyside/pysidesignal.cpp | |
| parent | ddc01a90175e90a7854be0d90bed25a902613e59 (diff) | |
libpyside: Remove QHash used when adding signals from QMetaObject
Replace it by a list.
Task-number: PYSIDE-2524
Change-Id: I16089a2f53f10726377f4ed66bc466549f4f6474
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Shyamnath Premnadh <Shyamnath.Premnadh@qt.io>
Diffstat (limited to 'sources/pyside6/libpyside/pysidesignal.cpp')
| -rw-r--r-- | sources/pyside6/libpyside/pysidesignal.cpp | 29 |
1 files changed, 19 insertions, 10 deletions
diff --git a/sources/pyside6/libpyside/pysidesignal.cpp b/sources/pyside6/libpyside/pysidesignal.cpp index 4039aaffe..16e7b8411 100644 --- a/sources/pyside6/libpyside/pysidesignal.cpp +++ b/sources/pyside6/libpyside/pysidesignal.cpp @@ -1109,36 +1109,45 @@ static PyObject *buildQtCompatible(const QByteArray &signature) void registerSignals(PyTypeObject *pyObj, const QMetaObject *metaObject) { using Signature = PySideSignalData::Signature; - using SignalSigMap = QHash<QByteArray, QList<Signature>>; - SignalSigMap signalsFound; + struct MetaSignal + { + QByteArray methodName; + QList<Signature> signatures; + }; + + QList<MetaSignal> signalsFound; for (int i = metaObject->methodOffset(), max = metaObject->methodCount(); i < max; ++i) { QMetaMethod method = metaObject->method(i); if (method.methodType() == QMetaMethod::Signal) { QByteArray methodName(method.methodSignature()); - methodName.chop(methodName.size() - methodName.indexOf('(')); + methodName.truncate(methodName.indexOf('(')); Signature signature{method.parameterTypes().join(','), {}, short(method.parameterCount())}; if (method.attributes() & QMetaMethod::Cloned) signature.attributes = QMetaMethod::Cloned; - signalsFound[methodName] << signature; + auto it = std::find_if(signalsFound.begin(), signalsFound.end(), + [methodName](const MetaSignal &ms) + { return ms.methodName == methodName; }); + if (it != signalsFound.end()) + it->signatures << signature; + else + signalsFound.append(MetaSignal{methodName, {signature}}); } } - SignalSigMap::Iterator it = signalsFound.begin(); - SignalSigMap::Iterator end = signalsFound.end(); - for (; it != end; ++it) { + for (const auto &metaSignal : std::as_const(signalsFound)) { PySideSignal *self = PyObject_New(PySideSignal, PySideSignal_TypeF()); self->data = new PySideSignalData; - self->data->signalName = it.key(); + self->data->signalName = metaSignal.methodName; self->homonymousMethod = nullptr; // Empty signatures comes first! So they will be the default signal signature - self->data->signatures = it.value(); + self->data->signatures = metaSignal.signatures; std::stable_sort(self->data->signatures.begin(), self->data->signatures.end(), &compareSignals); - _addSignalToWrapper(pyObj, it.key(), self); + _addSignalToWrapper(pyObj, metaSignal.methodName, self); Py_DECREF(reinterpret_cast<PyObject *>(self)); } } |
