mirror of https://github.com/python/cpython
bpo-46417: _PyTypes_FiniTypes() clears object and type (GH-30798)
This commit is contained in:
parent
ce7d66771e
commit
6cacdb4245
|
@ -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
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue