Skip to content

Commit 186562f

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

File tree

1 file changed

+21
-5
lines changed

1 file changed

+21
-5
lines changed

Modules/sha256module.c

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -382,22 +382,35 @@ sha_final(unsigned char digest[SHA_DIGESTSIZE], SHAobject *sha_info)
382382
static SHAobject *
383383
newSHA224object(_sha256_state *state)
384384
{
385-
return (SHAobject *)PyObject_New(SHAobject, state->sha224_type);
385+
SHAobject *sha = (SHAobject *)PyObject_GC_New(SHAobject,
386+
state->sha224_type);
387+
PyObject_GC_Track(sha);
388+
return sha;
386389
}
387390

388391
static SHAobject *
389392
newSHA256object(_sha256_state *state)
390393
{
391-
return (SHAobject *)PyObject_New(SHAobject, state->sha256_type);
394+
SHAobject *sha = (SHAobject *)PyObject_GC_New(SHAobject,
395+
state->sha256_type);
396+
PyObject_GC_Track(sha);
397+
return sha;
392398
}
393399

394400
/* Internal methods for a hash object */
401+
static int
402+
SHA_traverse(PyObject *ptr, visitproc visit, void *arg)
403+
{
404+
Py_VISIT(Py_TYPE(ptr));
405+
return 0;
406+
}
395407

396408
static void
397409
SHA_dealloc(PyObject *ptr)
398410
{
399411
PyTypeObject *tp = Py_TYPE(ptr);
400-
PyObject_Free(ptr);
412+
PyObject_GC_UnTrack(ptr);
413+
PyObject_GC_Del(ptr);
401414
Py_DECREF(tp);
402415
}
403416

@@ -538,20 +551,23 @@ static PyType_Slot sha256_types_slots[] = {
538551
{Py_tp_methods, SHA_methods},
539552
{Py_tp_members, SHA_members},
540553
{Py_tp_getset, SHA_getseters},
554+
{Py_tp_traverse, SHA_traverse},
541555
{0,0}
542556
};
543557

544558
static PyType_Spec sha224_type_spec = {
545559
.name = "_sha256.sha224",
546560
.basicsize = sizeof(SHAobject),
547-
.flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION | Py_TPFLAGS_IMMUTABLETYPE,
561+
.flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION |
562+
Py_TPFLAGS_IMMUTABLETYPE | Py_TPFLAGS_HAVE_GC),
548563
.slots = sha256_types_slots
549564
};
550565

551566
static PyType_Spec sha256_type_spec = {
552567
.name = "_sha256.sha256",
553568
.basicsize = sizeof(SHAobject),
554-
.flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION | Py_TPFLAGS_IMMUTABLETYPE,
569+
.flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION |
570+
Py_TPFLAGS_IMMUTABLETYPE | Py_TPFLAGS_HAVE_GC),
555571
.slots = sha256_types_slots
556572
};
557573

0 commit comments

Comments
 (0)