Author: Armin Rigo <[email protected]>
Branch:
Changeset: r90686:9cc33cbcd4a7
Date: 2017-03-14 22:11 +0100
http://bitbucket.org/pypy/pypy/changeset/9cc33cbcd4a7/
Log: test and fix
diff --git a/pypy/module/cpyext/test/test_typeobject.py
b/pypy/module/cpyext/test/test_typeobject.py
--- a/pypy/module/cpyext/test/test_typeobject.py
+++ b/pypy/module/cpyext/test/test_typeobject.py
@@ -1221,3 +1221,25 @@
pass
bases = module.foo(C)
assert bases == (A, B)
+
+ def test_multiple_inheritance_old_style_base(self):
+ module = self.import_extension('foo', [
+ ("foo", "METH_O",
+ '''
+ PyTypeObject *tp;
+ tp = (PyTypeObject*)args;
+ Py_INCREF(tp->tp_bases);
+ return tp->tp_bases;
+ '''
+ )])
+ # used to segfault after some iterations
+ for i in range(11):
+ print i
+ class A(object):
+ pass
+ class B:
+ pass
+ class C(A, B):
+ pass
+ bases = module.foo(C)
+ assert bases == (A, B)
diff --git a/pypy/module/cpyext/typeobject.py b/pypy/module/cpyext/typeobject.py
--- a/pypy/module/cpyext/typeobject.py
+++ b/pypy/module/cpyext/typeobject.py
@@ -931,7 +931,10 @@
if base:
inherit_special(space, pto, base)
for w_base in space.fixedview(from_ref(space, pto.c_tp_bases)):
- inherit_slots(space, pto, w_base)
+ if isinstance(w_base, W_TypeObject):
+ inherit_slots(space, pto, w_base)
+ #else:
+ # w_base is a W_ClassObject, ignore it
if not pto.c_tp_setattro:
from pypy.module.cpyext.object import PyObject_GenericSetAttr
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit