Skip to content

Commit 871ff77

Browse files
authored
bpo-36763: Add _PyInitError functions (GH-13395)
* Add _PyInitError functions: * _PyInitError_Ok() * _PyInitError_Error() * _PyInitError_NoMemory() * _PyInitError_Exit() * _PyInitError_IsError() * _PyInitError_IsExit() * _PyInitError_Failed() * frozenmain.c and _testembed.c now use functions rather than macros. * Move _Py_INIT_xxx() macros to the internal API. * Move _PyWstrList_INIT macro to the internal API.
1 parent 1208328 commit 871ff77

File tree

12 files changed

+102
-59
lines changed

12 files changed

+102
-59
lines changed

Include/cpython/coreconfig.h

Lines changed: 7 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -18,34 +18,13 @@ typedef struct {
1818
int exitcode;
1919
} _PyInitError;
2020

21-
/* Almost all errors causing Python initialization to fail */
22-
#ifdef _MSC_VER
23-
/* Visual Studio 2015 doesn't implement C99 __func__ in C */
24-
# define _Py_INIT_GET_FUNC() __FUNCTION__
25-
#else
26-
# define _Py_INIT_GET_FUNC() __func__
27-
#endif
28-
29-
#define _Py_INIT_OK() \
30-
(_PyInitError){._type = _Py_INIT_ERR_TYPE_OK,}
31-
/* other fields are set to 0 */
32-
#define _Py_INIT_ERR(ERR_MSG) \
33-
(_PyInitError){ \
34-
._type = _Py_INIT_ERR_TYPE_ERROR, \
35-
._func = _Py_INIT_GET_FUNC(), \
36-
.err_msg = (ERR_MSG)}
37-
/* other fields are set to 0 */
38-
#define _Py_INIT_NO_MEMORY() _Py_INIT_ERR("memory allocation failed")
39-
#define _Py_INIT_EXIT(EXITCODE) \
40-
(_PyInitError){ \
41-
._type = _Py_INIT_ERR_TYPE_EXIT, \
42-
.exitcode = (EXITCODE)}
43-
#define _Py_INIT_IS_ERROR(err) \
44-
(err._type == _Py_INIT_ERR_TYPE_ERROR)
45-
#define _Py_INIT_IS_EXIT(err) \
46-
(err._type == _Py_INIT_ERR_TYPE_EXIT)
47-
#define _Py_INIT_FAILED(err) \
48-
(err._type != _Py_INIT_ERR_TYPE_OK)
21+
PyAPI_FUNC(_PyInitError) _PyInitError_Ok(void);
22+
PyAPI_FUNC(_PyInitError) _PyInitError_Error(const char *err_msg);
23+
PyAPI_FUNC(_PyInitError) _PyInitError_NoMemory(void);
24+
PyAPI_FUNC(_PyInitError) _PyInitError_Exit(int exitcode);
25+
PyAPI_FUNC(int) _PyInitError_IsError(_PyInitError err);
26+
PyAPI_FUNC(int) _PyInitError_IsExit(_PyInitError err);
27+
PyAPI_FUNC(int) _PyInitError_Failed(_PyInitError err);
4928

5029
/* --- _PyWstrList ------------------------------------------------ */
5130

@@ -56,8 +35,6 @@ typedef struct {
5635
wchar_t **items;
5736
} _PyWstrList;
5837

59-
#define _PyWstrList_INIT (_PyWstrList){.length = 0, .items = NULL}
60-
6138

6239
/* --- _PyPreConfig ----------------------------------------------- */
6340

