part 2 of Neil Schemenauer's GC patches:

This patch modifies the type structures of objects that
participate in GC.  The object's tp_basicsize is increased when
GC is enabled.  GC information is prefixed to the object to
maintain binary compatibility.  GC objects also define the
tp_flag Py_TPFLAGS_GC.
diff --git a/Include/object.h b/Include/object.h
index e18e0e8..2250b7f 100644
--- a/Include/object.h
+++ b/Include/object.h
@@ -325,6 +325,13 @@
 /* PySequenceMethods contains sq_contains */
 #define Py_TPFLAGS_HAVE_SEQUENCE_IN (1L<<1)
 
+/* Objects which participate in garbage collection (see objimp.h) */
+#ifdef WITH_CYCLE_GC
+#define Py_TPFLAGS_GC (1L<<2)
+#else
+#define Py_TPFLAGS_GC 0
+#endif
+
 #define Py_TPFLAGS_DEFAULT  (Py_TPFLAGS_HAVE_GETCHARBUFFER | \
                              Py_TPFLAGS_HAVE_SEQUENCE_IN)
 
diff --git a/Include/objimpl.h b/Include/objimpl.h
index 71dbb93..860030f 100644
--- a/Include/objimpl.h
+++ b/Include/objimpl.h
@@ -234,6 +234,12 @@
    the 1st step is performed automatically for you, so in a C++ class
    constructor you would start directly with PyObject_Init/InitVar. */
 
+
+
+#ifndef WITH_CYCLE_GC
+#define PyGC_INFO_SIZE 0
+#endif
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/Objects/classobject.c b/Objects/classobject.c
index 114f2d9..04362a7 100644
--- a/Objects/classobject.c
+++ b/Objects/classobject.c
@@ -428,7 +428,7 @@
 	PyObject_HEAD_INIT(&PyType_Type)
 	0,
 	"class",
-	sizeof(PyClassObject),
+	sizeof(PyClassObject) + PyGC_INFO_SIZE,
 	0,
 	(destructor)class_dealloc, /*tp_dealloc*/
 	0,		/*tp_print*/
@@ -445,7 +445,7 @@
 	(getattrofunc)class_getattr, /*tp_getattro*/
 	(setattrofunc)class_setattr, /*tp_setattro*/
 	0,		/* tp_as_buffer */
-	Py_TPFLAGS_DEFAULT, /*tp_flags*/
+	Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /*tp_flags*/
 	0,		/* tp_doc */
 	(traverseproc)class_traverse,	/* tp_traverse */
 };
@@ -1513,7 +1513,7 @@
 	PyObject_HEAD_INIT(&PyType_Type)
 	0,
 	"instance",
-	sizeof(PyInstanceObject),
+	sizeof(PyInstanceObject) + PyGC_INFO_SIZE,
 	0,
 	(destructor)instance_dealloc, /*tp_dealloc*/
 	0,			/*tp_print*/
@@ -1530,7 +1530,7 @@
 	(getattrofunc)instance_getattr, /*tp_getattro*/
 	(setattrofunc)instance_setattr, /*tp_setattro*/
         0, /* tp_as_buffer */
-	Py_TPFLAGS_DEFAULT, /*tp_flags*/
+	Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /*tp_flags*/
 	0,		/* tp_doc */
 	(traverseproc)instance_traverse,	/* tp_traverse */
 };
@@ -1748,7 +1748,7 @@
 	PyObject_HEAD_INIT(&PyType_Type)
 	0,
 	"instance method",
-	sizeof(PyMethodObject),
+	sizeof(PyMethodObject) + PyGC_INFO_SIZE,
 	0,
 	(destructor)instancemethod_dealloc, /*tp_dealloc*/
 	0,			/*tp_print*/
@@ -1765,7 +1765,7 @@
 	(getattrofunc)instancemethod_getattr, /*tp_getattro*/
 	0,			/*tp_setattro*/
 	0,			/* tp_as_buffer */
-	Py_TPFLAGS_DEFAULT, /*tp_flags*/
+	Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /*tp_flags*/
 	0,			/* tp_doc */
 	(traverseproc)instancemethod_traverse,	/* tp_traverse */
 };
diff --git a/Objects/dictobject.c b/Objects/dictobject.c
index 2d33b92..ce38f11 100644
--- a/Objects/dictobject.c
+++ b/Objects/dictobject.c
@@ -1087,7 +1087,7 @@
 	PyObject_HEAD_INIT(&PyType_Type)
 	0,
 	"dictionary",
-	sizeof(dictobject),
+	sizeof(dictobject) + PyGC_INFO_SIZE,
 	0,
 	(destructor)dict_dealloc, /*tp_dealloc*/
 	(printfunc)dict_print, /*tp_print*/
@@ -1104,7 +1104,7 @@
 	0,		/* tp_getattro */
 	0,		/* tp_setattro */
 	0,		/* tp_as_buffer */
-	Py_TPFLAGS_DEFAULT, /*tp_flags*/
+	Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /*tp_flags*/
 	0,		/* tp_doc */
 	(traverseproc)dict_traverse,	/* tp_traverse */
 	(inquiry)dict_tp_clear,		/* tp_clear */
