@@ -333,16 +333,25 @@ md5_get_state(PyObject *module)
333
333
static MD5object *
334
334
newMD5object (MD5State * st )
335
335
{
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 ;
337
339
}
338
340
339
341
/* 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
+ }
340
348
341
349
static void
342
350
MD5_dealloc (PyObject * ptr )
343
351
{
344
352
PyTypeObject * tp = Py_TYPE (ptr );
345
- PyObject_Free (ptr );
353
+ PyObject_GC_UnTrack (ptr );
354
+ PyObject_GC_Del (ptr );
346
355
Py_DECREF (tp );
347
356
}
348
357
@@ -478,13 +487,15 @@ static PyType_Slot md5_type_slots[] = {
478
487
{Py_tp_dealloc , MD5_dealloc },
479
488
{Py_tp_methods , MD5_methods },
480
489
{Py_tp_getset , MD5_getseters },
490
+ {Py_tp_traverse , MD5_traverse },
481
491
{0 ,0 }
482
492
};
483
493
484
494
static PyType_Spec md5_type_spec = {
485
495
.name = "_md5.md5" ,
486
496
.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 ),
488
499
.slots = md5_type_slots
489
500
};
490
501
0 commit comments