mirror of
https://github.com/python/cpython.git
synced 2025-09-26 10:19:53 +00:00
gh-126703: Add freelist for PyMethodObject
(#128594)
This commit is contained in:
parent
5ace71713b
commit
ff39e3ff7b
4 changed files with 12 additions and 3 deletions
|
@ -3,6 +3,7 @@
|
|||
#include "Python.h"
|
||||
#include "pycore_call.h" // _PyObject_VectorcallTstate()
|
||||
#include "pycore_ceval.h" // _PyEval_GetBuiltin()
|
||||
#include "pycore_freelist.h"
|
||||
#include "pycore_object.h"
|
||||
#include "pycore_pyerrors.h"
|
||||
#include "pycore_pystate.h" // _PyThreadState_GET()
|
||||
|
@ -112,9 +113,12 @@ PyMethod_New(PyObject *func, PyObject *self)
|
|||
PyErr_BadInternalCall();
|
||||
return NULL;
|
||||
}
|
||||
PyMethodObject *im = PyObject_GC_New(PyMethodObject, &PyMethod_Type);
|
||||
PyMethodObject *im = _Py_FREELIST_POP(PyMethodObject, pymethodobjects);
|
||||
if (im == NULL) {
|
||||
return NULL;
|
||||
im = PyObject_GC_New(PyMethodObject, &PyMethod_Type);
|
||||
if (im == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
im->im_weakreflist = NULL;
|
||||
im->im_func = Py_NewRef(func);
|
||||
|
@ -245,7 +249,8 @@ method_dealloc(PyObject *self)
|
|||
PyObject_ClearWeakRefs((PyObject *)im);
|
||||
Py_DECREF(im->im_func);
|
||||
Py_XDECREF(im->im_self);
|
||||
PyObject_GC_Del(im);
|
||||
assert(Py_IS_TYPE(self, &PyMethod_Type));
|
||||
_Py_FREELIST_FREE(pymethodobjects, (PyObject *)im, PyObject_GC_Del);
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
|
|
|
@ -937,6 +937,7 @@ _PyObject_ClearFreeLists(struct _Py_freelists *freelists, int is_finalization)
|
|||
}
|
||||
clear_freelist(&freelists->unicode_writers, is_finalization, PyMem_Free);
|
||||
clear_freelist(&freelists->ints, is_finalization, free_object);
|
||||
clear_freelist(&freelists->pymethodobjects, is_finalization, free_object);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue