From 9372242a1dd8e4dca641971ce23b889552b4022c Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Tue, 5 Apr 2022 17:09:01 +0200 Subject: PySide6: Handle not finding a slot by name Change-Id: Ie2c652223aaaa853c99d540acebb99f754f34d61 Reviewed-by: Christian Tismer (cherry picked from commit 4b763b54737b0da8f10cfed245637310d4cd80c7) --- sources/pyside2/libpyside/signalmanager.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/sources/pyside2/libpyside/signalmanager.cpp b/sources/pyside2/libpyside/signalmanager.cpp index 814b15f0a..aefe79318 100644 --- a/sources/pyside2/libpyside/signalmanager.cpp +++ b/sources/pyside2/libpyside/signalmanager.cpp @@ -638,6 +638,11 @@ static int callMethod(QObject *object, int id, void **args) QByteArray methodName = method.methodSignature(); methodName.truncate(methodName.indexOf('(')); Shiboken::AutoDecRef pyMethod(PyObject_GetAttrString(self, methodName)); + if (pyMethod.isNull()) { + PyErr_Format(PyExc_AttributeError, "Slot '%s::%s' not found.", + metaObject->className(), method.methodSignature().constData()); + return -1; + } return SignalManager::callPythonMetaMethod(method, args, pyMethod, false); } return -1; -- cgit v1.2.3 From 5eb9535b708b2d62b5c13defe5aaad9ee005185f Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Thu, 19 May 2022 12:26:46 +0200 Subject: shiboken6: Generate converters for all smart pointee base classes Introduce helper functions to recursively collect all base classes. Amends 24cd62c9d18850707574ba7eb637ff24bee353a1. Fixes: PYSIDE-1933 Task-number: SIDE-1397 Change-Id: I7c205d226d77c113f5a1e90a2e93e96fe4c54e5e Reviewed-by: Christian Tismer Reviewed-by: Shyamnath Premnadh (cherry picked from commit ee47ccbd9a7310da01b421c51c956739df0acdf4) --- sources/shiboken2/generator/shiboken2/cppgenerator.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sources/shiboken2/generator/shiboken2/cppgenerator.cpp b/sources/shiboken2/generator/shiboken2/cppgenerator.cpp index fa225035a..7629cb660 100644 --- a/sources/shiboken2/generator/shiboken2/cppgenerator.cpp +++ b/sources/shiboken2/generator/shiboken2/cppgenerator.cpp @@ -1763,7 +1763,7 @@ void CppGenerator::writeSmartPointerConverterFunctions(QTextStream &s, const Abs // TODO: Missing conversion to smart pointer pointer type: s << "// Register smartpointer conversion for all derived classes\n"; - const auto classes = getBaseClasses(targetClass); + const auto classes = getAllAncestors(targetClass); for (auto k : classes) { if (smartPointerTypeEntry->matchesInstantiation(k->typeEntry())) { if (auto smartTargetType = findSmartPointerInstantiation(k->typeEntry())) { @@ -4009,7 +4009,7 @@ void CppGenerator::writeSmartPointerConverterInitialization(QTextStream &s, cons if (!klass) return; - const auto classes = getBaseClasses(klass); + const auto classes = getAllAncestors(klass); if (classes.isEmpty()) return; -- cgit v1.2.3 From e794e7c35e6851c79479e95145c8bbf88440ea8f Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Mon, 23 May 2022 11:51:49 +0200 Subject: Fix a crash in QTextBlock.layout() Prevent the return value heuristics from setting a parent relationship. Fixes: PYSIDE-1939 Change-Id: I7b8b4080f4c0c288439140c44fb9c2b896af2907 Reviewed-by: Christian Tismer (cherry picked from commit 0e62c4db50472f8b581022c86a6be651158d0cd0) --- sources/pyside2/PySide2/QtGui/typesystem_gui_common.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/sources/pyside2/PySide2/QtGui/typesystem_gui_common.xml b/sources/pyside2/PySide2/QtGui/typesystem_gui_common.xml index 617d64355..e1c3bca5d 100644 --- a/sources/pyside2/PySide2/QtGui/typesystem_gui_common.xml +++ b/sources/pyside2/PySide2/QtGui/typesystem_gui_common.xml @@ -479,6 +479,11 @@ + + + + + -- cgit v1.2.3 From 8ffb90ebeef14790ee25587da887c14045037415 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Tue, 24 May 2022 08:20:59 +0200 Subject: Fix "Internal C++ object already deleted." when using QWidget::nativeParentWidget() Prevent the return value heuristics from setting a parent relationship. Fixes: PYSIDE-1893 Change-Id: Id2f71251c2d0f55072675cb36e4ec5ed9511c92d Reviewed-by: Shyamnath Premnadh Reviewed-by: Christian Tismer (cherry picked from commit e5d50b1e9f057fd37c6adb2bd66dcc3d49f6e3a9) --- sources/pyside2/PySide2/QtWidgets/typesystem_widgets_common.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/sources/pyside2/PySide2/QtWidgets/typesystem_widgets_common.xml b/sources/pyside2/PySide2/QtWidgets/typesystem_widgets_common.xml index 6a6845f58..c20351723 100644 --- a/sources/pyside2/PySide2/QtWidgets/typesystem_widgets_common.xml +++ b/sources/pyside2/PySide2/QtWidgets/typesystem_widgets_common.xml @@ -2083,6 +2083,12 @@ + + + + + + -- cgit v1.2.3 From cf688d601606c22a8d12326c0bd56ba15c5748ba Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Wed, 1 Jun 2022 12:36:33 +0200 Subject: libshiboken: Fix occasional crashes when using QML QML calls into the generated QObject::metaObject() from threads without GIL, causing crashes for example in retrieveWrapper(). Use a mutex to guard access. Change-Id: I374ada7fc207d86a062f950751503764a5e5dddf Reviewed-by: Christian Tismer (cherry picked from commit e141ea41cf6f2840281ab6e52b0861a6d1dcc137) --- sources/shiboken2/libshiboken/bindingmanager.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/sources/shiboken2/libshiboken/bindingmanager.cpp b/sources/shiboken2/libshiboken/bindingmanager.cpp index 7111197bf..9e658c41d 100644 --- a/sources/shiboken2/libshiboken/bindingmanager.cpp +++ b/sources/shiboken2/libshiboken/bindingmanager.cpp @@ -31,6 +31,7 @@ #include #include +#include #include namespace Shiboken @@ -123,6 +124,11 @@ struct BindingManager::BindingManagerPrivate { using DestructorEntries = std::vector; WrapperMap wrapperMapper; + // Guard wrapperMapper mainly for QML which calls into the generated + // QObject::metaObject() and elsewhere from threads without GIL, causing + // crashes for example in retrieveWrapper(). std::shared_mutex was rejected due to: + // https://stackoverflow.com/questions/50972345/when-is-stdshared-timed-mutex-slower-than-stdmutex-and-when-not-to-use-it + std::mutex wrapperMapLock; Graph classHierarchy; DestructorEntries deleteInMainThread; bool destroying; @@ -138,6 +144,7 @@ bool BindingManager::BindingManagerPrivate::releaseWrapper(void *cptr, SbkObject // The wrapper argument is checked to ensure that the correct wrapper is released. // Returns true if the correct wrapper is found and released. // If wrapper argument is NULL, no such check is performed. + std::lock_guard guard(wrapperMapLock); auto iter = wrapperMapper.find(cptr); if (iter != wrapperMapper.end() && (wrapper == nullptr || iter->second == wrapper)) { wrapperMapper.erase(iter); @@ -149,6 +156,7 @@ bool BindingManager::BindingManagerPrivate::releaseWrapper(void *cptr, SbkObject void BindingManager::BindingManagerPrivate::assignWrapper(SbkObject *wrapper, const void *cptr) { assert(cptr); + std::lock_guard guard(wrapperMapLock); auto iter = wrapperMapper.find(cptr); if (iter == wrapperMapper.end()) wrapperMapper.insert(std::make_pair(cptr, wrapper)); @@ -175,6 +183,7 @@ BindingManager::~BindingManager() * the BindingManager is being destroyed the interpreter is alredy * shutting down. */ if (Py_IsInitialized()) { // ensure the interpreter is still valid + std::lock_guard guard(m_d->wrapperMapLock); while (!m_d->wrapperMapper.empty()) { Object::destroy(m_d->wrapperMapper.begin()->second, const_cast(m_d->wrapperMapper.begin()->first)); } @@ -190,6 +199,7 @@ BindingManager &BindingManager::instance() { bool BindingManager::hasWrapper(const void *cptr) { + std::lock_guard guard(m_d->wrapperMapLock); return m_d->wrapperMapper.find(cptr) != m_d->wrapperMapper.end(); } @@ -250,6 +260,7 @@ void BindingManager::addToDeletionInMainThread(const DestructorEntry &e) SbkObject *BindingManager::retrieveWrapper(const void *cptr) { + std::lock_guard guard(m_d->wrapperMapLock); auto iter = m_d->wrapperMapper.find(cptr); if (iter == m_d->wrapperMapper.end()) return nullptr; @@ -339,6 +350,7 @@ SbkObjectType *BindingManager::resolveType(void **cptr, SbkObjectType *type) std::set BindingManager::getAllPyObjects() { std::set pyObjects; + std::lock_guard guard(m_d->wrapperMapLock); const WrapperMap &wrappersMap = m_d->wrapperMapper; auto it = wrappersMap.begin(); for (; it != wrappersMap.end(); ++it) -- cgit v1.2.3 From 86e193dd6f1b350f45025215b6475490c3eb33f8 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Wed, 8 Jun 2022 08:31:56 +0200 Subject: Add changelog for 5.15.10 Change-Id: I0ac9e579270eb9bbb88c5343a8ede7899e3c1d07 Reviewed-by: Cristian Maureira-Fredes --- dist/changes-5.15.10 | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 dist/changes-5.15.10 diff --git a/dist/changes-5.15.10 b/dist/changes-5.15.10 new file mode 100644 index 000000000..70e2ff69b --- /dev/null +++ b/dist/changes-5.15.10 @@ -0,0 +1,29 @@ +Qt for Python 5.5.10 is a bug-fix release. + +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + +https://doc.qt.io/qtforpython/ + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* PySide2 * +**************************************************************************** + + - [PYSIDE-1893] Error "Internal C++ object already deleted." when + using QWidget::nativeParentWidget() has been fixed. + - [PYSIDE-1939] A crash in QTextBlock.layout() has been fixed. + +**************************************************************************** +* Shiboken2 * +**************************************************************************** + + - [PYSIDE-1933] Converters for all smart pointee base classes are now + generated. -- cgit v1.2.3 From dba47a16b805f03788f77846bc7ae48d0cc2d095 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simo=20F=C3=A4lt?= Date: Wed, 8 Jun 2022 22:30:02 +0300 Subject: Pin Qt5.15.10 sha1 and bump version numbers for release Change-Id: I89644fb5e62747d146f0fe8d11ecbcdf343e677f Reviewed-by: Friedemann Kleint --- coin/dependencies.yaml | 2 +- sources/pyside2/pyside_version.py | 2 +- sources/shiboken2/shiboken_version.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/coin/dependencies.yaml b/coin/dependencies.yaml index 4652d72b6..c2e475643 100644 --- a/coin/dependencies.yaml +++ b/coin/dependencies.yaml @@ -1,6 +1,6 @@ product_dependency: ../../qt/tqtc-qt5.git: - ref: "36519195612b6596da28e19ea369c22c26ea4ba2" + ref: "67ee8a740e8a46c7dd470889ac182f465081dd1c" dependency_source: supermodule dependencies: [ "../../qt/qt3d", diff --git a/sources/pyside2/pyside_version.py b/sources/pyside2/pyside_version.py index f381be193..8bb244ee2 100644 --- a/sources/pyside2/pyside_version.py +++ b/sources/pyside2/pyside_version.py @@ -21,7 +21,7 @@ major_version = "5" minor_version = "15" -patch_version = "9" +patch_version = "10" # For example: "a", "b", "rc" # (which means "alpha", "beta", "release candidate"). diff --git a/sources/shiboken2/shiboken_version.py b/sources/shiboken2/shiboken_version.py index f381be193..8bb244ee2 100644 --- a/sources/shiboken2/shiboken_version.py +++ b/sources/shiboken2/shiboken_version.py @@ -21,7 +21,7 @@ major_version = "5" minor_version = "15" -patch_version = "9" +patch_version = "10" # For example: "a", "b", "rc" # (which means "alpha", "beta", "release candidate"). -- cgit v1.2.3 From 0e70b038a6a777cf1001fd2fbf75336b6ddfa047 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Fri, 10 Jun 2022 14:07:29 +0200 Subject: libshiboken: Fix hangs introduced by mutex MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Use a recursive mutex since nested locks can occur in ~BindingManager. Amends e141ea41cf6f2840281ab6e52b0861a6d1dcc137. Change-Id: I2dee3da70fe855859b3917e6ac775b8c5cdf5da7 Reviewed-by: Christian Tismer (cherry picked from commit a2005503162fd707d71027712f13f6b9454e78ad) (cherry picked from commit dfae9541544b64174738ff9383607d2040b2d2ff) Reviewed-by: Simo Fält --- sources/shiboken2/libshiboken/bindingmanager.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/sources/shiboken2/libshiboken/bindingmanager.cpp b/sources/shiboken2/libshiboken/bindingmanager.cpp index 9e658c41d..658f085ac 100644 --- a/sources/shiboken2/libshiboken/bindingmanager.cpp +++ b/sources/shiboken2/libshiboken/bindingmanager.cpp @@ -128,7 +128,7 @@ struct BindingManager::BindingManagerPrivate { // QObject::metaObject() and elsewhere from threads without GIL, causing // crashes for example in retrieveWrapper(). std::shared_mutex was rejected due to: // https://stackoverflow.com/questions/50972345/when-is-stdshared-timed-mutex-slower-than-stdmutex-and-when-not-to-use-it - std::mutex wrapperMapLock; + std::recursive_mutex wrapperMapLock; Graph classHierarchy; DestructorEntries deleteInMainThread; bool destroying; @@ -144,7 +144,7 @@ bool BindingManager::BindingManagerPrivate::releaseWrapper(void *cptr, SbkObject // The wrapper argument is checked to ensure that the correct wrapper is released. // Returns true if the correct wrapper is found and released. // If wrapper argument is NULL, no such check is performed. - std::lock_guard guard(wrapperMapLock); + std::lock_guard guard(wrapperMapLock); auto iter = wrapperMapper.find(cptr); if (iter != wrapperMapper.end() && (wrapper == nullptr || iter->second == wrapper)) { wrapperMapper.erase(iter); @@ -156,7 +156,7 @@ bool BindingManager::BindingManagerPrivate::releaseWrapper(void *cptr, SbkObject void BindingManager::BindingManagerPrivate::assignWrapper(SbkObject *wrapper, const void *cptr) { assert(cptr); - std::lock_guard guard(wrapperMapLock); + std::lock_guard guard(wrapperMapLock); auto iter = wrapperMapper.find(cptr); if (iter == wrapperMapper.end()) wrapperMapper.insert(std::make_pair(cptr, wrapper)); @@ -183,7 +183,7 @@ BindingManager::~BindingManager() * the BindingManager is being destroyed the interpreter is alredy * shutting down. */ if (Py_IsInitialized()) { // ensure the interpreter is still valid - std::lock_guard guard(m_d->wrapperMapLock); + std::lock_guard guard(m_d->wrapperMapLock); while (!m_d->wrapperMapper.empty()) { Object::destroy(m_d->wrapperMapper.begin()->second, const_cast(m_d->wrapperMapper.begin()->first)); } @@ -199,7 +199,7 @@ BindingManager &BindingManager::instance() { bool BindingManager::hasWrapper(const void *cptr) { - std::lock_guard guard(m_d->wrapperMapLock); + std::lock_guard guard(m_d->wrapperMapLock); return m_d->wrapperMapper.find(cptr) != m_d->wrapperMapper.end(); } @@ -260,7 +260,7 @@ void BindingManager::addToDeletionInMainThread(const DestructorEntry &e) SbkObject *BindingManager::retrieveWrapper(const void *cptr) { - std::lock_guard guard(m_d->wrapperMapLock); + std::lock_guard guard(m_d->wrapperMapLock); auto iter = m_d->wrapperMapper.find(cptr); if (iter == m_d->wrapperMapper.end()) return nullptr; @@ -350,7 +350,7 @@ SbkObjectType *BindingManager::resolveType(void **cptr, SbkObjectType *type) std::set BindingManager::getAllPyObjects() { std::set pyObjects; - std::lock_guard guard(m_d->wrapperMapLock); + std::lock_guard guard(m_d->wrapperMapLock); const WrapperMap &wrappersMap = m_d->wrapperMapper; auto it = wrappersMap.begin(); for (; it != wrappersMap.end(); ++it) -- cgit v1.2.3