Include/internal/pycore_coreconfig.h

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,41 @@ extern "C" {
1010

1111
#include "pycore_pystate.h" /* _PyRuntimeState */
1212

13+
/* --- _PyInitError ----------------------------------------------- */
14+
15+
/* Almost all errors causing Python initialization to fail */
16+
#ifdef _MSC_VER
17+
/* Visual Studio 2015 doesn't implement C99 __func__ in C */
18+
# define _Py_INIT_GET_FUNC() __FUNCTION__
19+
#else
20+
# define _Py_INIT_GET_FUNC() __func__
21+
#endif
22+
23+
#define _Py_INIT_OK() \
24+
(_PyInitError){._type = _Py_INIT_ERR_TYPE_OK,}
25+
/* other fields are set to 0 */
26+
#define _Py_INIT_ERR(ERR_MSG) \
27+
(_PyInitError){ \
28+
._type = _Py_INIT_ERR_TYPE_ERROR, \
29+
._func = _Py_INIT_GET_FUNC(), \
30+
.err_msg = (ERR_MSG)}
31+
/* other fields are set to 0 */
32+
#define _Py_INIT_NO_MEMORY() _Py_INIT_ERR("memory allocation failed")
33+
#define _Py_INIT_EXIT(EXITCODE) \
34+
(_PyInitError){ \
35+
._type = _Py_INIT_ERR_TYPE_EXIT, \
36+
.exitcode = (EXITCODE)}
37+
#define _Py_INIT_IS_ERROR(err) \
38+
(err._type == _Py_INIT_ERR_TYPE_ERROR)
39+
#define _Py_INIT_IS_EXIT(err) \
40+
(err._type == _Py_INIT_ERR_TYPE_EXIT)
41+
#define _Py_INIT_FAILED(err) \
42+
(err._type != _Py_INIT_ERR_TYPE_OK)
1343

1444
/* --- _PyWstrList ------------------------------------------------ */
1545

46+
#define _PyWstrList_INIT (_PyWstrList){.length = 0, .items = NULL}
47+
1648
#ifndef NDEBUG
1749
PyAPI_FUNC(int) _PyWstrList_CheckConsistency(const _PyWstrList *list);
1850
#endif

Modules/faulthandler.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#include "Python.h"
2+
#include "pycore_coreconfig.h"
23
#include "pythread.h"
34
#include <signal.h>
45
#include <object.h>

Modules/getpath.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
/* Return the initial module search path. */
22

33
#include "Python.h"
4+
#include "pycore_coreconfig.h"
45
#include "osdefs.h"
56
#include "pycore_fileutils.h"
67
#include "pycore_pathconfig.h"

Objects/exceptions.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
#define PY_SSIZE_T_CLEAN
88
#include <Python.h>
9+
#include "pycore_coreconfig.h"
910
#include "pycore_object.h"
1011
#include "pycore_pymem.h"
1112
#include "pycore_pystate.h"

Objects/object.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
/* Generic object operations; and implementation of None */
33

44
#include "Python.h"
5+
#include "pycore_coreconfig.h"
56
#include "pycore_object.h"
67
#include "pycore_pystate.h"
78
#include "pycore_context.h"

PC/getpathp.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@
8080

8181

8282
#include "Python.h"
83+
#include "pycore_coreconfig.h"
8384
#include "pycore_pystate.h"
8485
#include "osdefs.h"
8586
#include <wchar.h>

Programs/_freeze_importlib.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ main(int argc, char *argv[])
9090
_PyInitError err = _Py_InitializeFromConfig(&config);
9191
/* No need to call _PyCoreConfig_Clear() since we didn't allocate any
9292
memory: program_name is a constant string. */
93-
if (_Py_INIT_FAILED(err)) {
93+
if (_PyInitError_Failed(err)) {
9494
_Py_ExitInitError(err);
9595
}
9696

Programs/_testembed.c

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -389,7 +389,7 @@ static int test_init_from_config(void)
389389
preconfig.utf8_mode = 1;
390390

391391
err = _Py_PreInitialize(&preconfig);
392-
if (_Py_INIT_FAILED(err)) {
392+
if (_PyInitError_Failed(err)) {
393393
_Py_ExitInitError(err);
394394
}
395395

@@ -512,7 +512,7 @@ static int test_init_from_config(void)
512512
config.pathconfig_warnings = 0;
513513

514514
err = _Py_InitializeFromConfig(&config);
515-
if (_Py_INIT_FAILED(err)) {
515+
if (_PyInitError_Failed(err)) {
516516
_Py_ExitInitError(err);
517517
}
518518
dump_config();
@@ -543,7 +543,7 @@ static int test_init_parse_argv(int parse_argv)
543543
config.parse_argv = parse_argv;
544544

545545
err = _Py_InitializeFromConfig(&config);
546-
if (_Py_INIT_FAILED(err)) {
546+
if (_PyInitError_Failed(err)) {
547547
_Py_ExitInitError(err);
548548
}
549549
dump_config();
@@ -653,7 +653,7 @@ static int init_isolated_flag(void)
653653

654654
test_init_env_dev_mode_putenvs();
655655
err = _Py_InitializeFromConfig(&config);
656-
if (_Py_INIT_FAILED(err)) {
656+
if (_PyInitError_Failed(err)) {
657657
_Py_ExitInitError(err);
658658
}
659659
dump_config();
@@ -672,7 +672,7 @@ static int test_preinit_isolated1(void)
672672
preconfig.isolated = 1;
673673

674674
err = _Py_PreInitialize(&preconfig);
675-
if (_Py_INIT_FAILED(err)) {
675+
if (_PyInitError_Failed(err)) {
676676
_Py_ExitInitError(err);
677677
}
678678

@@ -682,7 +682,7 @@ static int test_preinit_isolated1(void)
682682

683683
test_init_env_dev_mode_putenvs();
684684
err = _Py_InitializeFromConfig(&config);
685-
if (_Py_INIT_FAILED(err)) {
685+
if (_PyInitError_Failed(err)) {
686686
_Py_ExitInitError(err);
687687
}
688688
dump_config();
@@ -701,7 +701,7 @@ static int test_preinit_isolated2(void)
701701
preconfig.isolated = 0;
702702

703703
err = _Py_PreInitialize(&preconfig);
704-
if (_Py_INIT_FAILED(err)) {
704+
if (_PyInitError_Failed(err)) {
705705
_Py_ExitInitError(err);
706706
}
707707

@@ -717,7 +717,7 @@ static int test_preinit_isolated2(void)
717717

718718
test_init_env_dev_mode_putenvs();
719719
err = _Py_InitializeFromConfig(&config);
720-
if (_Py_INIT_FAILED(err)) {
720+
if (_PyInitError_Failed(err)) {
721721
_Py_ExitInitError(err);
722722
}
723723
dump_config();
@@ -734,7 +734,7 @@ static int init_isolated_config(void)
734734
_PyPreConfig_InitIsolatedConfig(&preconfig);
735735

736736
err = _Py_PreInitialize(&preconfig);
737-
if (_Py_INIT_FAILED(err)) {
737+
if (_PyInitError_Failed(err)) {
738738
_Py_ExitInitError(err);
739739
}
740740

@@ -744,13 +744,13 @@ static int init_isolated_config(void)
744744

745745
_PyCoreConfig config;
746746
err = _PyCoreConfig_InitIsolatedConfig(&config);
747-
if (_Py_INIT_FAILED(err)) {
747+
if (_PyInitError_Failed(err)) {
748748
_Py_ExitInitError(err);
749749
}
750750
config.program_name = L"./_testembed";
751751

752752
err = _Py_InitializeFromConfig(&config);
753-
if (_Py_INIT_FAILED(err)) {
753+
if (_PyInitError_Failed(err)) {
754754
_Py_ExitInitError(err);
755755
}
756756
dump_config();
@@ -767,19 +767,19 @@ static int init_python_config(void)
767767
_PyPreConfig_InitPythonConfig(&preconfig);
768768

769769
err = _Py_PreInitialize(&preconfig);
770-
if (_Py_INIT_FAILED(err)) {
770+
if (_PyInitError_Failed(err)) {
771771
_Py_ExitInitError(err);
772772
}
773773

774774
_PyCoreConfig config;
775775
err = _PyCoreConfig_InitPythonConfig(&config);
776-
if (_Py_INIT_FAILED(err)) {
776+
if (_PyInitError_Failed(err)) {
777777
_Py_ExitInitError(err);
778778
}
779779
config.program_name = L"./_testembed";
780780

781781
err = _Py_InitializeFromConfig(&config);
782-
if (_Py_INIT_FAILED(err)) {
782+
if (_PyInitError_Failed(err)) {
783783
_Py_ExitInitError(err);
784784
}
785785
dump_config();
@@ -798,14 +798,14 @@ static int init_dont_configure_locale(void)
798798
preconfig.coerce_c_locale_warn = 1;
799799

800800
err = _Py_PreInitialize(&preconfig);
801-
if (_Py_INIT_FAILED(err)) {
801+
if (_PyInitError_Failed(err)) {
802802
_Py_ExitInitError(err);
803803
}
804804

805805
_PyCoreConfig config = _PyCoreConfig_INIT;
806806
config.program_name = L"./_testembed";
807807
err = _Py_InitializeFromConfig(&config);
808-
if (_Py_INIT_FAILED(err)) {
808+
if (_PyInitError_Failed(err)) {
809809
_Py_ExitInitError(err);
810810
}
811811

@@ -824,7 +824,7 @@ static int init_dev_mode(void)
824824
config.dev_mode = 1;
825825
config.program_name = L"./_testembed";
826826
_PyInitError err = _Py_InitializeFromConfig(&config);
827-
if (_Py_INIT_FAILED(err)) {
827+
if (_PyInitError_Failed(err)) {
828828
_Py_ExitInitError(err);
829829
}
830830
dump_config();
@@ -840,30 +840,30 @@ static int test_init_read_set(void)
840840
_PyCoreConfig_Init(&config);
841841

842842
err = _PyCoreConfig_DecodeLocale(&config.program_name, "./init_read_set");
843-
if (_Py_INIT_FAILED(err)) {
843+
if (_PyInitError_Failed(err)) {
844844
goto fail;
845845
}
846846

847847
err = _PyCoreConfig_Read(&config);
848-
if (_Py_INIT_FAILED(err)) {
848+
if (_PyInitError_Failed(err)) {
849849
goto fail;
850850
}
851851

852852
if (_PyWstrList_Append(&config.module_search_paths,
853853
L"init_read_set_path") < 0) {
854-
err = _Py_INIT_NO_MEMORY();
854+
err = _PyInitError_NoMemory();
855855
goto fail;
856856
}
857857

858858
/* override executable computed by _PyCoreConfig_Read() */
859859
err = _PyCoreConfig_SetString(&config.executable, L"my_executable");
860-
if (_Py_INIT_FAILED(err)) {
860+
if (_PyInitError_Failed(err)) {
861861
goto fail;
862862
}
863863

864864
err = _Py_InitializeFromConfig(&config);
865865
_PyCoreConfig_Clear(&config);
866-
if (_Py_INIT_FAILED(err)) {
866+
if (_PyInitError_Failed(err)) {
867867
goto fail;
868868
}
869869
dump_config();
@@ -898,7 +898,7 @@ static int test_init_run_main(void)
898898
configure_init_main(&config);
899899

900900
_PyInitError err = _Py_InitializeFromConfig(&config);
901-
if (_Py_INIT_FAILED(err)) {
901+
if (_PyInitError_Failed(err)) {
902902
_Py_ExitInitError(err);
903903
}
904904

@@ -914,7 +914,7 @@ static int test_init_main(void)
914914
config._init_main = 0;
915915

916916
_PyInitError err = _Py_InitializeFromConfig(&config);
917-
if (_Py_INIT_FAILED(err)) {
917+
if (_PyInitError_Failed(err)) {
918918
_Py_ExitInitError(err);
919919
}
920920

@@ -928,7 +928,7 @@ static int test_init_main(void)
928928
}
929929

930930
err = _Py_InitializeMain();
931-
if (_Py_INIT_FAILED(err)) {
931+
if (_PyInitError_Failed(err)) {
932932
_Py_ExitInitError(err);
933933
}
934934

@@ -951,7 +951,7 @@ static int test_run_main(void)
951951
config.program_name = L"./python3";
952952

953953
_PyInitError err = _Py_InitializeFromConfig(&config);
954-
if (_Py_INIT_FAILED(err)) {
954+
if (_PyInitError_Failed(err)) {
955955
_Py_ExitInitError(err);
956956
}
957957

Python/bootstrap_hash.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#include "Python.h"
2+
#include "pycore_coreconfig.h"
23
#ifdef MS_WINDOWS
34
# include <windows.h>
45
/* All sample MSDN wincrypt programs include the header below. It is at least

0 commit comments

Comments
 (0)