From b8eb3765908c0063f0739595ba4b296cc8863d19 Mon Sep 17 00:00:00 2001 From: Erlend Egeberg Aasland Date: Sun, 3 Jan 2021 14:11:15 +0100 Subject: [PATCH] bpo-40077: Add traverse/clear/free to arraymodule (GH-24066) --- Modules/arraymodule.c | 39 +++++++++++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/Modules/arraymodule.c b/Modules/arraymodule.c index 12bd5170557..e7d5ab77a6d 100644 --- a/Modules/arraymodule.c +++ b/Modules/arraymodule.c @@ -2977,18 +2977,42 @@ static PyType_Spec arrayiter_spec = { /*********************** Install Module **************************/ +static int +array_traverse(PyObject *module, visitproc visit, void *arg) +{ + array_state *state = get_array_state(module); + Py_VISIT(state->ArrayType); + Py_VISIT(state->ArrayIterType); + return 0; +} + +static int +array_clear(PyObject *module) +{ + array_state *state = get_array_state(module); + Py_CLEAR(state->ArrayType); + Py_CLEAR(state->ArrayIterType); + return 0; +} + +static void +array_free(void *module) +{ + array_clear((PyObject *)module); +} + /* No functions in array module. */ static PyMethodDef a_methods[] = { ARRAY__ARRAY_RECONSTRUCTOR_METHODDEF {NULL, NULL, 0, NULL} /* Sentinel */ }; -#define CREATE_TYPE(module, type, spec) \ -do { \ - type = (PyTypeObject *)PyType_FromModuleAndSpec(m, spec, NULL); \ - if (type == NULL) { \ - return -1; \ - } \ +#define CREATE_TYPE(module, type, spec) \ +do { \ + type = (PyTypeObject *)PyType_FromModuleAndSpec(module, spec, NULL); \ + if (type == NULL) { \ + return -1; \ + } \ } while (0) static int @@ -3059,6 +3083,9 @@ static struct PyModuleDef arraymodule = { .m_doc = module_doc, .m_methods = a_methods, .m_slots = arrayslots, + .m_traverse = array_traverse, + .m_clear = array_clear, + .m_free = array_free, };