bpo-32030: Split Py_Main() into subfunctions (#4399) · python/cpython@f7e5b56 (original) (raw)
`@@ -20,18 +20,44 @@ PyAPI_FUNC(wchar_t *) Py_GetPythonHome(void);
`
20
20
`PyAPI_FUNC(int) Py_SetStandardStreamEncoding(const char *encoding,
`
21
21
`const char *errors);
`
22
22
``
``
23
`+
typedef struct {
`
``
24
`+
const char *prefix;
`
``
25
`+
const char *msg;
`
``
26
`+
int user_err;
`
``
27
`+
} _PyInitError;
`
``
28
+
``
29
`+
/* Almost all errors causing Python initialization to fail */
`
``
30
`+
#ifdef _MSC_VER
`
``
31
`+
/* Visual Studio 2015 doesn't implement C99 func in C */
`
``
32
`+
define _Py_INIT_GET_FUNC() FUNCTION
`
``
33
`+
#else
`
``
34
`+
define _Py_INIT_GET_FUNC() func
`
``
35
`+
#endif
`
``
36
+
``
37
`+
#define _Py_INIT_OK() \
`
``
38
`+
(_PyInitError){.prefix = NULL, .msg = NULL, .user_err = 0}
`
``
39
`+
#define _Py_INIT_ERR(MSG) \
`
``
40
`+
(_PyInitError){.prefix = _Py_INIT_GET_FUNC(), .msg = (MSG), .user_err = 0}
`
``
41
`+
/* Error that can be fixed by the user like invalid input parameter.
`
``
42
`+
Don't abort() the process on such error. */
`
``
43
`+
#define _Py_INIT_USER_ERR(MSG) \
`
``
44
`+
(_PyInitError){.prefix = _Py_INIT_GET_FUNC(), .msg = (MSG), .user_err = 1}
`
``
45
`+
#define _Py_INIT_FAILED(err) \
`
``
46
`+
(err.msg != NULL)
`
``
47
+
23
48
`/* PEP 432 Multi-phase initialization API (Private while provisional!) */
`
24
``
`-
PyAPI_FUNC(void) _Py_InitializeCore(const _PyCoreConfig *);
`
``
49
`+
PyAPI_FUNC(_PyInitError) _Py_InitializeCore(const _PyCoreConfig *);
`
25
50
`PyAPI_FUNC(int) _Py_IsCoreInitialized(void);
`
26
``
`-
PyAPI_FUNC(int) _Py_ReadMainInterpreterConfig(_PyMainInterpreterConfig *);
`
27
``
`-
PyAPI_FUNC(int) _Py_InitializeMainInterpreter(const _PyMainInterpreterConfig *);
`
``
51
`+
PyAPI_FUNC(_PyInitError) _Py_ReadMainInterpreterConfig(_PyMainInterpreterConfig *);
`
``
52
`+
PyAPI_FUNC(_PyInitError) _Py_InitializeMainInterpreter(const _PyMainInterpreterConfig *);
`
28
53
`#endif
`
29
54
``
30
55
`/* Initialization and finalization */
`
31
56
`PyAPI_FUNC(void) Py_Initialize(void);
`
32
57
`PyAPI_FUNC(void) Py_InitializeEx(int);
`
33
58
`#ifndef Py_LIMITED_API
`
34
``
`-
PyAPI_FUNC(void) _Py_InitializeEx_Private(int, int);
`
``
59
`+
PyAPI_FUNC(_PyInitError) _Py_InitializeEx_Private(int, int);
`
``
60
`+
PyAPI_FUNC(void) _Py_FatalInitError(_PyInitError err) _Py_NO_RETURN;
`
35
61
`#endif
`
36
62
`PyAPI_FUNC(void) Py_Finalize(void);
`
37
63
`PyAPI_FUNC(int) Py_FinalizeEx(void);
`
`@@ -50,7 +76,7 @@ PyAPI_FUNC(void) _Py_PyAtExit(void (*func)(void));
`
50
76
`#endif
`
51
77
`PyAPI_FUNC(int) Py_AtExit(void (*func)(void));
`
52
78
``
53
``
`-
PyAPI_FUNC(void) Py_Exit(int);
`
``
79
`+
PyAPI_FUNC(void) Py_Exit(int) _Py_NO_RETURN;
`
54
80
``
55
81
`/* Restore signals that the interpreter has called SIG_IGN on to SIG_DFL. */
`
56
82
`#ifndef Py_LIMITED_API
`
`@@ -86,15 +112,15 @@ PyAPI_FUNC(const char *) _Py_gitversion(void);
`
86
112
`/* Internal -- various one-time initializations */
`
87
113
`#ifndef Py_LIMITED_API
`
88
114
`PyAPI_FUNC(PyObject *) _PyBuiltin_Init(void);
`
89
``
`-
PyAPI_FUNC(PyObject *) _PySys_BeginInit(void);
`
``
115
`+
PyAPI_FUNC(_PyInitError) _PySys_BeginInit(PyObject **sysmod);
`
90
116
`PyAPI_FUNC(int) _PySys_EndInit(PyObject *sysdict);
`
91
``
`-
PyAPI_FUNC(void) _PyImport_Init(void);
`
``
117
`+
PyAPI_FUNC(_PyInitError) _PyImport_Init(void);
`
92
118
`PyAPI_FUNC(void) _PyExc_Init(PyObject * bltinmod);
`
93
``
`-
PyAPI_FUNC(void) _PyImportHooks_Init(void);
`
``
119
`+
PyAPI_FUNC(_PyInitError) _PyImportHooks_Init(void);
`
94
120
`PyAPI_FUNC(int) _PyFrame_Init(void);
`
95
121
`PyAPI_FUNC(int) _PyFloat_Init(void);
`
96
122
`PyAPI_FUNC(int) PyByteArray_Init(void);
`
97
``
`-
PyAPI_FUNC(void) _Py_HashRandomization_Init(_PyCoreConfig *core_config);
`
``
123
`+
PyAPI_FUNC(_PyInitError) _Py_HashRandomization_Init(_PyCoreConfig *core_config);
`
98
124
`#endif
`
99
125
``
100
126
`/* Various internal finalizers */
`