]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-46417: _PyTypes_FiniTypes() clears object and type (GH-30798)
authorVictor Stinner <vstinner@python.org>
Sat, 22 Jan 2022 18:31:24 +0000 (19:31 +0100)
committerGitHub <noreply@github.com>
Sat, 22 Jan 2022 18:31:24 +0000 (19:31 +0100)
Objects/object.c

index a1663c0dbb7b7dda857551022216fc077c275a7b..27f89e8d75212318205c75aba07857510c4a11b8 100644 (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
 }