summaryrefslogtreecommitdiffstats
path: root/Modules/md5module.c
diff options
context:
space:
mode:
authorErlend Egeberg Aasland <erlend.aasland@innova.no>2021-05-27 07:48:19 (GMT)
committerGitHub <noreply@github.com>2021-05-27 07:48:19 (GMT)
commit6ef5ba391d700bde7ec3ffd5fb7132a30dd309c4 (patch)
tree920bbeb3c2745853751cc9eb115b43dd46a66c6f /Modules/md5module.c
parent59af59c2dfa52dcd5605185263f266a49ced934c (diff)
downloadcpython-6ef5ba391d700bde7ec3ffd5fb7132a30dd309c4.zip
cpython-6ef5ba391d700bde7ec3ffd5fb7132a30dd309c4.tar.gz
cpython-6ef5ba391d700bde7ec3ffd5fb7132a30dd309c4.tar.bz2
bpo-42972: Fully support GC for hashlib heap types (GH-26374)
Diffstat (limited to 'Modules/md5module.c')
-rw-r--r--Modules/md5module.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/Modules/md5module.c b/Modules/md5module.c
index 9067c27..b50d2e5 100644
--- a/Modules/md5module.c
+++ b/Modules/md5module.c
@@ -333,16 +333,25 @@ md5_get_state(PyObject *module)
static MD5object *
newMD5object(MD5State * st)
{
- return (MD5object *)PyObject_New(MD5object, st->md5_type);
+ MD5object *md5 = (MD5object *)PyObject_GC_New(MD5object, st->md5_type);
+ PyObject_GC_Track(md5);
+ return md5;
}
/* Internal methods for a hash object */
+static int
+MD5_traverse(PyObject *ptr, visitproc visit, void *arg)
+{
+ Py_VISIT(Py_TYPE(ptr));
+ return 0;
+}
static void
MD5_dealloc(PyObject *ptr)
{
PyTypeObject *tp = Py_TYPE(ptr);
- PyObject_Free(ptr);
+ PyObject_GC_UnTrack(ptr);
+ PyObject_GC_Del(ptr);
Py_DECREF(tp);
}
@@ -478,13 +487,15 @@ static PyType_Slot md5_type_slots[] = {
{Py_tp_dealloc, MD5_dealloc},
{Py_tp_methods, MD5_methods},
{Py_tp_getset, MD5_getseters},
+ {Py_tp_traverse, MD5_traverse},
{0,0}
};
static PyType_Spec md5_type_spec = {
.name = "_md5.md5",
.basicsize = sizeof(MD5object),
- .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION | Py_TPFLAGS_IMMUTABLETYPE,
+ .flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION |
+ Py_TPFLAGS_IMMUTABLETYPE | Py_TPFLAGS_HAVE_GC),
.slots = md5_type_slots
};