[pypy-commit] pypy default: Found the next bug: when you have a Python subclass of a C API type, and

arigo pypy.commits at gmail.com
Mon May 9 05:49:02 EDT 2016


Author: Armin Rigo <arigo at tunes.org>
Branch: 
Changeset: r84332:adc30cc041ed
Date: 2016-05-09 11:48 +0200
http://bitbucket.org/pypy/pypy/changeset/adc30cc041ed/

Log:	Found the next bug: when you have a Python subclass of a C API type,
	and when you instantiate this Python subclass using C code (!), then
	tp_new is not called

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
@@ -942,6 +942,14 @@
                 Py_INCREF(&Foo_Type);
                 return (PyObject *)&Foo_Type;
              """),
+            ("newInstance", "METH_O",
+             """
+                PyTypeObject *tp = (PyTypeObject *)args;
+                PyObject *e = PyTuple_New(0);
+                PyObject *o = tp->tp_new(tp, e, NULL);
+                Py_DECREF(e);
+                return o;
+             """),
             ("getCounter", "METH_VARARGS",
              """
                 return PyInt_FromLong(foo_counter);
@@ -1000,3 +1008,17 @@
                 break
             self.debug_collect()
         assert module.getCounter() == 5050
+        #
+        module.newInstance(Foo)
+        for i in range(10):
+            if module.getCounter() >= 6060:
+                break
+            self.debug_collect()
+        assert module.getCounter() == 6060
+        #
+        module.newInstance(Bar)
+        for i in range(10):
+            if module.getCounter() >= 7070:
+                break
+            self.debug_collect()
+        #assert module.getCounter() == 7070    -- oops, bug!


More information about the pypy-commit mailing list