diff options
| author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2022-03-14 13:29:49 +0100 |
|---|---|---|
| committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2022-03-14 15:50:11 +0100 |
| commit | 216c7802c393995acce063da48300b06caa23eb1 (patch) | |
| tree | a7cb0596c16d63475c693827d11b4db5ae32b7ca | |
| parent | 3ed0a3dca33fe65d3ead8731a129fdb562d0c204 (diff) | |
libpyside: Refactor handling of named signal arguments
Allocate the list of names only if the "arguments" parameter
is present. Delete it in signalFree().
Pick-to: 6.2
Change-Id: I56fe3c1a50a73e7a7ae924ccb844d2bd6378a00d
Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
| -rw-r--r-- | sources/pyside6/libpyside/dynamicqmetaobject.cpp | 18 | ||||
| -rw-r--r-- | sources/pyside6/libpyside/pysidesignal.cpp | 24 | ||||
| -rw-r--r-- | sources/pyside6/libpyside/pysidesignal_p.h | 2 |
3 files changed, 20 insertions, 24 deletions
diff --git a/sources/pyside6/libpyside/dynamicqmetaobject.cpp b/sources/pyside6/libpyside/dynamicqmetaobject.cpp index 6f1c9b40a..b23e4a426 100644 --- a/sources/pyside6/libpyside/dynamicqmetaobject.cpp +++ b/sources/pyside6/libpyside/dynamicqmetaobject.cpp @@ -625,21 +625,19 @@ void MetaObjectBuilderPrivate::parsePythonType(PyTypeObject *type) while (PyDict_Next(attrs, &pos, &key, &value)) { if (Signal::checkType(value)) { // Register signals. - auto data = reinterpret_cast<PySideSignal *>(value); - if (data->data->signalName.isEmpty()) - data->data->signalName = String::toCString(key); - for (const auto &s : data->data->signatures) { - const auto sig = data->data->signalName + '(' + s.signature + ')'; + auto *data = reinterpret_cast<PySideSignal *>(value)->data; + if (data->signalName.isEmpty()) + data->signalName = String::toCString(key); + for (const auto &s : data->signatures) { + const auto sig = data->signalName + '(' + s.signature + ')'; if (m_baseObject->indexOfSignal(sig) == -1) { // Registering the parameterNames to the QMetaObject (PYSIDE-634) // from: // Signal(..., arguments=['...', ...] // the arguments are now on data-data->signalArguments - if (!data->data->signalArguments->isEmpty()) { - m_builder->addSignal(sig).setParameterNames(*data->data->signalArguments); - } else { - m_builder->addSignal(sig); - } + auto builder = m_builder->addSignal(sig); + if (data->signalArguments && !data->signalArguments->isEmpty()) + builder.setParameterNames(*data->signalArguments); } } } diff --git a/sources/pyside6/libpyside/pysidesignal.cpp b/sources/pyside6/libpyside/pysidesignal.cpp index d3adc9901..1c7766fd8 100644 --- a/sources/pyside6/libpyside/pysidesignal.cpp +++ b/sources/pyside6/libpyside/pysidesignal.cpp @@ -204,14 +204,11 @@ PyTypeObject *PySideSignalInstance_TypeF(void) static int signalTpInit(PyObject *self, PyObject *args, PyObject *kwds) { - static PyObject *emptyTuple = nullptr; + static PyObject * const emptyTuple = PyTuple_New(0); static const char *kwlist[] = {"name", "arguments", nullptr}; char *argName = nullptr; PyObject *argArguments = nullptr; - if (emptyTuple == nullptr) - emptyTuple = PyTuple_New(0); - if (!PyArg_ParseTupleAndKeywords(emptyTuple, kwds, "|sO:QtCore.Signal", const_cast<char **>(kwlist), &argName, &argArguments)) return -1; @@ -223,16 +220,16 @@ static int signalTpInit(PyObject *self, PyObject *args, PyObject *kwds) if (argName) data->data->signalName = argName; - data->data->signalArguments = new QByteArrayList(); - if (argArguments && PySequence_Check(argArguments)) { - Py_ssize_t argument_size = PySequence_Size(argArguments); + const Py_ssize_t argument_size = + argArguments != nullptr && PySequence_Check(argArguments) + ? PySequence_Size(argArguments) : 0; + if (argument_size > 0) { + data->data->signalArguments = new QByteArrayList(); + data->data->signalArguments->reserve(argument_size); for (Py_ssize_t i = 0; i < argument_size; ++i) { - PyObject *item = PySequence_GetItem(argArguments, i); - PyObject *strObj = PyUnicode_AsUTF8String(item); - char *s = PyBytes_AsString(strObj); - Py_DECREF(strObj); - Py_DECREF(item); - if (s != nullptr) + Shiboken::AutoDecRef item(PySequence_GetItem(argArguments, i)); + Shiboken::AutoDecRef strObj(PyUnicode_AsUTF8String(item)); + if (char *s = PyBytes_AsString(strObj)) data->data->signalArguments->append(QByteArray(s)); } } @@ -262,6 +259,7 @@ static void signalFree(void *self) { auto pySelf = reinterpret_cast<PyObject *>(self); auto data = reinterpret_cast<PySideSignal *>(self); + delete data->data->signalArguments; delete data->data; data->data = nullptr; Py_XDECREF(data->homonymousMethod); diff --git a/sources/pyside6/libpyside/pysidesignal_p.h b/sources/pyside6/libpyside/pysidesignal_p.h index 84d40c4c8..4933f276b 100644 --- a/sources/pyside6/libpyside/pysidesignal_p.h +++ b/sources/pyside6/libpyside/pysidesignal_p.h @@ -55,7 +55,7 @@ struct PySideSignalData QByteArray signalName; QList<Signature> signatures; - QByteArrayList *signalArguments; + QByteArrayList *signalArguments = nullptr; }; extern "C" |
