]> granicus.if.org Git - python/commitdiff
Added separate free list for cfunction (builtin method) objects, for a
authorGuido van Rossum <guido@python.org>
Tue, 5 Aug 1997 02:11:41 +0000 (02:11 +0000)
committerGuido van Rossum <guido@python.org>
Tue, 5 Aug 1997 02:11:41 +0000 (02:11 +0000)
few percent speed up.  Also add PyCFunction_Fini() to discard it.

Objects/methodobject.c

index c0befa95c66404d4e5fffeb153e932401b14e466..7b47c3fb850143661c757310dcea1e12e32e0130 100644 (file)
@@ -38,21 +38,31 @@ PERFORMANCE OF THIS SOFTWARE.
 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 @@ meth_dealloc(m)
        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 @@ Py_FindMethod(methods, self, name)
        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);
+       }
+}