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 /sources/pyside6/libpyside/pysidesignal.cpp | |
| 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>
Diffstat (limited to 'sources/pyside6/libpyside/pysidesignal.cpp')
| -rw-r--r-- | sources/pyside6/libpyside/pysidesignal.cpp | 24 |
1 files changed, 11 insertions, 13 deletions
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); |
