bpo-46417: _PyTypes_FiniTypes() clears object and type (GH-30798)

This commit is contained in:
Victor Stinner 2022-01-22 19:31:24 +01:00 committed by GitHub
parent ce7d66771e
commit 6cacdb4245
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 11 additions and 15 deletions

View File

@ -1840,7 +1840,12 @@ _PyTypes_InitState(PyInterpreterState *interp)
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,
&PyByteArrayIter_Type,
&PyByteArray_Type,
@ -1955,29 +1960,20 @@ _PyTypes_InitTypes(PyInterpreterState *interp)
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)
for (size_t i=0; i < Py_ARRAY_LENGTH(static_types); i++) {
PyTypeObject *type = static_types[i];
if (PyType_Ready(type) < 0) {
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();
#undef INIT_TYPE
}