mirror of
https://github.com/python/cpython.git
synced 2025-08-03 08:34:29 +00:00
gh-81057: Move Global Variables Holding Objects to _PyRuntimeState. (gh-99487)
This moves nearly all remaining object-holding globals in core code (other than static types). https://github.com/python/cpython/issues/81057
This commit is contained in:
parent
619cadcda6
commit
a088290f9d
10 changed files with 66 additions and 55 deletions
|
@ -43,9 +43,7 @@ class object "PyObject *" "&PyBaseObject_Type"
|
|||
PyUnicode_IS_READY(name) && \
|
||||
(PyUnicode_GET_LENGTH(name) <= MCACHE_MAX_ATTR_SIZE)
|
||||
|
||||
// bpo-42745: next_version_tag remains shared by all interpreters because of static types
|
||||
// Used to set PyTypeObject.tp_version_tag
|
||||
static unsigned int next_version_tag = 1;
|
||||
#define next_version_tag (_PyRuntime.types.next_version_tag)
|
||||
|
||||
typedef struct PySlot_Offset {
|
||||
short subslot_offset;
|
||||
|
@ -5828,7 +5826,8 @@ static PyObject *
|
|||
object___reduce_ex___impl(PyObject *self, int protocol)
|
||||
/*[clinic end generated code: output=2e157766f6b50094 input=f326b43fb8a4c5ff]*/
|
||||
{
|
||||
static PyObject *objreduce;
|
||||
#define objreduce \
|
||||
(_Py_INTERP_CACHED_OBJECT(_PyInterpreterState_Get(), objreduce))
|
||||
PyObject *reduce, *res;
|
||||
|
||||
if (objreduce == NULL) {
|
||||
|
@ -5864,6 +5863,7 @@ object___reduce_ex___impl(PyObject *self, int protocol)
|
|||
}
|
||||
|
||||
return _common_reduce(self, protocol);
|
||||
#undef objreduce
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
|
@ -8524,8 +8524,6 @@ __ne__ etc. all map to tp_richcompare) and one name may map to multiple slots
|
|||
an all-zero entry.
|
||||
*/
|
||||
|
||||
typedef struct wrapperbase slotdef;
|
||||
|
||||
#undef TPSLOT
|
||||
#undef FLSLOT
|
||||
#undef AMSLOT
|
||||
|
@ -8574,7 +8572,7 @@ typedef struct wrapperbase slotdef;
|
|||
ETSLOT(NAME, as_number.SLOT, FUNCTION, wrap_binaryfunc_r, \
|
||||
#NAME "($self, value, /)\n--\n\n" DOC)
|
||||
|
||||
static slotdef slotdefs[] = {
|
||||
static pytype_slotdef slotdefs[] = {
|
||||
TPSLOT(__getattribute__, tp_getattr, NULL, NULL, ""),
|
||||
TPSLOT(__getattr__, tp_getattr, NULL, NULL, ""),
|
||||
TPSLOT(__setattr__, tp_setattr, NULL, NULL, ""),
|
||||
|
@ -8799,12 +8797,6 @@ slotptr(PyTypeObject *type, int ioffset)
|
|||
return (void **)ptr;
|
||||
}
|
||||
|
||||
/* Length of array of slotdef pointers used to store slots with the
|
||||
same __name__. There should be at most MAX_EQUIV-1 slotdef entries with
|
||||
the same __name__, for any __name__. Since that's a static property, it is
|
||||
appropriate to declare fixed-size arrays for this. */
|
||||
#define MAX_EQUIV 10
|
||||
|
||||
/* Return a slot pointer for a given name, but ONLY if the attribute has
|
||||
exactly one slot function. The name must be an interned string. */
|
||||
static void **
|
||||
|
@ -8813,9 +8805,10 @@ resolve_slotdups(PyTypeObject *type, PyObject *name)
|
|||
/* XXX Maybe this could be optimized more -- but is it worth it? */
|
||||
|
||||
/* pname and ptrs act as a little cache */
|
||||
static PyObject *pname;
|
||||
static slotdef *ptrs[MAX_EQUIV];
|
||||
slotdef *p, **pp;
|
||||
PyInterpreterState *interp = _PyInterpreterState_Get();
|
||||
#define pname _Py_INTERP_CACHED_OBJECT(interp, type_slots_pname)
|
||||
#define ptrs _Py_INTERP_CACHED_OBJECT(interp, type_slots_ptrs)
|
||||
pytype_slotdef *p, **pp;
|
||||
void **res, **ptr;
|
||||
|
||||
if (pname != name) {
|
||||
|
@ -8842,6 +8835,8 @@ resolve_slotdups(PyTypeObject *type, PyObject *name)
|
|||
res = ptr;
|
||||
}
|
||||
return res;
|
||||
#undef pname
|
||||
#undef ptrs
|
||||
}
|
||||
|
||||
|
||||
|
@ -8899,8 +8894,8 @@ resolve_slotdups(PyTypeObject *type, PyObject *name)
|
|||
* When done, return a pointer to the next slotdef with a different offset,
|
||||
* because that's convenient for fixup_slot_dispatchers(). This function never
|
||||
* sets an exception: if an internal error happens (unlikely), it's ignored. */
|
||||
static slotdef *
|
||||
update_one_slot(PyTypeObject *type, slotdef *p)
|
||||
static pytype_slotdef *
|
||||
update_one_slot(PyTypeObject *type, pytype_slotdef *p)
|
||||
{
|
||||
PyObject *descr;
|
||||
PyWrapperDescrObject *d;
|
||||
|
@ -9015,7 +9010,7 @@ update_one_slot(PyTypeObject *type, slotdef *p)
|
|||
static int
|
||||
update_slots_callback(PyTypeObject *type, void *data)
|
||||
{
|
||||
slotdef **pp = (slotdef **)data;
|
||||
pytype_slotdef **pp = (pytype_slotdef **)data;
|
||||
for (; *pp; pp++) {
|
||||
update_one_slot(type, *pp);
|
||||
}
|
||||
|
@ -9026,9 +9021,9 @@ update_slots_callback(PyTypeObject *type, void *data)
|
|||
static int
|
||||
update_slot(PyTypeObject *type, PyObject *name)
|
||||
{
|
||||
slotdef *ptrs[MAX_EQUIV];
|
||||
slotdef *p;
|
||||
slotdef **pp;
|
||||
pytype_slotdef *ptrs[MAX_EQUIV];
|
||||
pytype_slotdef *p;
|
||||
pytype_slotdef **pp;
|
||||
int offset;
|
||||
|
||||
assert(PyUnicode_CheckExact(name));
|
||||
|
@ -9065,7 +9060,7 @@ static void
|
|||
fixup_slot_dispatchers(PyTypeObject *type)
|
||||
{
|
||||
assert(!PyErr_Occurred());
|
||||
for (slotdef *p = slotdefs; p->name; ) {
|
||||
for (pytype_slotdef *p = slotdefs; p->name; ) {
|
||||
p = update_one_slot(type, p);
|
||||
}
|
||||
}
|
||||
|
@ -9073,7 +9068,7 @@ fixup_slot_dispatchers(PyTypeObject *type)
|
|||
static void
|
||||
update_all_slots(PyTypeObject* type)
|
||||
{
|
||||
slotdef *p;
|
||||
pytype_slotdef *p;
|
||||
|
||||
/* Clear the VALID_VERSION flag of 'type' and all its subclasses. */
|
||||
PyType_Modified(type);
|
||||
|
@ -9244,7 +9239,7 @@ static int
|
|||
add_operators(PyTypeObject *type)
|
||||
{
|
||||
PyObject *dict = type->tp_dict;
|
||||
slotdef *p;
|
||||
pytype_slotdef *p;
|
||||
PyObject *descr;
|
||||
void **ptr;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue