bpo-36356: pymain_exit_error() only call pymain_free() for exit (GH-12968)

Add _Py_INIT_HAS_EXITCODE() macro.
This commit is contained in:
Victor Stinner 2019-04-26 13:05:47 +02:00 committed by GitHub
parent 00db7c73af
commit 4cb525a1f0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 10 additions and 3 deletions

View File

@ -33,8 +33,10 @@ typedef struct {
#define _Py_INIT_NO_MEMORY() _Py_INIT_USER_ERR("memory allocation failed") #define _Py_INIT_NO_MEMORY() _Py_INIT_USER_ERR("memory allocation failed")
#define _Py_INIT_EXIT(EXITCODE) \ #define _Py_INIT_EXIT(EXITCODE) \
(_PyInitError){.prefix = NULL, .msg = NULL, .user_err = 0, .exitcode = (EXITCODE)} (_PyInitError){.prefix = NULL, .msg = NULL, .user_err = 0, .exitcode = (EXITCODE)}
#define _Py_INIT_HAS_EXITCODE(err) \
(err.exitcode != -1)
#define _Py_INIT_FAILED(err) \ #define _Py_INIT_FAILED(err) \
(err.msg != NULL || err.exitcode != -1) (err.msg != NULL || _Py_INIT_HAS_EXITCODE(err))
/* --- _PyWstrList ------------------------------------------------ */ /* --- _PyWstrList ------------------------------------------------ */

View File

@ -570,7 +570,12 @@ exit_sigint(void)
static void _Py_NO_RETURN static void _Py_NO_RETURN
pymain_exit_error(_PyInitError err) pymain_exit_error(_PyInitError err)
{ {
pymain_free(); if (_Py_INIT_HAS_EXITCODE(err)) {
/* If it's an error rather than a regular exit, leave Python runtime
alive: _Py_ExitInitError() uses the current exception and use
sys.stdout in this case. */
pymain_free();
}
_Py_ExitInitError(err); _Py_ExitInitError(err);
} }

View File

@ -2172,7 +2172,7 @@ Py_FatalError(const char *msg)
void _Py_NO_RETURN void _Py_NO_RETURN
_Py_ExitInitError(_PyInitError err) _Py_ExitInitError(_PyInitError err)
{ {
if (err.exitcode >= 0) { if (_Py_INIT_HAS_EXITCODE(err)) {
exit(err.exitcode); exit(err.exitcode);
} }
else { else {