gh-94207: Fix struct module leak (GH-94239) (GH-94265) · python/cpython@4bc5f9f

GitHub

@@ -1496,10 +1496,26 @@ Struct___init___impl(PyStructObject *self, PyObject *format)

14961496returnret;

14971497}

149814981499+staticint

1500+s_clear(PyStructObject*s)

1501+{

1502+Py_CLEAR(s->s_format);

1503+return0;

1504+}

1505+1506+staticint

1507+s_traverse(PyStructObject*s, visitprocvisit, void*arg)

1508+{

1509+Py_VISIT(Py_TYPE(s));

1510+Py_VISIT(s->s_format);

1511+return0;

1512+}

1513+14991514staticvoid

15001515s_dealloc(PyStructObject*s)

15011516{

15021517PyTypeObject*tp=Py_TYPE(s);

1518+PyObject_GC_UnTrack(s);

15031519if (s->weakreflist!=NULL)

15041520PyObject_ClearWeakRefs((PyObject*)s);

15051521if (s->s_codes!=NULL) {

@@ -2078,21 +2094,23 @@ static PyType_Slot PyStructType_slots[] = {

20782094 {Py_tp_getattro, PyObject_GenericGetAttr},

20792095 {Py_tp_setattro, PyObject_GenericSetAttr},

20802096 {Py_tp_doc, (void*)s__doc__},

2097+ {Py_tp_traverse, s_traverse},

2098+ {Py_tp_clear, s_clear},

20812099 {Py_tp_methods, s_methods},

20822100 {Py_tp_members, s_members},

20832101 {Py_tp_getset, s_getsetlist},

20842102 {Py_tp_init, Struct___init__},

20852103 {Py_tp_alloc, PyType_GenericAlloc},

20862104 {Py_tp_new, s_new},

2087- {Py_tp_free, PyObject_Del},

2105+ {Py_tp_free, PyObject_GC_Del},

20882106 {0, 0},

20892107};

2090210820912109staticPyType_SpecPyStructType_spec= {

20922110"_struct.Struct",

20932111sizeof(PyStructObject),

209421120,

2095-Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,

2113+Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE,

20962114PyStructType_slots

20972115};

20982116