@@ -333,16 +333,25 @@ md5_get_state(PyObject *module)
333333static MD5object *
334334newMD5object (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
341349static void
342350MD5_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
484494static 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
0 commit comments