Skip to content

Commit 6ef5ba3

Browse files
author
Erlend Egeberg Aasland
authored
bpo-42972: Fully support GC for hashlib heap types (GH-26374)
1 parent 59af59c commit 6ef5ba3

File tree

4 files changed

+69
-16
lines changed

4 files changed

+69
-16
lines changed

Modules/md5module.c

+14-3
Original file line numberDiff line numberDiff line change
@@ -333,16 +333,25 @@ md5_get_state(PyObject *module)
333333
static MD5object *
334334
newMD5object(MD5State * st)
335335
{
336-
return (MD5object *)PyObject_New(MD5object, st->md5_type);
336+
MD5object *md5 = (MD5object *)PyObject_GC_New(MD5object, st->md5_type);
337+
PyObject_GC_Track(md5);
338+
return md5;
337339
}
338340

339341
/* Internal methods for a hash object */
342+
static int
343+
MD5_traverse(PyObject *ptr, visitproc visit, void *arg)
344+
{
345+
Py_VISIT(Py_TYPE(ptr));
346+
return 0;
347+
}
340348

341349
static void
342350
MD5_dealloc(PyObject *ptr)
343351
{
344352
PyTypeObject *tp = Py_TYPE(ptr);
345-
PyObject_Free(ptr);
353+
PyObject_GC_UnTrack(ptr);
354+
PyObject_GC_Del(ptr);
346355
Py_DECREF(tp);
347356
}
348357

@@ -478,13 +487,15 @@ static PyType_Slot md5_type_slots[] = {
478487
{Py_tp_dealloc, MD5_dealloc},
479488
{Py_tp_methods, MD5_methods},
480489
{Py_tp_getset, MD5_getseters},
490+
{Py_tp_traverse, MD5_traverse},
481491
{0,0}
482492
};
483493

484494
static PyType_Spec md5_type_spec = {
485495
.name = "_md5.md5",
486496
.basicsize = sizeof(MD5object),
487-
.flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION | Py_TPFLAGS_IMMUTABLETYPE,
497+
.flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION |
498+
Py_TPFLAGS_IMMUTABLETYPE | Py_TPFLAGS_HAVE_GC),
488499
.slots = md5_type_slots
489500
};
490501

Modules/sha1module.c

+14-3
Original file line numberDiff line numberDiff line change
@@ -310,17 +310,26 @@ sha1_get_state(PyObject *module)
310310
static SHA1object *
311311
newSHA1object(SHA1State *st)
312312
{
313-
return (SHA1object *)PyObject_New(SHA1object, st->sha1_type);
313+
SHA1object *sha = (SHA1object *)PyObject_GC_New(SHA1object, st->sha1_type);
314+
PyObject_GC_Track(sha);
315+
return sha;
314316
}
315317

316318

317319
/* Internal methods for a hash object */
320+
static int
321+
SHA1_traverse(PyObject *ptr, visitproc visit, void *arg)
322+
{
323+
Py_VISIT(Py_TYPE(ptr));
324+
return 0;
325+
}
318326

319327
static void
320328
SHA1_dealloc(PyObject *ptr)
321329
{
322330
PyTypeObject *tp = Py_TYPE(ptr);
323-
PyObject_Free(ptr);
331+
PyObject_GC_UnTrack(ptr);
332+
PyObject_GC_Del(ptr);
324333
Py_DECREF(tp);
325334
}
326335

@@ -456,13 +465,15 @@ static PyType_Slot sha1_type_slots[] = {
456465
{Py_tp_dealloc, SHA1_dealloc},
457466
{Py_tp_methods, SHA1_methods},
458467
{Py_tp_getset, SHA1_getseters},
468+
{Py_tp_traverse, SHA1_traverse},
459469
{0,0}
460470
};
461471

462472
static PyType_Spec sha1_type_spec = {
463473
.name = "_sha1.sha1",
464474
.basicsize = sizeof(SHA1object),
465-
.flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION | Py_TPFLAGS_IMMUTABLETYPE,
475+
.flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION |
476+
Py_TPFLAGS_IMMUTABLETYPE | Py_TPFLAGS_HAVE_GC),
466477
.slots = sha1_type_slots
467478
};
468479

Modules/sha256module.c

+21-5
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

Modules/sha512module.c

+20-5
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)