aboutsummaryrefslogtreecommitdiffstats
path: root/sources/shiboken2/tests/otherbinding/typediscovery_test.py
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2018-12-13 14:03:32 +0100
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2019-01-03 18:50:54 +0000
commite254c3c2aa140016e298107a0297885234abfde7 (patch)
treedb15ce3a6329ec3cc87a1b53f91e62ce754aeadc /sources/shiboken2/tests/otherbinding/typediscovery_test.py
parent0b352fca7391d01ce410ec0c04c285326e465dc1 (diff)
Fix crash related to multiple inheritance
In the <class>_PTR_CppToPython_<class> converter function (written by CppGenerator::writeConverterFunctions()), the generated code used typeid(*ptr).name() to retrieve the name to use for the SbkObjectTypes. This construct returns the name of the outermost class (for example, "QWidget" for a QWidget-type paint device returned by QPainter::device()), as opposed to "QPaintDevice *" returned by typeid(ptr).name(). This caused a crash with multiple inheritance since QWidget inherits QObject and QPaintDevice and the "QWidget" type was associated with the QPaintDevice pointer. To fix this: - Add API to libshiboken to obtain the SbkObjectType* by name and check for the presence of a special cast function (multiple inheritance). - Generate the code of <class>_PTR_CppToPython_<class> as follows: Check whether the outermost type obtained by typeid(*ptr).name() has a special cast function. If that is the case, use the type name obtained by typeid(ptr).name() (base class) to create the wrapper. Change-Id: I8ee6b4c084e9dafa434623433661809b83aedee5 Fixes: PYSIDE-868 Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
Diffstat (limited to 'sources/shiboken2/tests/otherbinding/typediscovery_test.py')
-rw-r--r--sources/shiboken2/tests/otherbinding/typediscovery_test.py10
1 files changed, 6 insertions, 4 deletions
diff --git a/sources/shiboken2/tests/otherbinding/typediscovery_test.py b/sources/shiboken2/tests/otherbinding/typediscovery_test.py
index 6816b158a..a9eb88d80 100644
--- a/sources/shiboken2/tests/otherbinding/typediscovery_test.py
+++ b/sources/shiboken2/tests/otherbinding/typediscovery_test.py
@@ -51,14 +51,16 @@ class TypeDiscoveryTest(unittest.TestCase):
def testMultipleInheritance(self):
obj = OtherMultipleDerived.createObject("Base1");
self.assertEqual(type(obj), Base1)
+ # PYSIDE-868: In case of multiple inheritance, a factory
+ # function will return the base class wrapper.
obj = OtherMultipleDerived.createObject("MDerived1");
- self.assertEqual(type(obj), MDerived1)
+ self.assertEqual(type(obj), Base1)
obj = OtherMultipleDerived.createObject("SonOfMDerived1");
- self.assertEqual(type(obj), SonOfMDerived1)
+ self.assertEqual(type(obj), Base1)
obj = OtherMultipleDerived.createObject("MDerived3");
- self.assertEqual(type(obj), MDerived3)
+ self.assertEqual(type(obj), Base1)
obj = OtherMultipleDerived.createObject("OtherMultipleDerived");
- self.assertEqual(type(obj), OtherMultipleDerived)
+ self.assertEqual(type(obj), Base1)
if __name__ == '__main__':
unittest.main()