Mercurial > cpython-lru_cache-weakref
diff Objects/methodobject.c @ 5934:0369d63b100b legacy-trunk
Added separate free list for cfunction (builtin method) objects, for a
few percent speed up. Also add PyCFunction_Fini() to discard it.
| author | Guido van Rossum <guido@python.org> |
|---|---|
| date | Tue, 05 Aug 1997 02:11:41 +0000 |
| parents | d1447950fa04 |
| children | 19e8016cd38c |
line wrap: on
line diff
--- a/Objects/methodobject.c Tue Aug 05 02:09:46 1997 +0000 +++ b/Objects/methodobject.c Tue Aug 05 02:11:41 1997 +0000 @@ -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); + } +}
