[3.10] gh-94207: Fix struct module leak (GH-94239) (GH-94266) · python/cpython@86e49a5

GitHub

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

14951495returnret;

14961496}

149714971498+staticint

1499+s_clear(PyStructObject*s)

1500+{

1501+Py_CLEAR(s->s_format);

1502+return0;

1503+}

1504+1505+staticint

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

1507+{

1508+Py_VISIT(Py_TYPE(s));

1509+Py_VISIT(s->s_format);

1510+return0;

1511+}

1512+14981513staticvoid

14991514s_dealloc(PyStructObject*s)

15001515{

15011516PyTypeObject*tp=Py_TYPE(s);

1517+PyObject_GC_UnTrack(s);

15021518if (s->weakreflist!=NULL)

15031519PyObject_ClearWeakRefs((PyObject*)s);

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

@@ -2079,21 +2095,23 @@ static PyType_Slot PyStructType_slots[] = {

20792095 {Py_tp_getattro, PyObject_GenericGetAttr},

20802096 {Py_tp_setattro, PyObject_GenericSetAttr},

20812097 {Py_tp_doc, (void*)s__doc__},

2098+ {Py_tp_traverse, s_traverse},

2099+ {Py_tp_clear, s_clear},

20822100 {Py_tp_methods, s_methods},

20832101 {Py_tp_members, s_members},

20842102 {Py_tp_getset, s_getsetlist},

20852103 {Py_tp_init, Struct___init__},

20862104 {Py_tp_alloc, PyType_GenericAlloc},

20872105 {Py_tp_new, s_new},

2088- {Py_tp_free, PyObject_Del},

2106+ {Py_tp_free, PyObject_GC_Del},

20892107 {0, 0},

20902108};

2091210920922110staticPyType_SpecPyStructType_spec= {

20932111"_struct.Struct",

20942112sizeof(PyStructObject),

209521130,

2096-Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,

2114+Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE,

20972115PyStructType_slots

20982116};

20992117