diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2018-12-13 14:03:32 +0100 |
---|---|---|
committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2019-01-03 18:50:54 +0000 |
commit | e254c3c2aa140016e298107a0297885234abfde7 (patch) | |
tree | db15ce3a6329ec3cc87a1b53f91e62ce754aeadc /sources/shiboken2/tests/otherbinding/typediscovery_test.py | |
parent | 0b352fca7391d01ce410ec0c04c285326e465dc1 (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.py | 10 |
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() |