Skip to content

Commit 711f59f

Browse files
author
Erlend E. Aasland
committed
bpo-42972: Fully implement GC protocol for arraymodule types
1 parent 4aeee0b commit 711f59f

File tree

1 file changed

+11
-2
lines changed

1 file changed

+11
-2
lines changed

Modules/arraymodule.c

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -661,10 +661,18 @@ ins1(arrayobject *self, Py_ssize_t where, PyObject *v)
661661

662662
/* Methods */
663663

664+
static int
665+
array_tp_traverse(arrayobject *op, visitproc visit, void *arg)
666+
{
667+
Py_VISIT(Py_TYPE(op));
668+
return 0;
669+
}
670+
664671
static void
665672
array_dealloc(arrayobject *op)
666673
{
667674
PyTypeObject *tp = Py_TYPE(op);
675+
PyObject_GC_UnTrack(op);
668676

669677
if (op->weakreflist != NULL)
670678
PyObject_ClearWeakRefs((PyObject *) op);
@@ -2820,7 +2828,7 @@ static PyType_Slot array_slots[] = {
28202828
{Py_tp_getset, array_getsets},
28212829
{Py_tp_alloc, PyType_GenericAlloc},
28222830
{Py_tp_new, array_new},
2823-
{Py_tp_free, PyObject_Del},
2831+
{Py_tp_traverse, array_tp_traverse},
28242832

28252833
/* as sequence */
28262834
{Py_sq_length, array_length},
@@ -2848,7 +2856,7 @@ static PyType_Spec array_spec = {
28482856
.name = "array.array",
28492857
.basicsize = sizeof(arrayobject),
28502858
.flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
2851-
Py_TPFLAGS_IMMUTABLETYPE |
2859+
Py_TPFLAGS_IMMUTABLETYPE | Py_TPFLAGS_HAVE_GC |
28522860
Py_TPFLAGS_SEQUENCE),
28532861
.slots = array_slots,
28542862
};
@@ -2922,6 +2930,7 @@ arrayiter_dealloc(arrayiterobject *it)
29222930
static int
29232931
arrayiter_traverse(arrayiterobject *it, visitproc visit, void *arg)
29242932
{
2933+
Py_VISIT(Py_TYPE(it));
29252934
Py_VISIT(it->ao);
29262935
return 0;
29272936
}

0 commit comments

Comments
 (0)