@@ -438,22 +438,33 @@ sha512_get_state(PyObject *module)
438438static SHAobject *
439439newSHA384object (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
444446static SHAobject *
445447newSHA512object (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
452462static void
453463SHA512_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
602614static 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[] = {
619633static 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