Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 6ef5ba3

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

File tree

Expand file treeCollapse file tree

4 files changed

+69
-16
lines changed
Filter options
Expand file treeCollapse file tree

4 files changed

+69
-16
lines changed

‎Modules/md5module.c

Copy file name to clipboardExpand all lines: Modules/md5module.c
+14-3Lines changed: 14 additions & 3 deletions
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

Copy file name to clipboardExpand all lines: Modules/sha1module.c
+14-3Lines changed: 14 additions & 3 deletions
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

Copy file name to clipboardExpand all lines: Modules/sha256module.c
+21-5Lines 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

‎Modules/sha512module.c

Copy file name to clipboardExpand all lines: Modules/sha512module.c
+20-5Lines 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 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.