Neil Schemenauer: small fixes for GC
diff --git a/Include/objimpl.h b/Include/objimpl.h
index 665cec5..defdc9c 100644
--- a/Include/objimpl.h
+++ b/Include/objimpl.h
@@ -183,6 +183,8 @@
 	(PyVarObject *) PyObject_MALLOC( _PyObject_VAR_SIZE((typeobj),(n)) ),\
 	(typeobj), (n)) )
 
+#define PyObject_DEL(op) PyObject_FREE(op)
+
 /* This example code implements an object constructor with a custom
    allocator, where PyObject_New is inlined, and shows the important
    distinction between two steps (at least):
@@ -221,7 +223,7 @@
    PyObject_{New, VarNew, Del} to manage the memory.  Set the type flag
    Py_TPFLAGS_GC and define the type method tp_recurse.  You should also
    add the method tp_clear if your object is mutable.  Include
-   PyGC_INFO_SIZE in the calculation of tp_basicsize.  Call
+   PyGC_HEAD_SIZE in the calculation of tp_basicsize.  Call
    PyObject_GC_Init after the pointers followed by tp_recurse become
    valid (usually just before returning the object from the allocation
    method.  Call PyObject_GC_Fini before those pointers become invalid
@@ -234,7 +236,6 @@
 #define PyObject_GC_Fini(op)
 #define PyObject_AS_GC(op) (op)
 #define PyObject_FROM_GC(op) (op)
-#define PyObject_DEL(op) PyObject_FREE(op)
  
 #else
 
@@ -268,10 +269,6 @@
 /* Get the object given the PyGC_Head */
 #define PyObject_FROM_GC(g) ((PyObject *)(((PyGC_Head *)g)+1))
 
-#define PyObject_DEL(op) PyObject_FREE( PyObject_IS_GC(op) ? \
-					(ANY *)PyObject_AS_GC(op) : \
-					(ANY *)(op) )
-
 #endif /* WITH_CYCLE_GC */
 
 #ifdef __cplusplus
diff --git a/Objects/classobject.c b/Objects/classobject.c
index 4a7de7b..4f73ff8 100644
--- a/Objects/classobject.c
+++ b/Objects/classobject.c
@@ -128,6 +128,7 @@
 	Py_XDECREF(op->cl_getattr);
 	Py_XDECREF(op->cl_setattr);
 	Py_XDECREF(op->cl_delattr);
+	op = (PyClassObject *) PyObject_AS_GC(op);
 	PyObject_DEL(op);
 }
 
@@ -473,6 +474,7 @@
 	inst->in_dict = PyDict_New();
 	PyObject_GC_Init(inst);
 	if (inst->in_dict == NULL) {
+		inst = (PyInstanceObject *) PyObject_AS_GC(inst);
 		PyObject_DEL(inst);
 		return NULL;
 	}
@@ -588,6 +590,7 @@
 #endif /* Py_TRACE_REFS */
 	Py_DECREF(inst->in_class);
 	Py_XDECREF(inst->in_dict);
+	inst = (PyInstanceObject *) PyObject_AS_GC(inst);
 	PyObject_DEL(inst);
 }
 
@@ -1763,6 +1766,7 @@
 	while (free_list) {
 		PyMethodObject *im = free_list;
 		free_list = (PyMethodObject *)(im->im_self);
+		im = (PyMethodObject *) PyObject_AS_GC(im);
 		PyObject_DEL(im);
 	}
 }
diff --git a/Objects/dictobject.c b/Objects/dictobject.c
index fd0ad10..60945f0 100644
--- a/Objects/dictobject.c
+++ b/Objects/dictobject.c
@@ -472,6 +472,7 @@
 	}
 	if (mp->ma_table != NULL)
 		PyMem_DEL(mp->ma_table);
+	mp = (dictobject *) PyObject_AS_GC(mp);
 	PyObject_DEL(mp);
 	Py_TRASHCAN_SAFE_END(mp)
 }
diff --git a/Objects/funcobject.c b/Objects/funcobject.c
index 289a29f..b6c0089 100644
--- a/Objects/funcobject.c
+++ b/Objects/funcobject.c
@@ -172,6 +172,7 @@
 	Py_DECREF(op->func_name);
 	Py_XDECREF(op->func_defaults);
 	Py_XDECREF(op->func_doc);
+	op = (PyFunctionObject *) PyObject_AS_GC(op);
 	PyObject_DEL(op);
 }
 
diff --git a/Objects/listobject.c b/Objects/listobject.c
index 2cf381f..d260a88 100644
--- a/Objects/listobject.c
+++ b/Objects/listobject.c
@@ -209,6 +209,7 @@
 		}
 		PyMem_FREE(op->ob_item);
 	}
+	op = (PyListObject *) PyObject_AS_GC(op);
 	PyObject_DEL(op);
 	Py_TRASHCAN_SAFE_END(op)
 }
diff --git a/Objects/object.c b/Objects/object.c
index 4479e7d..3052d38 100644
--- a/Objects/object.c
+++ b/Objects/object.c
@@ -171,14 +171,11 @@
 	PyObject *op;
 {
 #ifdef WITH_CYCLE_GC
-	if (PyType_IS_GC(op->ob_type)) {
-		PyGC_Head *g = PyObject_AS_GC(op);
-		PyObject_FREE(g);
-	} else
-#endif
-	{
-		PyObject_FREE(op);
+	if (op && PyType_IS_GC(op->ob_type)) {
+		op = (PyObject *) PyObject_AS_GC(op);
 	}
+#endif
+	PyObject_FREE(op);
 }
 
 #ifndef WITH_CYCLE_GC
diff --git a/Objects/tupleobject.c b/Objects/tupleobject.c
index f39f6c0..7ce9417 100644
--- a/Objects/tupleobject.c
+++ b/Objects/tupleobject.c
@@ -175,6 +175,7 @@
 		}
 #endif
 	}
+	op = (PyTupleObject *) PyObject_AS_GC(op);
 	PyObject_DEL(op);
 done:
 	Py_TRASHCAN_SAFE_END(op)
@@ -559,6 +560,7 @@
 		*pv = (PyObject *) sv;
 		if (sv == NULL) {
 			PyObject_GC_Init((PyObject *)v);
+			v = (PyTupleObject *) PyObject_AS_GC(v);
 			PyObject_DEL(v);
 			PyErr_NoMemory();
 			return -1;
@@ -595,6 +597,7 @@
 		while (p) {
 			q = p;
 			p = (PyTupleObject *)(p->ob_item[0]);
+			q = (PyTupleObject *) PyObject_AS_GC(q);
 			PyObject_DEL(q);
 		}
 	}