New issue 2445: Support pybind11 in conjunction with PyPy's cpyext: Multiple inheritance broken (?) https://bitbucket.org/pypy/pypy/issues/2445/support-pybind11-in-conjunction-with-pypys
Wenzel Jakob: Hi, one of the last major stumbling blocks in getting pybind11 to work nicely in conjunction with PyPy is multiple inheritance. It seems that PyPy is quite a bit more restrictive in terms of how bases can occur in a type declaration. Instructions to reproduce: ``` #!bash $ git clone -b pypy-mi https://github.com/wjakob/pybind11 $ cd pybind11 $ pypy-c -m pip install pytest # Needed or cmake will complain $ cmake -DPYTHON_EXECUTABLE:FILEPATH=<path-to-pypy-c> . $ make -j 4 $ cd tests $ pypy-c Python 2.7.12 (98f8c7e783db, Nov 23 2016, 15:31:26) [PyPy 5.7.0-alpha0 with GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.38)] on darwin Type "help", "copyright", "credits" or "license" for more information. And now for something completely different: ``it was few yaks too late'' >>>> import pybind11_tests Traceback (most recent call last): File "<stdin>", line 1, in <module> ImportError: Base12: PyType_Ready failed (TypeError: instance layout conflicts in multiple inheritance)! ``` The following (abbreviated) code in the pybind11 test suite (``tests/test_multiple_inheritance.cpp``) is to blame: ```cpp /// Declare a new-style class Base1 deriving from object py::class_<Base1>(m, "Base1"); /// Declare a new-style class Base2 deriving from object py::class_<Base2>(m, "Base2"); /// Declare a new-style class Base12 deriving form Base1 and Base2 py::class_<Base12, Base1, Base2>(m, "Base12"); # Kaboom (instance layout conflicts in multiple inheritance) ``` What this code does is to allocate and set up a heap type data structure and call ``PyType_Ready`` three times in a row. In the third declaration, the ``PyObject*`` associated with the ``Base1`` and ``Base2`` types are provided as a tuple in the ``ht_type.tp_bases`` field. All of this works without problems in Python 2/3. The instance layout is also as simple as it gets. They are the same and basically just contain a pointer to the C++ instance being wrapped. (Hence, I suspect a cpyext bug or limitation that should probably be addressed.) _______________________________________________ pypy-issue mailing list pypy-issue@python.org https://mail.python.org/mailman/listinfo/pypy-issue