[pypy-commit] pypy missing-tp_new: add another c-level type to the inheritance scheme, test still passes

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


Author: Matti Picus <matti.picus at gmail.com>
Branch: missing-tp_new
Changeset: r89276:4fd301bef4de
Date: 2016-12-30 08:01 +0200
http://bitbucket.org/pypy/pypy/changeset/4fd301bef4de/

Log:	add another c-level type to the inheritance scheme, test still
	passes

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
@@ -107,7 +107,7 @@
                 PyObject * one = PyLong_FromLong(1);
                 PyObject * a = PyTuple_Pack(3, one, one, one);
                 PyObject * k = NULL;
-                obj = _Timestamp.tp_new(&_Timestamp, a, k);
+                obj = Timestamp.tp_new(&Timestamp, a, k);
                 Py_DECREF(one);
                 return obj;
              '''),
@@ -116,6 +116,12 @@
                 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 PyObject*
                 timestamp_new(PyTypeObject* t, PyObject* a, PyObject* k)
                 {
                     foocnt ++;
@@ -127,6 +133,12 @@
                     foocnt --;
                     datetime_cls->tp_dealloc(op);
                 }
+                static void 
+                _timestamp_dealloc(PyObject *op)
+                {
+                    foocnt --;
+                    datetime_cls->tp_dealloc(op);
+                }
                  
 
                 static PyTypeObject _Timestamp = {
@@ -135,6 +147,14 @@
                     "foo._Timestamp",   /* tp_name*/
                     0,                  /* tp_basicsize*/
                     0,                  /* tp_itemsize */
+                    _timestamp_dealloc   /* tp_dealloc  */
+                };
+                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='''
@@ -145,10 +165,14 @@
                 if (datetime_cls == NULL) INITERROR;
                 _Timestamp.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE;
                 _Timestamp.tp_base = datetime_cls;
-                _Timestamp.tp_new = timestamp_new;
+                _Timestamp.tp_new = _timestamp_new;
                 Py_DECREF(mod);
                 Py_DECREF(dt);
                 if (PyType_Ready(&_Timestamp) < 0) INITERROR;
+                Timestamp.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE;
+                Timestamp.tp_base = &_Timestamp;
+                Timestamp.tp_new = timestamp_new;
+                if (PyType_Ready(&Timestamp) < 0) INITERROR;
             ''')
         import gc, sys
         cnt = module.get_cnt()


More information about the pypy-commit mailing list