[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