mirror of https://github.com/python/cpython
GH-126547: Pre-assign version numbers for a few common classes (GH-126551)
This commit is contained in:
parent
fd5580cd15
commit
fa40922597
|
@ -87,7 +87,7 @@ extern PyTypeObject _PyExc_MemoryError;
|
||||||
.double_format = _py_float_format_unknown, \
|
.double_format = _py_float_format_unknown, \
|
||||||
}, \
|
}, \
|
||||||
.types = { \
|
.types = { \
|
||||||
.next_version_tag = 1, \
|
.next_version_tag = _Py_TYPE_VERSION_NEXT, \
|
||||||
}, \
|
}, \
|
||||||
.static_objects = { \
|
.static_objects = { \
|
||||||
.singletons = { \
|
.singletons = { \
|
||||||
|
|
|
@ -14,6 +14,21 @@ extern "C" {
|
||||||
|
|
||||||
/* state */
|
/* state */
|
||||||
|
|
||||||
|
#define _Py_TYPE_VERSION_INT 1
|
||||||
|
#define _Py_TYPE_VERSION_FLOAT 2
|
||||||
|
#define _Py_TYPE_VERSION_LIST 3
|
||||||
|
#define _Py_TYPE_VERSION_TUPLE 4
|
||||||
|
#define _Py_TYPE_VERSION_STR 5
|
||||||
|
#define _Py_TYPE_VERSION_SET 6
|
||||||
|
#define _Py_TYPE_VERSION_FROZEN_SET 7
|
||||||
|
#define _Py_TYPE_VERSION_DICT 8
|
||||||
|
#define _Py_TYPE_VERSION_BYTEARRAY 9
|
||||||
|
#define _Py_TYPE_VERSION_BYTES 10
|
||||||
|
#define _Py_TYPE_VERSION_COMPLEX 11
|
||||||
|
|
||||||
|
#define _Py_TYPE_VERSION_NEXT 16
|
||||||
|
|
||||||
|
|
||||||
#define _Py_TYPE_BASE_VERSION_TAG (2<<16)
|
#define _Py_TYPE_BASE_VERSION_TAG (2<<16)
|
||||||
#define _Py_MAX_GLOBAL_TYPE_VERSION_TAG (_Py_TYPE_BASE_VERSION_TAG - 1)
|
#define _Py_MAX_GLOBAL_TYPE_VERSION_TAG (_Py_TYPE_BASE_VERSION_TAG - 1)
|
||||||
|
|
||||||
|
|
|
@ -2452,6 +2452,7 @@ PyTypeObject PyByteArray_Type = {
|
||||||
PyType_GenericAlloc, /* tp_alloc */
|
PyType_GenericAlloc, /* tp_alloc */
|
||||||
PyType_GenericNew, /* tp_new */
|
PyType_GenericNew, /* tp_new */
|
||||||
PyObject_Free, /* tp_free */
|
PyObject_Free, /* tp_free */
|
||||||
|
.tp_version_tag = _Py_TYPE_VERSION_BYTEARRAY,
|
||||||
};
|
};
|
||||||
|
|
||||||
/*********************** Bytearray Iterator ****************************/
|
/*********************** Bytearray Iterator ****************************/
|
||||||
|
|
|
@ -3080,6 +3080,7 @@ PyTypeObject PyBytes_Type = {
|
||||||
bytes_alloc, /* tp_alloc */
|
bytes_alloc, /* tp_alloc */
|
||||||
bytes_new, /* tp_new */
|
bytes_new, /* tp_new */
|
||||||
PyObject_Free, /* tp_free */
|
PyObject_Free, /* tp_free */
|
||||||
|
.tp_version_tag = _Py_TYPE_VERSION_BYTES,
|
||||||
};
|
};
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -1250,4 +1250,5 @@ PyTypeObject PyComplex_Type = {
|
||||||
PyType_GenericAlloc, /* tp_alloc */
|
PyType_GenericAlloc, /* tp_alloc */
|
||||||
actual_complex_new, /* tp_new */
|
actual_complex_new, /* tp_new */
|
||||||
PyObject_Free, /* tp_free */
|
PyObject_Free, /* tp_free */
|
||||||
|
.tp_version_tag = _Py_TYPE_VERSION_COMPLEX,
|
||||||
};
|
};
|
||||||
|
|
|
@ -4912,6 +4912,7 @@ PyTypeObject PyDict_Type = {
|
||||||
dict_new, /* tp_new */
|
dict_new, /* tp_new */
|
||||||
PyObject_GC_Del, /* tp_free */
|
PyObject_GC_Del, /* tp_free */
|
||||||
.tp_vectorcall = dict_vectorcall,
|
.tp_vectorcall = dict_vectorcall,
|
||||||
|
.tp_version_tag = _Py_TYPE_VERSION_DICT,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* For backward compatibility with old dictionary interface */
|
/* For backward compatibility with old dictionary interface */
|
||||||
|
|
|
@ -1916,6 +1916,7 @@ PyTypeObject PyFloat_Type = {
|
||||||
0, /* tp_alloc */
|
0, /* tp_alloc */
|
||||||
float_new, /* tp_new */
|
float_new, /* tp_new */
|
||||||
.tp_vectorcall = (vectorcallfunc)float_vectorcall,
|
.tp_vectorcall = (vectorcallfunc)float_vectorcall,
|
||||||
|
.tp_version_tag = _Py_TYPE_VERSION_FLOAT,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
|
@ -3774,6 +3774,7 @@ PyTypeObject PyList_Type = {
|
||||||
PyType_GenericNew, /* tp_new */
|
PyType_GenericNew, /* tp_new */
|
||||||
PyObject_GC_Del, /* tp_free */
|
PyObject_GC_Del, /* tp_free */
|
||||||
.tp_vectorcall = list_vectorcall,
|
.tp_vectorcall = list_vectorcall,
|
||||||
|
.tp_version_tag = _Py_TYPE_VERSION_LIST,
|
||||||
};
|
};
|
||||||
|
|
||||||
/*********************** List Iterator **************************/
|
/*********************** List Iterator **************************/
|
||||||
|
|
|
@ -6584,6 +6584,7 @@ PyTypeObject PyLong_Type = {
|
||||||
long_new, /* tp_new */
|
long_new, /* tp_new */
|
||||||
PyObject_Free, /* tp_free */
|
PyObject_Free, /* tp_free */
|
||||||
.tp_vectorcall = long_vectorcall,
|
.tp_vectorcall = long_vectorcall,
|
||||||
|
.tp_version_tag = _Py_TYPE_VERSION_INT,
|
||||||
};
|
};
|
||||||
|
|
||||||
static PyTypeObject Int_InfoType;
|
static PyTypeObject Int_InfoType;
|
||||||
|
|
|
@ -2520,6 +2520,7 @@ PyTypeObject PySet_Type = {
|
||||||
set_new, /* tp_new */
|
set_new, /* tp_new */
|
||||||
PyObject_GC_Del, /* tp_free */
|
PyObject_GC_Del, /* tp_free */
|
||||||
.tp_vectorcall = set_vectorcall,
|
.tp_vectorcall = set_vectorcall,
|
||||||
|
.tp_version_tag = _Py_TYPE_VERSION_SET,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* frozenset object ********************************************************/
|
/* frozenset object ********************************************************/
|
||||||
|
@ -2610,6 +2611,7 @@ PyTypeObject PyFrozenSet_Type = {
|
||||||
frozenset_new, /* tp_new */
|
frozenset_new, /* tp_new */
|
||||||
PyObject_GC_Del, /* tp_free */
|
PyObject_GC_Del, /* tp_free */
|
||||||
.tp_vectorcall = frozenset_vectorcall,
|
.tp_vectorcall = frozenset_vectorcall,
|
||||||
|
.tp_version_tag = _Py_TYPE_VERSION_FROZEN_SET,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -909,6 +909,7 @@ PyTypeObject PyTuple_Type = {
|
||||||
tuple_new, /* tp_new */
|
tuple_new, /* tp_new */
|
||||||
PyObject_GC_Del, /* tp_free */
|
PyObject_GC_Del, /* tp_free */
|
||||||
.tp_vectorcall = tuple_vectorcall,
|
.tp_vectorcall = tuple_vectorcall,
|
||||||
|
.tp_version_tag = _Py_TYPE_VERSION_TUPLE,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* The following function breaks the notion that tuples are immutable:
|
/* The following function breaks the notion that tuples are immutable:
|
||||||
|
|
|
@ -8613,8 +8613,10 @@ init_static_type(PyInterpreterState *interp, PyTypeObject *self,
|
||||||
self->tp_flags |= Py_TPFLAGS_IMMUTABLETYPE;
|
self->tp_flags |= Py_TPFLAGS_IMMUTABLETYPE;
|
||||||
|
|
||||||
assert(NEXT_GLOBAL_VERSION_TAG <= _Py_MAX_GLOBAL_TYPE_VERSION_TAG);
|
assert(NEXT_GLOBAL_VERSION_TAG <= _Py_MAX_GLOBAL_TYPE_VERSION_TAG);
|
||||||
|
if (self->tp_version_tag == 0) {
|
||||||
_PyType_SetVersion(self, NEXT_GLOBAL_VERSION_TAG++);
|
_PyType_SetVersion(self, NEXT_GLOBAL_VERSION_TAG++);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
assert(!initial);
|
assert(!initial);
|
||||||
assert(self->tp_flags & _Py_TPFLAGS_STATIC_BUILTIN);
|
assert(self->tp_flags & _Py_TPFLAGS_STATIC_BUILTIN);
|
||||||
|
|
Loading…
Reference in New Issue