Commit a3b10bb2 authored by Guido van Rossum's avatar Guido van Rossum

This is Neil's fix for SF bug 535905 (Evil Trashcan and GC interaction).

The fix makes it possible to call PyObject_GC_UnTrack() more than once
on the same object, and then move the PyObject_GC_UnTrack() call to
*before* the trashcan code is invoked.

BUGFIX CANDIDATE!
parent b69e8294
......@@ -819,7 +819,9 @@ _PyObject_GC_Track(PyObject *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 *
......
......@@ -694,8 +694,8 @@ dict_dealloc(register dictobject *mp)
{
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;
......
......@@ -67,8 +67,8 @@ frame_dealloc(PyFrameObject *f)
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;
......
......@@ -195,8 +195,8 @@ static void
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
......
......@@ -139,8 +139,8 @@ tupledealloc(register PyTupleObject *op)
{
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)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment