[pypy-commit] pypy missing-tp_new: a passing test of subtype_dealloc

mattip pypy.commits at gmail.com
Fri Dec 30 04:58:37 EST 2016


Author: Matti Picus <matti.picus at gmail.com>
Branch: missing-tp_new
Changeset: r89275:c9438dc074aa
Date: 2016-12-30 00:45 +0200
http://bitbucket.org/pypy/pypy/changeset/c9438dc074aa/

Log:	a passing test of subtype_dealloc

diff --git a/pypy/module/cpyext/test/test_userslots.py b/pypy/module/cpyext/test/test_userslots.py
--- a/pypy/module/cpyext/test/test_userslots.py
+++ b/pypy/module/cpyext/test/test_userslots.py
@@ -96,3 +96,68 @@
         s = module.tp_str(type(A()), A())
         assert 'A object' in s
 
+    def test_tp_deallocate(self):
+        module = self.import_extension('foo', [
+            ("get_cnt", "METH_NOARGS",
+            '''
+                return PyLong_FromLong(foocnt);
+            '''),
+            ("get_timestamp", "METH_NOARGS",
+            '''
+                PyObject * one = PyLong_FromLong(1);
+                PyObject * a = PyTuple_Pack(3, one, one, one);
+                PyObject * k = NULL;
+                obj = _Timestamp.tp_new(&_Timestamp, a, k);
+                Py_DECREF(one);
+                return obj;
+             '''),
+            ], prologue='''
+                static int foocnt = 0;
+                static PyTypeObject* datetime_cls = NULL;
+                static PyObject * obj = NULL;
+                static PyObject*
+                timestamp_new(PyTypeObject* t, PyObject* a, PyObject* k)
+                {
+                    foocnt ++;
+                    return datetime_cls->tp_new(t, a, k);
+                }
+                static void 
+                timestamp_dealloc(PyObject *op)
+                {
+                    foocnt --;
+                    datetime_cls->tp_dealloc(op);
+                }
+                 
+
+                static PyTypeObject _Timestamp = {
+                    PyObject_HEAD_INIT(NULL)
+                    0,                            /* ob_size */
+                    "foo._Timestamp",   /* tp_name*/
+                    0,                  /* tp_basicsize*/
+                    0,                  /* tp_itemsize */
+                    timestamp_dealloc   /* tp_dealloc  */
+                };
+            ''', more_init='''
+                PyObject * mod = PyImport_ImportModule("datetime");
+                if (mod == NULL) INITERROR;
+                PyObject * dt = PyString_FromString("datetime");
+                datetime_cls = (PyTypeObject*)PyObject_GetAttr(mod, dt); 
+                if (datetime_cls == NULL) INITERROR;
+                _Timestamp.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE;
+                _Timestamp.tp_base = datetime_cls;
+                _Timestamp.tp_new = timestamp_new;
+                Py_DECREF(mod);
+                Py_DECREF(dt);
+                if (PyType_Ready(&_Timestamp) < 0) INITERROR;
+            ''')
+        import gc, sys
+        cnt = module.get_cnt()
+        assert cnt == 0
+        obj = module.get_timestamp()
+        cnt = module.get_cnt()
+        assert cnt == 1
+        assert obj.year == 1
+        del obj
+        self.debug_collect()
+        cnt = module.get_cnt()
+        assert cnt == 0


More information about the pypy-commit mailing list