diff --git a/Objects/funcobject.c b/Objects/funcobject.c
index 142c7e7..b976eab 100644
--- a/Objects/funcobject.c
+++ b/Objects/funcobject.c
@@ -275,7 +275,7 @@
 	PyObject_HEAD_INIT(&PyType_Type)
 	0,
 	"function",
-	sizeof(PyFunctionObject),
+	sizeof(PyFunctionObject) + PyGC_INFO_SIZE,
 	0,
 	(destructor)func_dealloc, /*tp_dealloc*/
 	0,		/*tp_print*/
@@ -292,7 +292,7 @@
 	0,		/*tp_getattro*/
 	0,		/*tp_setattro*/
 	0,		/* tp_as_buffer */
-	Py_TPFLAGS_DEFAULT, /*tp_flags*/
+	Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /*tp_flags*/
 	0,		/* tp_doc */
 	(traverseproc)func_traverse,	/* tp_traverse */
 };
diff --git a/Objects/listobject.c b/Objects/listobject.c
index 65dfb18..e9f12ab 100644
--- a/Objects/listobject.c
+++ b/Objects/listobject.c
@@ -71,7 +71,8 @@
 		return PyErr_NoMemory();
 	}
 	/* PyObject_NewVar is inlined */
-	op = (PyListObject *) PyObject_MALLOC(sizeof(PyListObject));
+	op = (PyListObject *) PyObject_MALLOC(sizeof(PyListObject)
+						+ PyGC_INFO_SIZE);
 	if (op == NULL) {
 		return PyErr_NoMemory();
 	}
@@ -1497,7 +1498,7 @@
 	PyObject_HEAD_INIT(&PyType_Type)
 	0,
 	"list",
-	sizeof(PyListObject),
+	sizeof(PyListObject) + PyGC_INFO_SIZE,
 	0,
 	(destructor)list_dealloc, /*tp_dealloc*/
 	(printfunc)list_print, /*tp_print*/
@@ -1514,7 +1515,7 @@
 	0,		/*tp_getattro*/
 	0,		/*tp_setattro*/
 	0,		/*tp_as_buffer*/
-	Py_TPFLAGS_DEFAULT,	/*tp_flags*/
+	Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC,	/*tp_flags*/
  	0,		/* tp_doc */
  	(traverseproc)list_traverse,	/* tp_traverse */
  	(inquiry)list_clear,	/* tp_clear */
@@ -1576,7 +1577,7 @@
 	PyObject_HEAD_INIT(&PyType_Type)
 	0,
 	"list (immutable, during sort)",
-	sizeof(PyListObject),
+	sizeof(PyListObject) + PyGC_INFO_SIZE,
 	0,
 	0,		/*tp_dealloc*/ /* Cannot happen */
 	(printfunc)list_print, /*tp_print*/
@@ -1593,7 +1594,7 @@
 	0,		/*tp_getattro*/
 	0,		/*tp_setattro*/
 	0,		/*tp_as_buffer*/
-	Py_TPFLAGS_DEFAULT,	/*tp_flags*/
+	Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC,	/*tp_flags*/
  	0,		/* tp_doc */
  	(traverseproc)list_traverse,	/* tp_traverse */
 };
diff --git a/Objects/tupleobject.c b/Objects/tupleobject.c
index bbb56b1..73e3304 100644
--- a/Objects/tupleobject.c
+++ b/Objects/tupleobject.c
@@ -93,7 +93,8 @@
 		int nbytes = size * sizeof(PyObject *);
 		/* Check for overflow */
 		if (nbytes / sizeof(PyObject *) != (size_t)size ||
-		    (nbytes += sizeof(PyTupleObject) - sizeof(PyObject *))
+		    (nbytes += sizeof(PyTupleObject) - sizeof(PyObject *)
+		     		+ PyGC_INFO_SIZE)
 		    <= 0)
 		{
 			return PyErr_NoMemory();
@@ -452,7 +453,7 @@
 	PyObject_HEAD_INIT(&PyType_Type)
 	0,
 	"tuple",
-	sizeof(PyTupleObject) - sizeof(PyObject *),
+	sizeof(PyTupleObject) - sizeof(PyObject *) + PyGC_INFO_SIZE,
 	sizeof(PyObject *),
 	(destructor)tupledealloc, /*tp_dealloc*/
 	(printfunc)tupleprint, /*tp_print*/
@@ -469,7 +470,7 @@
 	0,		/*tp_getattro*/
 	0,		/*tp_setattro*/
 	0,		/*tp_as_buffer*/
-	Py_TPFLAGS_DEFAULT, /*tp_flags*/
+	Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /*tp_flags*/
 	0,              /*tp_doc*/
  	(traverseproc)tupletraverse,	/* tp_traverse */
 };
@@ -557,8 +558,9 @@
 #endif		
 	{
 		sv = (PyTupleObject *)
-			PyObject_REALLOC((char *)v,
-				sizeof(PyTupleObject) + newsize * sizeof(PyObject *));
+			PyObject_REALLOC((char *)v, sizeof(PyTupleObject) 
+					+ PyGC_INFO_SIZE
+					+ newsize * sizeof(PyObject *));
 		*pv = (PyObject *) sv;
 		if (sv == NULL) {
 			PyObject_DEL(v);