Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 5ac27a5

Browse files
authored
bpo-36444: Rework _Py_InitializeFromConfig() API (GH-12576)
1 parent 364f0b0 commit 5ac27a5

11 files changed

Lines changed: 207 additions & 190 deletions

File tree

Include/cpython/coreconfig.h

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,6 @@
55
extern "C" {
66
#endif
77

8-
/* --- _PyArgv ---------------------------------------------------- */
9-
10-
typedef struct {
11-
int argc;
12-
int use_bytes_argv;
13-
char **bytes_argv;
14-
wchar_t **wchar_argv;
15-
} _PyArgv;
16-
17-
188
/* --- _PyInitError ----------------------------------------------- */
199

2010
typedef struct {

Include/cpython/pylifecycle.h

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,23 +14,33 @@ PyAPI_FUNC(int) Py_SetStandardStreamEncoding(const char *encoding,
1414

1515
/* PEP 432 Multi-phase initialization API (Private while provisional!) */
1616

17-
PyAPI_FUNC(_PyInitError) _Py_PreInitialize(void);
18-
PyAPI_FUNC(_PyInitError) _Py_PreInitializeFromPreConfig(
19-
const _PyPreConfig *preconfig);
20-
PyAPI_FUNC(_PyInitError) _Py_PreInitializeFromConfig(
21-
const _PyCoreConfig *coreconfig);
17+
PyAPI_FUNC(_PyInitError) _Py_PreInitialize(
18+
const _PyPreConfig *src_config);
19+
PyAPI_FUNC(_PyInitError) _Py_PreInitializeFromArgs(
20+
const _PyPreConfig *src_config,
21+
int argc,
22+
char **argv);
23+
PyAPI_FUNC(_PyInitError) _Py_PreInitializeFromWideArgs(
24+
const _PyPreConfig *src_config,
25+
int argc,
26+
wchar_t **argv);
2227

2328
PyAPI_FUNC(int) _Py_IsCoreInitialized(void);
2429

2530

26-
PyAPI_FUNC(_PyInitError) _Py_InitializeMainInterpreter(
27-
PyInterpreterState *interp);
28-
2931
/* Initialization and finalization */
3032

3133
PyAPI_FUNC(_PyInitError) _Py_InitializeFromConfig(
34+
const _PyCoreConfig *config);
35+
PyAPI_FUNC(_PyInitError) _Py_InitializeFromArgs(
36+
const _PyCoreConfig *config,
37+
int argc,
38+
char **argv);
39+
PyAPI_FUNC(_PyInitError) _Py_InitializeFromWideArgs(
3240
const _PyCoreConfig *config,
33-
PyInterpreterState **interp_p);
41+
int argc,
42+
wchar_t **argv);
43+
3444
PyAPI_FUNC(void) _Py_NO_RETURN _Py_ExitInitError(_PyInitError err);
3545

3646
/* Py_PyAtExit is for the atexit module, Py_AtExit is for low-level

Include/internal/pycore_coreconfig.h

Lines changed: 41 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -9,34 +9,6 @@ extern "C" {
99
#endif
1010

1111

12-
/* --- _PyPreCmdline ------------------------------------------------- */
13-
14-
typedef struct {
15-
_PyWstrList argv;
16-
_PyWstrList xoptions; /* "-X value" option */
17-
int isolated; /* -I option */
18-
int use_environment; /* -E option */
19-
int dev_mode; /* -X dev and PYTHONDEVMODE */
20-
} _PyPreCmdline;
21-
22-
#define _PyPreCmdline_INIT \
23-
(_PyPreCmdline){ \
24-
.use_environment = -1, \
25-
.isolated = -1, \
26-
.dev_mode = -1}
27-
/* Note: _PyPreCmdline_INIT sets other fields to 0/NULL */
28-
29-
PyAPI_FUNC(void) _PyPreCmdline_Clear(_PyPreCmdline *cmdline);
30-
PyAPI_FUNC(_PyInitError) _PyPreCmdline_SetArgv(_PyPreCmdline *cmdline,
31-
const _PyArgv *args);
32-
PyAPI_FUNC(int) _PyPreCmdline_SetCoreConfig(
33-
const _PyPreCmdline *cmdline,
34-
_PyCoreConfig *config);
35-
PyAPI_FUNC(_PyInitError) _PyPreCmdline_Read(_PyPreCmdline *cmdline,
36-
const _PyPreConfig *preconfig,
37-
const _PyCoreConfig *coreconfig);
38-
39-
4012
/* --- _PyWstrList ------------------------------------------------ */
4113

4214
#ifndef NDEBUG
@@ -54,15 +26,17 @@ PyAPI_FUNC(int) _PyWstrList_Extend(_PyWstrList *list,
5426

5527
/* --- _PyArgv ---------------------------------------------------- */
5628

29+
typedef struct {
30+
int argc;
31+
int use_bytes_argv;
32+
char **bytes_argv;
33+
wchar_t **wchar_argv;
34+
} _PyArgv;
35+
5736
PyAPI_FUNC(_PyInitError) _PyArgv_AsWstrList(const _PyArgv *args,
5837
_PyWstrList *list);
5938

6039

61-
/* --- Py_GetArgcArgv() helpers ----------------------------------- */
62-
63-
PyAPI_FUNC(void) _Py_ClearArgcArgv(void);
64-
65-
6640
/* --- Helper functions ------------------------------------------- */
6741

6842
PyAPI_FUNC(int) _Py_str_to_int(
@@ -79,15 +53,47 @@ PyAPI_FUNC(void) _Py_get_env_flag(
7953
int *flag,
8054
const char *name);
8155

56+
/* Py_GetArgcArgv() helper */
57+
PyAPI_FUNC(void) _Py_ClearArgcArgv(void);
58+
59+
60+
/* --- _PyPreCmdline ------------------------------------------------- */
61+
62+
typedef struct {
63+
_PyWstrList argv;
64+
_PyWstrList xoptions; /* "-X value" option */
65+
int isolated; /* -I option */
66+
int use_environment; /* -E option */
67+
int dev_mode; /* -X dev and PYTHONDEVMODE */
68+
} _PyPreCmdline;
69+
70+
#define _PyPreCmdline_INIT \
71+
(_PyPreCmdline){ \
72+
.use_environment = -1, \
73+
.isolated = -1, \
74+
.dev_mode = -1}
75+
/* Note: _PyPreCmdline_INIT sets other fields to 0/NULL */
76+
77+
PyAPI_FUNC(void) _PyPreCmdline_Clear(_PyPreCmdline *cmdline);
78+
PyAPI_FUNC(_PyInitError) _PyPreCmdline_SetArgv(_PyPreCmdline *cmdline,
79+
const _PyArgv *args);
80+
PyAPI_FUNC(int) _PyPreCmdline_SetCoreConfig(
81+
const _PyPreCmdline *cmdline,
82+
_PyCoreConfig *config);
83+
PyAPI_FUNC(_PyInitError) _PyPreCmdline_Read(_PyPreCmdline *cmdline,
84+
const _PyPreConfig *preconfig);
85+
86+
8287
/* --- _PyPreConfig ----------------------------------------------- */
8388

8489
PyAPI_FUNC(void) _PyPreConfig_Clear(_PyPreConfig *config);
8590
PyAPI_FUNC(int) _PyPreConfig_Copy(_PyPreConfig *config,
8691
const _PyPreConfig *config2);
8792
PyAPI_FUNC(PyObject*) _PyPreConfig_AsDict(const _PyPreConfig *config);
93+
PyAPI_FUNC(void) _PyCoreConfig_GetCoreConfig(_PyPreConfig *config,
94+
const _PyCoreConfig *core_config);
8895
PyAPI_FUNC(_PyInitError) _PyPreConfig_Read(_PyPreConfig *config,
89-
const _PyArgv *args,
90-
const _PyCoreConfig *coreconfig);
96+
const _PyArgv *args);
9197
PyAPI_FUNC(_PyInitError) _PyPreConfig_Write(_PyPreConfig *config);
9298

9399

Include/internal/pycore_pylifecycle.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,8 @@ extern void _PyGILState_Fini(void);
7777

7878
PyAPI_FUNC(void) _PyGC_DumpShutdownStats(void);
7979

80-
PyAPI_FUNC(_PyInitError) _Py_PreInitializeInPlace(
81-
_PyPreConfig *config);
80+
PyAPI_FUNC(_PyInitError) _Py_PreInitializeFromCoreConfig(
81+
const _PyCoreConfig *coreconfig);
8282

8383
#ifdef __cplusplus
8484
}

Modules/main.c

Lines changed: 19 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -34,27 +34,7 @@ extern "C" {
3434
/* --- pymain_init() ---------------------------------------------- */
3535

3636
static _PyInitError
37-
pymain_init_preconfig(const _PyArgv *args)
38-
{
39-
_PyInitError err;
40-
41-
_PyPreConfig config = _PyPreConfig_INIT;
42-
43-
err = _PyPreConfig_Read(&config, args, NULL);
44-
if (_Py_INIT_FAILED(err)) {
45-
goto done;
46-
}
47-
48-
err = _Py_PreInitializeInPlace(&config);
49-
50-
done:
51-
_PyPreConfig_Clear(&config);
52-
return err;
53-
}
54-
55-
56-
static _PyInitError
57-
pymain_init(const _PyArgv *args, PyInterpreterState **interp_p)
37+
pymain_init(const _PyArgv *args)
5838
{
5939
_PyInitError err;
6040

@@ -72,28 +52,24 @@ pymain_init(const _PyArgv *args, PyInterpreterState **interp_p)
7252
fedisableexcept(FE_OVERFLOW);
7353
#endif
7454

75-
err = pymain_init_preconfig(args);
76-
if (_Py_INIT_FAILED(err)) {
77-
return err;
78-
}
79-
8055
_PyCoreConfig config = _PyCoreConfig_INIT;
8156

82-
err = _PyCoreConfig_Read(&config, args);
83-
if (_Py_INIT_FAILED(err)) {
84-
goto done;
57+
if (args->use_bytes_argv) {
58+
err = _Py_PreInitializeFromArgs(NULL, args->argc, args->bytes_argv);
59+
}
60+
else {
61+
err = _Py_PreInitializeFromWideArgs(NULL, args->argc, args->wchar_argv);
8562
}
86-
87-
err = _Py_InitializeFromConfig(&config, interp_p);
8863
if (_Py_INIT_FAILED(err)) {
89-
goto done;
64+
return err;
9065
}
9166

92-
err = _Py_INIT_OK();
93-
94-
done:
95-
_PyCoreConfig_Clear(&config);
96-
return err;
67+
if (args->use_bytes_argv) {
68+
return _Py_InitializeFromArgs(&config, args->argc, args->bytes_argv);
69+
}
70+
else {
71+
return _Py_InitializeFromWideArgs(&config, args->argc, args->wchar_argv);
72+
}
9773
}
9874

9975

@@ -468,9 +444,12 @@ pymain_repl(_PyCoreConfig *config, PyCompilerFlags *cf, int *exitcode)
468444

469445

470446
static _PyInitError
471-
pymain_run_python(PyInterpreterState *interp, int *exitcode)
447+
pymain_run_python(int *exitcode)
472448
{
473449
_PyInitError err;
450+
451+
PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE();
452+
/* pymain_run_stdin() modify the config */
474453
_PyCoreConfig *config = &interp->core_config;
475454

476455
PyObject *main_importer_path = NULL;
@@ -586,14 +565,13 @@ pymain_main(_PyArgv *args)
586565
{
587566
_PyInitError err;
588567

589-
PyInterpreterState *interp;
590-
err = pymain_init(args, &interp);
568+
err = pymain_init(args);
591569
if (_Py_INIT_FAILED(err)) {
592570
goto exit_init_error;
593571
}
594572

595573
int exitcode = 0;
596-
err = pymain_run_python(interp, &exitcode);
574+
err = pymain_run_python(&exitcode);
597575
if (_Py_INIT_FAILED(err)) {
598576
goto exit_init_error;
599577
}

Programs/_freeze_importlib.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ main(int argc, char *argv[])
8686
config._frozen = 1;
8787
config._init_main = 0;
8888

89-
_PyInitError err = _Py_InitializeFromConfig(&config, NULL);
89+
_PyInitError err = _Py_InitializeFromConfig(&config);
9090
/* No need to call _PyCoreConfig_Clear() since we didn't allocate any
9191
memory: program_name is a constant string. */
9292
if (_Py_INIT_FAILED(err)) {

Programs/_testembed.c

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -408,7 +408,7 @@ static int test_init_from_config(void)
408408
Py_UTF8Mode = 0;
409409
preconfig.utf8_mode = 1;
410410

411-
err = _Py_PreInitializeFromPreConfig(&preconfig);
411+
err = _Py_PreInitialize(&preconfig);
412412
if (_Py_INIT_FAILED(err)) {
413413
_Py_ExitInitError(err);
414414
}
@@ -529,7 +529,7 @@ static int test_init_from_config(void)
529529
Py_FrozenFlag = 0;
530530
config._frozen = 1;
531531

532-
err = _Py_InitializeFromConfig(&config, NULL);
532+
err = _Py_InitializeFromConfig(&config);
533533
/* Don't call _PyCoreConfig_Clear() since all strings are static */
534534
if (_Py_INIT_FAILED(err)) {
535535
_Py_ExitInitError(err);
@@ -623,7 +623,7 @@ static int test_init_isolated(void)
623623
preconfig.coerce_c_locale = 0;
624624
preconfig.utf8_mode = 0;
625625

626-
err = _Py_PreInitializeFromPreConfig(&preconfig);
626+
err = _Py_PreInitialize(&preconfig);
627627
if (_Py_INIT_FAILED(err)) {
628628
_Py_ExitInitError(err);
629629
}
@@ -638,7 +638,7 @@ static int test_init_isolated(void)
638638
config.program_name = L"./_testembed";
639639

640640
test_init_env_dev_mode_putenvs();
641-
err = _Py_InitializeFromConfig(&config, NULL);
641+
err = _Py_InitializeFromConfig(&config);
642642
if (_Py_INIT_FAILED(err)) {
643643
_Py_ExitInitError(err);
644644
}
@@ -660,7 +660,7 @@ static int test_preinit_isolated1(void)
660660
preconfig.utf8_mode = 0;
661661
preconfig.isolated = 1;
662662

663-
err = _Py_PreInitializeFromPreConfig(&preconfig);
663+
err = _Py_PreInitialize(&preconfig);
664664
if (_Py_INIT_FAILED(err)) {
665665
_Py_ExitInitError(err);
666666
}
@@ -669,7 +669,7 @@ static int test_preinit_isolated1(void)
669669
config.program_name = L"./_testembed";
670670

671671
test_init_env_dev_mode_putenvs();
672-
err = _Py_InitializeFromConfig(&config, NULL);
672+
err = _Py_InitializeFromConfig(&config);
673673
if (_Py_INIT_FAILED(err)) {
674674
_Py_ExitInitError(err);
675675
}
@@ -691,7 +691,7 @@ static int test_preinit_isolated2(void)
691691
preconfig.utf8_mode = 0;
692692
preconfig.isolated = 0;
693693

694-
err = _Py_PreInitializeFromPreConfig(&preconfig);
694+
err = _Py_PreInitialize(&preconfig);
695695
if (_Py_INIT_FAILED(err)) {
696696
_Py_ExitInitError(err);
697697
}
@@ -706,7 +706,7 @@ static int test_preinit_isolated2(void)
706706
config.program_name = L"./_testembed";
707707

708708
test_init_env_dev_mode_putenvs();
709-
err = _Py_InitializeFromConfig(&config, NULL);
709+
err = _Py_InitializeFromConfig(&config);
710710
if (_Py_INIT_FAILED(err)) {
711711
_Py_ExitInitError(err);
712712
}
@@ -723,7 +723,7 @@ static int test_init_dev_mode(void)
723723
putenv("PYTHONMALLOC=");
724724
config.dev_mode = 1;
725725
config.program_name = L"./_testembed";
726-
_PyInitError err = _Py_InitializeFromConfig(&config, NULL);
726+
_PyInitError err = _Py_InitializeFromConfig(&config);
727727
if (_Py_INIT_FAILED(err)) {
728728
_Py_ExitInitError(err);
729729
}

0 commit comments

Comments
 (0)