[Python-checkins] bpo-46417: _PyTypes_FiniTypes() clears object and type (GH-30798)
vstinner
webhook-mailer at python.org
Sat Jan 22 13:31:33 EST 2022
https://github.com/python/cpython/commit/6cacdb42454264ae75cab5e32bb62876da43bf6f
commit: 6cacdb42454264ae75cab5e32bb62876da43bf6f
branch: main
author: Victor Stinner <vstinner at python.org>
committer: vstinner <vstinner at python.org>
date: 2022-01-22T19:31:24+01:00
summary:
bpo-46417: _PyTypes_FiniTypes() clears object and type (GH-30798)
files:
M Objects/object.c
diff --git a/Objects/object.c b/Objects/object.c
index a1663c0dbb7b7..27f89e8d75212 100644
--- a/Objects/object.c
+++ b/Objects/object.c
@@ -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
}
More information about the Python-checkins
mailing list