aboutsummaryrefslogtreecommitdiffstats
path: root/sources/pyside6/libpyside/pysidesignal.cpp
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2022-03-14 13:29:49 +0100
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2022-03-14 15:50:11 +0100
commit216c7802c393995acce063da48300b06caa23eb1 (patch)
treea7cb0596c16d63475c693827d11b4db5ae32b7ca /sources/pyside6/libpyside/pysidesignal.cpp
parent3ed0a3dca33fe65d3ead8731a129fdb562d0c204 (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.cpp24
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);