GC for method objects.
diff --git a/Objects/methodobject.c b/Objects/methodobject.c
index f0bbeea..bff79ed 100644
--- a/Objects/methodobject.c
+++ b/Objects/methodobject.c
@@ -24,6 +24,7 @@
 	op->m_ml = ml;
 	Py_XINCREF(self);
 	op->m_self = self;
+	PyObject_GC_Init(op);
 	return (PyObject *)op;
 }
 
@@ -62,11 +63,21 @@
 static void
 meth_dealloc(PyCFunctionObject *m)
 {
+	PyObject_GC_Fini(m);
 	Py_XDECREF(m->m_self);
 	m->m_self = (PyObject *)free_list;
 	free_list = m;
 }
 
+static int
+meth_traverse(PyCFunctionObject *m, visitproc visit, void *arg)
+{
+	if (m->m_self != NULL)
+		return visit(m->m_self, arg);
+	else
+		return 0;
+}
+
 static PyObject *
 meth_getattr(PyCFunctionObject *m, char *name)
 {
@@ -152,18 +163,26 @@
 	PyObject_HEAD_INIT(&PyType_Type)
 	0,
 	"builtin_function_or_method",
-	sizeof(PyCFunctionObject),
+	sizeof(PyCFunctionObject) + PyGC_HEAD_SIZE,
 	0,
-	(destructor)meth_dealloc, /*tp_dealloc*/
-	0,		/*tp_print*/
-	(getattrfunc)meth_getattr, /*tp_getattr*/
-	0,		/*tp_setattr*/
-	(cmpfunc)meth_compare, /*tp_compare*/
-	(reprfunc)meth_repr, /*tp_repr*/
-	0,		/*tp_as_number*/
-	0,		/*tp_as_sequence*/
-	0,		/*tp_as_mapping*/
-	(hashfunc)meth_hash, /*tp_hash*/
+	(destructor)meth_dealloc, 		/* tp_dealloc */
+	0,					/* tp_print */
+	(getattrfunc)meth_getattr,		/* tp_getattr */
+	0,					/* tp_setattr */
+	(cmpfunc)meth_compare,			/* tp_compare */
+	(reprfunc)meth_repr,			/* tp_repr */
+	0,					/* tp_as_number */
+	0,					/* tp_as_sequence */
+	0,					/* tp_as_mapping */
+	(hashfunc)meth_hash,			/* tp_hash */
+	0,					/* tp_call */
+	0,					/* tp_str */
+	0,					/* tp_getattro */
+	0,					/* tp_setattro */
+	0,					/* tp_as_buffer */
+	Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC,	/* tp_flags */
+ 	0,					/* tp_doc */
+ 	(traverseproc)meth_traverse,		/* tp_traverse */
 };
 
 /* List all methods in a chain -- helper for findmethodinchain */
@@ -245,6 +264,7 @@
 	while (free_list) {
 		PyCFunctionObject *v = free_list;
 		free_list = (PyCFunctionObject *)(v->m_self);
+		v = (PyCFunctionObject *) PyObject_AS_GC(v);
 		PyObject_DEL(v);
 	}
 }