Added separate free list for cfunction (builtin method) objects, for a

few percent speed up.  Also add PyCFunction_Fini() to discard it.
This commit is contained in:
Guido van Rossum 1997-08-05 02:11:41 +00:00
parent 404b95d9ba
commit 1f39c5c666
1 changed files with 30 additions and 7 deletions

View 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);
}
}