aboutsummaryrefslogtreecommitdiffstats
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
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>
-rw-r--r--sources/pyside6/libpyside/dynamicqmetaobject.cpp18
-rw-r--r--sources/pyside6/libpyside/pysidesignal.cpp24
-rw-r--r--sources/pyside6/libpyside/pysidesignal_p.h2
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"