#include "Python.h"
#include "_iomodule.h"
#include "pycore_pystate.h" // _PyInterpreterState_GET()
+#include "pycore_initconfig.h" // _PyStatus_OK()
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
};
+PyStatus
+_PyIO_InitTypes(PyInterpreterState *interp)
+{
+ if (!_Py_IsMainInterpreter(interp)) {
+ return _PyStatus_OK();
+ }
+
+ // Set type base classes
+#ifdef HAVE_WINDOWS_CONSOLE_IO
+ PyWindowsConsoleIO_Type.tp_base = &PyRawIOBase_Type;
+#endif
+
+ for (size_t i=0; i < Py_ARRAY_LENGTH(static_types); i++) {
+ PyTypeObject *type = static_types[i];
+ if (_PyStaticType_InitBuiltin(type) < 0) {
+ return _PyStatus_ERR("Can't initialize builtin type");
+ }
+ }
+
+ return _PyStatus_OK();
+}
+
void
-_PyIO_Fini(void)
+_PyIO_FiniTypes(PyInterpreterState *interp)
{
+ if (!_Py_IsMainInterpreter(interp)) {
+ return;
+ }
+
+ // Deallocate types in the reverse order to deallocate subclasses before
+ // their base classes.
for (Py_ssize_t i=Py_ARRAY_LENGTH(static_types) - 1; i >= 0; i--) {
- PyTypeObject *exc = static_types[i];
- _PyStaticType_Dealloc(exc);
+ PyTypeObject *type = static_types[i];
+ _PyStaticType_Dealloc(type);
}
}
goto fail;
}
- // Set type base classes
-#ifdef HAVE_WINDOWS_CONSOLE_IO
- PyWindowsConsoleIO_Type.tp_base = &PyRawIOBase_Type;
-#endif
-
// Add types
for (size_t i=0; i < Py_ARRAY_LENGTH(static_types); i++) {
PyTypeObject *type = static_types[i];
#include "pycore_unicodeobject.h" // _PyUnicode_InitTypes()
#include "opcode.h"
-extern void _PyIO_Fini(void);
+extern PyStatus _PyIO_InitTypes(PyInterpreterState *interp);
+extern void _PyIO_FiniTypes(PyInterpreterState *interp);
#include <locale.h> // setlocale()
#include <stdlib.h> // getenv()
return _PyStatus_ERR("failed to initialize an exception type");
}
+ status = _PyIO_InitTypes(interp);
+ if (_PyStatus_EXCEPTION(status)) {
+ return status;
+ }
+
status = _PyExc_InitGlobalObjects(interp);
if (_PyStatus_EXCEPTION(status)) {
return status;
/* Clear interpreter state and all thread states */
_PyInterpreterState_Clear(tstate);
- if (is_main_interp) {
- _PyIO_Fini();
- }
+ _PyIO_FiniTypes(tstate->interp);
/* Clear all loghooks */
/* Both _PySys_Audit function and users still need PyObject, such as tuple.