summaryrefslogtreecommitdiffstats
path: root/Objects
diff options
context:
space:
mode:
authorEric Snow <ericsnowcurrently@gmail.com>2022-11-14 20:50:56 (GMT)
committerGitHub <noreply@github.com>2022-11-14 20:50:56 (GMT)
commita088290f9d53a6bd078de6ee67b2fa296fc1cc14 (patch)
treecd464c7ed31b1fd4ea145eaa8cb073a7fac70985 /Objects
parent619cadcda6a8ba4a038c1807b6566a90e25db934 (diff)
downloadcpython-a088290f9d53a6bd078de6ee67b2fa296fc1cc14.zip
cpython-a088290f9d53a6bd078de6ee67b2fa296fc1cc14.tar.gz
cpython-a088290f9d53a6bd078de6ee67b2fa296fc1cc14.tar.bz2
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
Diffstat (limited to 'Objects')
-rw-r--r--Objects/typeobject.c45
1 files changed, 20 insertions, 25 deletions
diff --git a/Objects/typeobject.c b/Objects/typeobject.c
index 076f447..675d6d8 100644
--- a/Objects/typeobject.c
+++ b/Objects/typeobject.c
@@ -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;