diff --git a/CHANGES.current b/CHANGES.current index 72833c7a2..39157d37f 100644 --- a/CHANGES.current +++ b/CHANGES.current @@ -7,6 +7,10 @@ the issue number to the end of the URL: https://github.com/swig/swig/issues/ Version 4.1.0 (in progress) =========================== +2022-07-20: jicks, Ingener74, olly + #422 [Python] Fix mishandling of a Python class inheriting from + multiple SWIG-wrapped director classes. + 2022-07-19: wsfulton #692 [C#, Java, Perl, Python, Ruby] std::unique_ptr and std::auto_ptr typemaps provided for inputs types in std_unique_ptr.i and std_auto_ptr.i. diff --git a/Examples/test-suite/director_multiple_inheritance.i b/Examples/test-suite/director_multiple_inheritance.i new file mode 100644 index 000000000..ff50cfeba --- /dev/null +++ b/Examples/test-suite/director_multiple_inheritance.i @@ -0,0 +1,71 @@ +//%module(ruby_minherit="1") multiple_inheritance +%module(directors="1") director_multiple_inheritance + +%feature("director") A; +%feature("director") B; +%feature("director") C; +%feature("director") D; + +%inline %{ + +class A { +public: + virtual ~A() { } + virtual int testA(); +}; + +class B: virtual public A { +public: + virtual ~B() { } + virtual int testB(); +}; + +class C: virtual public A { +public: + virtual ~C() { } + virtual int testC(); +}; + +class D: virtual public A { +public: + virtual ~D() { } + virtual int testD(); +}; + +class E { +public: + virtual ~E() { } + virtual int testE(B*); +}; + +class F { +public: + virtual ~F() { } + virtual int testF(C*); +}; + +class T { +public: + virtual ~T() { } + virtual int testT(D*); +}; + +%} + +%{ + +int A::testA() { return 1; } + +int B::testB() { return 2; } + +int C::testC() { return 3; } + +int D::testD() { return 4; } + +int E::testE(B*) { return 5; } + +int F::testF(C*) { return 6; } + +int T::testT(D*) { return 20; } + +%} diff --git a/Examples/test-suite/python/director_multiple_inheritance_runme.py b/Examples/test-suite/python/director_multiple_inheritance_runme.py new file mode 100644 index 000000000..8c8ea0bf6 --- /dev/null +++ b/Examples/test-suite/python/director_multiple_inheritance_runme.py @@ -0,0 +1,36 @@ +import director_multiple_inheritance as st + +class TestBCD(st.B, st.C, st.D): + def __init__(self): + st.B.__init__(self) + st.C.__init__(self) + st.D.__init__(self) + +class TestBDC(st.B, st.C, st.D): + def __init__(self): + st.B.__init__(self) + st.D.__init__(self) + st.C.__init__(self) + +class TestCBD(st.B, st.C, st.D): + def __init__(self): + st.C.__init__(self) + st.B.__init__(self) + st.D.__init__(self) + +def dotest(test): + e = st.E() + if e.testE(test) != 5: + raise RuntimeError(e.testE(test)) + + f = st.F() + if f.testF(test) != 6: + raise RuntimeError(f.testF(test)) + + t = st.T() + if t.testT(test) != 20: + raise RuntimeError(t.testT(test)) + +dotest(TestBCD()) +dotest(TestCBD()) +dotest(TestBDC()) diff --git a/Lib/python/pyrun.swg b/Lib/python/pyrun.swg index 36a20c422..a1ac95baf 100644 --- a/Lib/python/pyrun.swg +++ b/Lib/python/pyrun.swg @@ -792,6 +792,7 @@ SwigPyObject_append(PyObject* v, PyObject* next) PyErr_SetString(PyExc_TypeError, "Attempt to append a non SwigPyObject"); return NULL; } + ((SwigPyObject *)next)->next = sobj->next; sobj->next = next; Py_INCREF(next); return SWIG_Py_Void();