This changeset is about both shiboken2 and python3-pyside2 (that are separated packages) upstream: yes From c6184e01e993dcca9798f306fb8e9cb322fdd0dc Mon Sep 17 00:00:00 2001 From: Christian Tismer Date: Thu, 3 Dec 2020 13:38:58 +0100 Subject: [PATCH] fix both qflags_test and the qflags cppgenerator code There was a years-old qflags test failing on Python 3. It was blacklisted with the comment "# Nested exception in Python 3" This was nonsense: The test was wrong also for Python 2. It just happened to work, because Python 2 had some weird errors leaking. The real bug was in missing error handling in cppgenerator.cpp . See the main description in the issue. Change-Id: Ia0f9466640e0eb33f1b8b26178d33f2be0bcb32f Task-number: PYSIDE-1442 Reviewed-by: Friedemann Kleint (cherry picked from commit 288fadb796ec4e11e99e3752d531ada7edf15d75) --- build_history/blacklist.txt | 3 --- sources/pyside2/tests/QtCore/qflags_test.py | 12 +++++++----- .../shiboken2/generator/shiboken2/cppgenerator.cpp | 2 ++ 3 files changed, 9 insertions(+), 8 deletions(-) diff --git build_history/blacklist.txt build_history/blacklist.txt index 9b63f9784..2a2a5d4c4 100644 --- build_history/blacklist.txt +++ build_history/blacklist.txt @@ -18,9 +18,6 @@ darwin py3 [QtCore::qfileread_test] darwin -# Nested exception in Python 3 -[QtCore::qflags_test] - py3 [QtCore::qobject_connect_notify_test] linux darwin diff --git sources/pyside2/tests/QtCore/qflags_test.py sources/pyside2/tests/QtCore/qflags_test.py index 08a7c55b1..e1e989c1e 100644 --- sources/pyside2/tests/QtCore/qflags_test.py +++ sources/pyside2/tests/QtCore/qflags_test.py @@ -30,6 +30,7 @@ '''Test cases for QFlags''' +import operator import os import sys import unittest @@ -117,12 +118,13 @@ class QFlagsOnQVariant(unittest.TestCase): class QFlagsWrongType(unittest.TestCase): def testWrongType(self): '''Wrong type passed to QFlags binary operators''' + for op in operator.or_, operator.and_, operator.xor: + for x in '43', 'jabba', QObject, object: + self.assertRaises(TypeError, op, Qt.NoItemFlags, x) + self.assertRaises(TypeError, op, x, Qt.NoItemFlags) + # making sure this actually does not fail all the time + self.assertEqual(operator.or_(Qt.NoItemFlags, 43), 43) - self.assertRaises(TypeError, Qt.NoItemFlags | '43') - self.assertRaises(TypeError, Qt.NoItemFlags & '43') - self.assertRaises(TypeError, 'jabba' & Qt.NoItemFlags) - self.assertRaises(TypeError, 'hut' & Qt.NoItemFlags) - self.assertRaises(TypeError, Qt.NoItemFlags & QObject()) if __name__ == '__main__': unittest.main() diff --git sources/shiboken2/generator/shiboken2/cppgenerator.cpp sources/shiboken2/generator/shiboken2/cppgenerator.cpp index ff44db955..87ddd73a5 100644 --- sources/shiboken2/generator/shiboken2/cppgenerator.cpp +++ sources/shiboken2/generator/shiboken2/cppgenerator.cpp @@ -5230,6 +5230,8 @@ void CppGenerator::writeFlagsBinaryOperator(QTextStream &s, const AbstractMetaEn s << INDENT << "cppArg = static_cast<" << flagsEntry->originalName() << ">(int(PyInt_AsLong(" << PYTHON_ARG << ")));\n"; s << "#endif\n\n"; + s << INDENT << "if (PyErr_Occurred())\n" << indent(INDENT) + << INDENT << "return nullptr;\n" << outdent(INDENT); s << INDENT << "cppResult = " << CPP_SELF_VAR << " " << cppOpName << " cppArg;\n"; s << INDENT << "return "; writeToPythonConversion(s, flagsType, nullptr, QLatin1String("cppResult")); -- 2.29.2