Skip to content

Commit b2817ab

Browse files
author
Erlend E. Aasland
committed
bpo-42972: Fully support GC for sha512 heap types
1 parent 186562f commit b2817ab

File tree

1 file changed

+20
-5
lines changed

1 file changed

+20
-5
lines changed

Modules/sha512module.c

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -438,22 +438,33 @@ sha512_get_state(PyObject *module)
438438
static SHAobject *
439439
newSHA384object(SHA512State *st)
440440
{
441-
return (SHAobject *)PyObject_New(SHAobject, st->sha384_type);
441+
SHAobject *sha = (SHAobject *)PyObject_GC_New(SHAobject, st->sha384_type);
442+
PyObject_GC_Track(sha);
443+
return sha;
442444
}
443445

444446
static SHAobject *
445447
newSHA512object(SHA512State *st)
446448
{
447-
return (SHAobject *)PyObject_New(SHAobject, st->sha512_type);
449+
SHAobject *sha = (SHAobject *)PyObject_GC_New(SHAobject, st->sha512_type);
450+
PyObject_GC_Track(sha);
451+
return sha;
448452
}
449453

450454
/* Internal methods for a hash object */
455+
static int
456+
SHA_traverse(PyObject *ptr, visitproc visit, void *arg)
457+
{
458+
Py_VISIT(Py_TYPE(ptr));
459+
return 0;
460+
}
451461

452462
static void
453463
SHA512_dealloc(PyObject *ptr)
454464
{
455465
PyTypeObject *tp = Py_TYPE(ptr);
456-
PyObject_Free(ptr);
466+
PyObject_GC_UnTrack(ptr);
467+
PyObject_GC_Del(ptr);
457468
Py_DECREF(tp);
458469
}
459470

@@ -596,13 +607,15 @@ static PyType_Slot sha512_sha384_type_slots[] = {
596607
{Py_tp_methods, SHA_methods},
597608
{Py_tp_members, SHA_members},
598609
{Py_tp_getset, SHA_getseters},
610+
{Py_tp_traverse, SHA_traverse},
599611
{0,0}
600612
};
601613

602614
static PyType_Spec sha512_sha384_type_spec = {
603615
.name = "_sha512.sha384",
604616
.basicsize = sizeof(SHAobject),
605-
.flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION | Py_TPFLAGS_IMMUTABLETYPE,
617+
.flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION |
618+
Py_TPFLAGS_IMMUTABLETYPE | Py_TPFLAGS_HAVE_GC),
606619
.slots = sha512_sha384_type_slots
607620
};
608621

@@ -611,6 +624,7 @@ static PyType_Slot sha512_sha512_type_slots[] = {
611624
{Py_tp_methods, SHA_methods},
612625
{Py_tp_members, SHA_members},
613626
{Py_tp_getset, SHA_getseters},
627+
{Py_tp_traverse, SHA_traverse},
614628
{0,0}
615629
};
616630

@@ -619,7 +633,8 @@ static PyType_Slot sha512_sha512_type_slots[] = {
619633
static PyType_Spec sha512_sha512_type_spec = {
620634
.name = "_sha512.sha512",
621635
.basicsize = sizeof(SHAobject),
622-
.flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION | Py_TPFLAGS_IMMUTABLETYPE,
636+
.flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION |
637+
Py_TPFLAGS_IMMUTABLETYPE | Py_TPFLAGS_HAVE_GC),
623638
.slots = sha512_sha512_type_slots
624639
};
625640

0 commit comments

Comments
 (0)