[pypy-commit] pypy cpyext-ext: add passing test for multiple inheritance

mattip pypy.commits at gmail.com
Mon Jan 25 15:15:03 EST 2016


Author: mattip <matti.picus at gmail.com>
Branch: cpyext-ext
Changeset: r81935:df9304236c27
Date: 2016-01-25 21:58 +0200
http://bitbucket.org/pypy/pypy/changeset/df9304236c27/

Log:	add passing test for multiple inheritance

diff --git a/pypy/module/cpyext/test/foo.c b/pypy/module/cpyext/test/foo.c
--- a/pypy/module/cpyext/test/foo.c
+++ b/pypy/module/cpyext/test/foo.c
@@ -371,6 +371,12 @@
     0           /*tp_weaklist*/
 };
 
+PyTypeObject UnicodeSubtype3 = {
+    PyObject_HEAD_INIT(NULL)
+    0,
+    "foo.fuu3",
+    sizeof(UnicodeSubclassObject)
+};
 
 /* A Metatype */
 
@@ -777,6 +783,14 @@
     CustomType.ob_type = &MetaType;
     if (PyType_Ready(&CustomType) < 0)
         return;
+
+    UnicodeSubtype3.tp_flags = Py_TPFLAGS_DEFAULT;
+    UnicodeSubtype3.tp_base = &UnicodeSubtype;
+    UnicodeSubtype3.tp_bases = Py_BuildValue("(OO)", &UnicodeSubtype,
+                                                    &CustomType);
+    if (PyType_Ready(&UnicodeSubtype3) < 0)
+        return;
+
     m = Py_InitModule("foo", foo_functions);
     if (m == NULL)
         return;
@@ -789,6 +803,8 @@
         return;
     if (PyDict_SetItemString(d, "UnicodeSubtype2", (PyObject *) &UnicodeSubtype2) < 0)
         return;
+    if (PyDict_SetItemString(d, "UnicodeSubtype3", (PyObject *) &UnicodeSubtype3) < 0)
+        return;
     if (PyDict_SetItemString(d, "MetaType", (PyObject *) &MetaType) < 0)
         return;
     if (PyDict_SetItemString(d, "InitErrType", (PyObject *) &InitErrType) < 0)
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
@@ -150,6 +150,14 @@
         assert fuu2(u"abc").baz().escape()
         raises(TypeError, module.fooType.object_member.__get__, 1)
 
+    def test_multiple_inheritance(self):
+        module = self.import_module(name='foo')
+        obj = module.UnicodeSubtype(u'xyz')
+        obj2 = module.UnicodeSubtype2()
+        obj3 = module.UnicodeSubtype3()
+        assert obj3.get_val() == 42
+        assert len(type(obj3).mro()) == 6
+
     def test_init(self):
         module = self.import_module(name="foo")
         newobj = module.UnicodeSubtype()
@@ -416,15 +424,15 @@
         module = self.import_extension('foo', [
             ("test_tp_getattro", "METH_VARARGS",
              '''
-                 PyObject *obj = PyTuple_GET_ITEM(args, 0);
-                 PyIntObject *value = PyTuple_GET_ITEM(args, 1);
+                 PyObject *name, *obj = PyTuple_GET_ITEM(args, 0);
+                 PyIntObject *attr, *value = PyTuple_GET_ITEM(args, 1);
                  if (!obj->ob_type->tp_getattro)
                  {
                      PyErr_SetString(PyExc_ValueError, "missing tp_getattro");
                      return NULL;
                  }
-                 PyObject *name = PyString_FromString("attr1");
-                 PyIntObject *attr = obj->ob_type->tp_getattro(obj, name);
+                 name = PyString_FromString("attr1");
+                 attr = obj->ob_type->tp_getattro(obj, name);
                  if (attr->ob_ival != value->ob_ival)
                  {
                      PyErr_SetString(PyExc_ValueError,
@@ -705,13 +713,13 @@
             static PyObject * 
             intlike_nb_add(PyObject *self, PyObject *other)
             {
-                long val1 = ((IntLikeObject *)(self))->ival;
+                long val2, val1 = ((IntLikeObject *)(self))->ival;
                 if (PyInt_Check(other)) {
                   long val2 = PyInt_AsLong(other);
                   return PyInt_FromLong(val1+val2);
                 }
 
-                long val2 = ((IntLikeObject *)(other))->ival;
+                val2 = ((IntLikeObject *)(other))->ival;
                 return PyInt_FromLong(val1+val2);
             }
 


More information about the pypy-commit mailing list