Index: Modules/gcmodule.c =================================================================== RCS file: /cvsroot/python/python/dist/src/Modules/gcmodule.c,v retrieving revision 2.36 diff -u -r2.36 gcmodule.c --- Modules/gcmodule.c 22 Mar 2002 15:41:03 -0000 2.36 +++ Modules/gcmodule.c 27 Mar 2002 22:14:13 -0000 @@ -813,13 +813,16 @@ void _PyObject_GC_Track(PyObject *op) { + _PyObject_GC_TRACK(op); } void _PyObject_GC_UnTrack(PyObject *op) { - _PyObject_GC_UNTRACK(op); + PyGC_Head *gc = AS_GC(op); + if (gc->gc.gc_next != NULL) + _PyObject_GC_UNTRACK(op); } PyObject * Index: Objects/dictobject.c =================================================================== RCS file: /cvsroot/python/python/dist/src/Objects/dictobject.c,v retrieving revision 2.120 diff -u -r2.120 dictobject.c --- Objects/dictobject.c 22 Mar 2002 15:26:09 -0000 2.120 +++ Objects/dictobject.c 27 Mar 2002 22:14:14 -0000 @@ -694,8 +694,8 @@ { register dictentry *ep; int fill = mp->ma_fill; + PyObject_GC_UnTrack(mp); Py_TRASHCAN_SAFE_BEGIN(mp) - _PyObject_GC_UNTRACK(mp); for (ep = mp->ma_table; fill > 0; ep++) { if (ep->me_key) { --fill; Index: Objects/frameobject.c =================================================================== RCS file: /cvsroot/python/python/dist/src/Objects/frameobject.c,v retrieving revision 2.59 diff -u -r2.59 frameobject.c --- Objects/frameobject.c 6 Dec 2001 15:48:16 -0000 2.59 +++ Objects/frameobject.c 27 Mar 2002 22:14:14 -0000 @@ -67,8 +67,8 @@ PyObject **fastlocals; PyObject **p; + PyObject_GC_UnTrack(f); Py_TRASHCAN_SAFE_BEGIN(f) - _PyObject_GC_UNTRACK(f); /* Kill all local variables */ slots = f->f_nlocals + f->f_ncells + f->f_nfreevars; fastlocals = f->f_localsplus; Index: Objects/listobject.c =================================================================== RCS file: /cvsroot/python/python/dist/src/Objects/listobject.c,v retrieving revision 2.103 diff -u -r2.103 listobject.c --- Objects/listobject.c 3 Dec 2001 16:32:18 -0000 2.103 +++ Objects/listobject.c 27 Mar 2002 22:14:14 -0000 @@ -195,8 +195,8 @@ list_dealloc(PyListObject *op) { int i; + PyObject_GC_UnTrack(op); Py_TRASHCAN_SAFE_BEGIN(op) - _PyObject_GC_UNTRACK(op); if (op->ob_item != NULL) { /* Do it backwards, for Christian Tismer. There's a simple test case where somehow this reduces Index: Objects/tupleobject.c =================================================================== RCS file: /cvsroot/python/python/dist/src/Objects/tupleobject.c,v retrieving revision 2.62 diff -u -r2.62 tupleobject.c --- Objects/tupleobject.c 7 Dec 2001 20:00:04 -0000 2.62 +++ Objects/tupleobject.c 27 Mar 2002 22:14:14 -0000 @@ -139,8 +139,8 @@ { register int i; register int len = op->ob_size; + PyObject_GC_UnTrack(op); Py_TRASHCAN_SAFE_BEGIN(op) - _PyObject_GC_UNTRACK(op); if (len > 0) { i = len; while (--i >= 0)