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,
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
}