mirror of
https://github.com/python/cpython.git
synced 2025-10-10 00:43:41 +00:00
Add GC support to count() objects.
This commit is contained in:
parent
d67c60ff81
commit
d6280f4b78
2 changed files with 19 additions and 4 deletions
|
@ -979,6 +979,11 @@ class TestGC(unittest.TestCase):
|
||||||
a = []
|
a = []
|
||||||
self.makecycle(compress('ABCDEF', [1,0,1,0,1,0]), a)
|
self.makecycle(compress('ABCDEF', [1,0,1,0,1,0]), a)
|
||||||
|
|
||||||
|
def test_count(self):
|
||||||
|
a = []
|
||||||
|
Int = type('Int', (int,), dict(x=a))
|
||||||
|
self.makecycle(count(Int(0), Int(1)), a)
|
||||||
|
|
||||||
def test_cycle(self):
|
def test_cycle(self):
|
||||||
a = []
|
a = []
|
||||||
self.makecycle(cycle([a]*2), a)
|
self.makecycle(cycle([a]*2), a)
|
||||||
|
|
|
@ -2954,7 +2954,7 @@ count_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
||||||
cnt == PY_SSIZE_T_MAX && long_cnt != NULL);
|
cnt == PY_SSIZE_T_MAX && long_cnt != NULL);
|
||||||
|
|
||||||
/* create countobject structure */
|
/* create countobject structure */
|
||||||
lz = (countobject *)PyObject_New(countobject, &count_type);
|
lz = (countobject *)type->tp_alloc(type, 0);
|
||||||
if (lz == NULL) {
|
if (lz == NULL) {
|
||||||
Py_XDECREF(long_cnt);
|
Py_XDECREF(long_cnt);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -2969,9 +2969,17 @@ count_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
||||||
static void
|
static void
|
||||||
count_dealloc(countobject *lz)
|
count_dealloc(countobject *lz)
|
||||||
{
|
{
|
||||||
|
PyObject_GC_UnTrack(lz);
|
||||||
Py_XDECREF(lz->long_cnt);
|
Py_XDECREF(lz->long_cnt);
|
||||||
Py_XDECREF(lz->long_step);
|
Py_XDECREF(lz->long_step);
|
||||||
PyObject_Del(lz);
|
Py_TYPE(lz)->tp_free(lz);
|
||||||
|
}
|
||||||
|
|
||||||
|
count_traverse(countobject *lz, visitproc visit, void *arg)
|
||||||
|
{
|
||||||
|
Py_VISIT(lz->long_cnt);
|
||||||
|
Py_VISIT(lz->long_step);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
|
@ -3058,9 +3066,10 @@ static PyTypeObject count_type = {
|
||||||
PyObject_GenericGetAttr, /* tp_getattro */
|
PyObject_GenericGetAttr, /* tp_getattro */
|
||||||
0, /* tp_setattro */
|
0, /* tp_setattro */
|
||||||
0, /* tp_as_buffer */
|
0, /* tp_as_buffer */
|
||||||
Py_TPFLAGS_DEFAULT, /* tp_flags */
|
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
|
||||||
|
Py_TPFLAGS_BASETYPE, /* tp_flags */
|
||||||
count_doc, /* tp_doc */
|
count_doc, /* tp_doc */
|
||||||
0, /* tp_traverse */
|
(traverseproc)count_traverse, /* tp_traverse */
|
||||||
0, /* tp_clear */
|
0, /* tp_clear */
|
||||||
0, /* tp_richcompare */
|
0, /* tp_richcompare */
|
||||||
0, /* tp_weaklistoffset */
|
0, /* tp_weaklistoffset */
|
||||||
|
@ -3077,6 +3086,7 @@ static PyTypeObject count_type = {
|
||||||
0, /* tp_init */
|
0, /* tp_init */
|
||||||
0, /* tp_alloc */
|
0, /* tp_alloc */
|
||||||
count_new, /* tp_new */
|
count_new, /* tp_new */
|
||||||
|
PyObject_GC_Del, /* tp_free */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue