diff options
| author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2025-02-03 11:47:17 +0100 |
|---|---|---|
| committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2025-02-11 15:40:44 +0100 |
| commit | c1b62556bffbdd2b5e5eecc790ec4732b93e05a1 (patch) | |
| tree | e11589a692706b59a70ebcf41e93df07f2db2573 /sources/pyside6/libpyside/signalmanager.cpp | |
| parent | a7b1ef20fe791ac6bec92d1f05904ff14bc34e5b (diff) | |
Fix crash of signals with object-type parameter being passed by const-ref
Add a further indirection in callPythonMetaMethodHelper()
when only a pointer conversion is available for a const-ref parameter.
Task-number: PYSIDE-3004
Change-Id: I6ec7c5a9d4d30c8e4973ec79534d5f3eb3bf8204
Reviewed-by: Shyamnath Premnadh <Shyamnath.Premnadh@qt.io>
Diffstat (limited to 'sources/pyside6/libpyside/signalmanager.cpp')
| -rw-r--r-- | sources/pyside6/libpyside/signalmanager.cpp | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/sources/pyside6/libpyside/signalmanager.cpp b/sources/pyside6/libpyside/signalmanager.cpp index 744b77b51..72a427641 100644 --- a/sources/pyside6/libpyside/signalmanager.cpp +++ b/sources/pyside6/libpyside/signalmanager.cpp @@ -464,16 +464,21 @@ static int callPythonMetaMethodHelper(const QByteArrayList ¶mTypes, const char *returnType /* = nullptr */, void **args, PyObject *pyCallable) { + using SpecificConverter = Shiboken::Conversions::SpecificConverter; const qsizetype argsSize = paramTypes.size(); Shiboken::AutoDecRef preparedArgs(PyTuple_New(argsSize)); for (qsizetype i = 0; i < argsSize; ++i) { void *data = args[i + 1]; - auto param = paramTypes.at(i); - Shiboken::Conversions::SpecificConverter converter(param.constData()); + const auto ¶m = paramTypes.at(i); + SpecificConverter converter(param.constData()); if (!converter.isValid()) return CallResult::CallArgumentError + int(i); - PyTuple_SetItem(preparedArgs, i, converter.toPython(data)); + // Only pointer conversion available for const-ref - add indirection + const bool valueToPtr = converter.conversionType() == SpecificConverter::PointerConversion + && !param.endsWith('*') && param != "PyObject"_ba; + auto *src = valueToPtr ? &data : data; + PyTuple_SetItem(preparedArgs, i, converter.toPython(src)); } QScopedPointer<Shiboken::Conversions::SpecificConverter> retConverter; |
