Added separate free list for cfunction (builtin method) objects, for a
few percent speed up.  Also add PyCFunction_Fini() to discard it.
diff --git a/Objects/methodobject.c b/Objects/methodobject.c
index c0befa9..7b47c3f 100644
--- a/Objects/methodobject.c
+++ b/Objects/methodobject.c
@@ -38,21 +38,31 @@
 typedef struct {
 	PyObject_HEAD
 	PyMethodDef *m_ml;
-	PyObject	*m_self;
+	PyObject    *m_self;
 } PyCFunctionObject;
 
+static PyCFunctionObject *free_list = NULL;
+
 PyObject *
 PyCFunction_New(ml, self)
 	PyMethodDef *ml;
 	PyObject *self;
 {
-	PyCFunctionObject *op = PyObject_NEW(PyCFunctionObject,
-					     &PyCFunction_Type);
+	PyCFunctionObject *op;
+	op = free_list;
 	if (op != NULL) {
-		op->m_ml = ml;
-		Py_XINCREF(self);
-		op->m_self = self;
+		free_list = (PyCFunctionObject *)(op->m_self);
+		op->ob_type = &PyCFunction_Type;
+		_Py_NewReference(op);
 	}
+	else {
+		op = PyObject_NEW(PyCFunctionObject, &PyCFunction_Type);
+		if (op == NULL)
+			return NULL;
+	}
+	op->m_ml = ml;
+	Py_XINCREF(self);
+	op->m_self = self;
 	return (PyObject *)op;
 }
 
@@ -96,7 +106,8 @@
 	PyCFunctionObject *m;
 {
 	Py_XDECREF(m->m_self);
-	free((char *)m);
+	m->m_self = (PyObject *)free_list;
+	free_list = m;
 }
 
 static PyObject *
@@ -267,3 +278,15 @@
 	chain.link = NULL;
 	return Py_FindMethodInChain(&chain, self, name);
 }
+
+/* Clear out the free list */
+
+void
+PyCFunction_Fini()
+{
+	while (free_list) {
+		PyCFunctionObject *v = free_list;
+		free_list = (PyCFunctionObject *)(v->m_self);
+		PyMem_DEL(v);
+	}
+}