mirror of
https://github.com/python/cpython.git
synced 2025-09-20 07:31:10 +00:00
bpo-46417: _PyTypes_FiniTypes() clears object and type (GH-30798)
This commit is contained in:
parent
ce7d66771e
commit
6cacdb4245
1 changed files with 11 additions and 15 deletions
|
@ -1840,7 +1840,12 @@ _PyTypes_InitState(PyInterpreterState *interp)
|
||||||
|
|
||||||
|
|
||||||
static PyTypeObject* static_types[] = {
|
static PyTypeObject* static_types[] = {
|
||||||
// base types
|
// The two most important base types: must be initialized first and
|
||||||
|
// deallocated last.
|
||||||
|
&PyBaseObject_Type,
|
||||||
|
&PyType_Type,
|
||||||
|
|
||||||
|
// Static types with base=&PyBaseObject_Type
|
||||||
&PyAsyncGen_Type,
|
&PyAsyncGen_Type,
|
||||||
&PyByteArrayIter_Type,
|
&PyByteArrayIter_Type,
|
||||||
&PyByteArray_Type,
|
&PyByteArray_Type,
|
||||||
|
@ -1955,29 +1960,20 @@ _PyTypes_InitTypes(PyInterpreterState *interp)
|
||||||
return _PyStatus_OK();
|
return _PyStatus_OK();
|
||||||
}
|
}
|
||||||
|
|
||||||
#define INIT_TYPE(TYPE) \
|
|
||||||
do { \
|
|
||||||
if (PyType_Ready(&(TYPE)) < 0) { \
|
|
||||||
return _PyStatus_ERR("Can't initialize " #TYPE " type"); \
|
|
||||||
} \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
// Base types
|
|
||||||
INIT_TYPE(PyBaseObject_Type);
|
|
||||||
INIT_TYPE(PyType_Type);
|
|
||||||
assert(PyBaseObject_Type.tp_base == NULL);
|
|
||||||
assert(PyType_Type.tp_base == &PyBaseObject_Type);
|
|
||||||
|
|
||||||
// All other static types (unless initialized elsewhere)
|
// All other static types (unless initialized elsewhere)
|
||||||
for (size_t i=0; i < Py_ARRAY_LENGTH(static_types); i++) {
|
for (size_t i=0; i < Py_ARRAY_LENGTH(static_types); i++) {
|
||||||
PyTypeObject *type = static_types[i];
|
PyTypeObject *type = static_types[i];
|
||||||
if (PyType_Ready(type) < 0) {
|
if (PyType_Ready(type) < 0) {
|
||||||
return _PyStatus_ERR("Can't initialize types");
|
return _PyStatus_ERR("Can't initialize types");
|
||||||
}
|
}
|
||||||
|
if (type == &PyType_Type) {
|
||||||
|
// Sanitify checks of the two most important types
|
||||||
|
assert(PyBaseObject_Type.tp_base == NULL);
|
||||||
|
assert(PyType_Type.tp_base == &PyBaseObject_Type);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return _PyStatus_OK();
|
return _PyStatus_OK();
|
||||||
#undef INIT_TYPE
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue