[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