[3.10] bpo-42972: Fully support GC for hashlib heap types (GH-26374) (GH-26398)
(cherry picked from commit 6ef5ba391d700bde7ec3ffd5fb7132a30dd309c4)
Co-authored-by: Erlend Egeberg Aasland <erlend.aasland@innova.no>
Automerge-Triggered-By: GH:tiran
diff --git a/Modules/sha256module.c b/Modules/sha256module.c
index 1edb9dc..fac7073 100644
--- a/Modules/sha256module.c
+++ b/Modules/sha256module.c
@@ -382,22 +382,35 @@ sha_final(unsigned char digest[SHA_DIGESTSIZE], SHAobject *sha_info)
static SHAobject *
newSHA224object(_sha256_state *state)
{
- return (SHAobject *)PyObject_New(SHAobject, state->sha224_type);
+ SHAobject *sha = (SHAobject *)PyObject_GC_New(SHAobject,
+ state->sha224_type);
+ PyObject_GC_Track(sha);
+ return sha;
}
static SHAobject *
newSHA256object(_sha256_state *state)
{
- return (SHAobject *)PyObject_New(SHAobject, state->sha256_type);
+ SHAobject *sha = (SHAobject *)PyObject_GC_New(SHAobject,
+ state->sha256_type);
+ PyObject_GC_Track(sha);
+ return sha;
}
/* Internal methods for a hash object */
+static int
+SHA_traverse(PyObject *ptr, visitproc visit, void *arg)
+{
+ Py_VISIT(Py_TYPE(ptr));
+ return 0;
+}
static void
SHA_dealloc(PyObject *ptr)
{
PyTypeObject *tp = Py_TYPE(ptr);
- PyObject_Free(ptr);
+ PyObject_GC_UnTrack(ptr);
+ PyObject_GC_Del(ptr);
Py_DECREF(tp);
}
@@ -538,20 +551,23 @@ static PyType_Slot sha256_types_slots[] = {
{Py_tp_methods, SHA_methods},
{Py_tp_members, SHA_members},
{Py_tp_getset, SHA_getseters},
+ {Py_tp_traverse, SHA_traverse},
{0,0}
};
static PyType_Spec sha224_type_spec = {
.name = "_sha256.sha224",
.basicsize = sizeof(SHAobject),
- .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 = sha256_types_slots
};
static PyType_Spec sha256_type_spec = {
.name = "_sha256.sha256",
.basicsize = sizeof(SHAobject),
- .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 = sha256_types_slots
};