mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
bpo-37340: remove free_list for bound method objects (GH-14232)
This commit is contained in:
parent
76b645124b
commit
3e54b57531
5 changed files with 14 additions and 101 deletions
|
@ -8,15 +8,6 @@
|
|||
|
||||
#define TP_DESCR_GET(t) ((t)->tp_descr_get)
|
||||
|
||||
/* Free list for method objects to safe malloc/free overhead
|
||||
* The im_self element is used to chain the elements.
|
||||
*/
|
||||
static PyMethodObject *free_list;
|
||||
static int numfree = 0;
|
||||
#ifndef PyMethod_MAXFREELIST
|
||||
#define PyMethod_MAXFREELIST 256
|
||||
#endif
|
||||
|
||||
_Py_IDENTIFIER(__name__);
|
||||
_Py_IDENTIFIER(__qualname__);
|
||||
|
||||
|
@ -103,21 +94,13 @@ method_vectorcall(PyObject *method, PyObject *const *args,
|
|||
PyObject *
|
||||
PyMethod_New(PyObject *func, PyObject *self)
|
||||
{
|
||||
PyMethodObject *im;
|
||||
if (self == NULL) {
|
||||
PyErr_BadInternalCall();
|
||||
return NULL;
|
||||
}
|
||||
im = free_list;
|
||||
if (im != NULL) {
|
||||
free_list = (PyMethodObject *)(im->im_self);
|
||||
(void)PyObject_INIT(im, &PyMethod_Type);
|
||||
numfree--;
|
||||
}
|
||||
else {
|
||||
im = PyObject_GC_New(PyMethodObject, &PyMethod_Type);
|
||||
if (im == NULL)
|
||||
return NULL;
|
||||
PyMethodObject *im = PyObject_GC_New(PyMethodObject, &PyMethod_Type);
|
||||
if (im == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
im->im_weakreflist = NULL;
|
||||
Py_INCREF(func);
|
||||
|
@ -252,14 +235,7 @@ method_dealloc(PyMethodObject *im)
|
|||
PyObject_ClearWeakRefs((PyObject *)im);
|
||||
Py_DECREF(im->im_func);
|
||||
Py_XDECREF(im->im_self);
|
||||
if (numfree < PyMethod_MAXFREELIST) {
|
||||
im->im_self = (PyObject *)free_list;
|
||||
free_list = im;
|
||||
numfree++;
|
||||
}
|
||||
else {
|
||||
PyObject_GC_Del(im);
|
||||
}
|
||||
PyObject_GC_Del(im);
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
|
@ -395,16 +371,7 @@ PyTypeObject PyMethod_Type = {
|
|||
int
|
||||
PyMethod_ClearFreeList(void)
|
||||
{
|
||||
int freelist_size = numfree;
|
||||
|
||||
while (free_list) {
|
||||
PyMethodObject *im = free_list;
|
||||
free_list = (PyMethodObject *)(im->im_self);
|
||||
PyObject_GC_Del(im);
|
||||
numfree--;
|
||||
}
|
||||
assert(numfree == 0);
|
||||
return freelist_size;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -413,15 +380,6 @@ PyMethod_Fini(void)
|
|||
(void)PyMethod_ClearFreeList();
|
||||
}
|
||||
|
||||
/* Print summary info about the state of the optimized allocator */
|
||||
void
|
||||
_PyMethod_DebugMallocStats(FILE *out)
|
||||
{
|
||||
_PyDebugAllocatorStats(out,
|
||||
"free PyMethodObject",
|
||||
numfree, sizeof(PyMethodObject));
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------------
|
||||
* instance method
|
||||
*/
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue