bpo-36444: Add _PyCoreConfig._init_main (GH-12572) · python/cpython@484f20d · GitHub
Skip to content

Commit 484f20d

Browse files
authored
bpo-36444: Add _PyCoreConfig._init_main (GH-12572)
* Add _PyCoreConfig._init_main: if equals to zero, _Py_InitializeFromConfig() doesn't call _Py_InitializeMainInterpreter(). * Add interp_p parameter to _Py_InitializeFromConfig(). * pymain_init() now calls _Py_InitializeFromConfig(). * Make _Py_InitializeCore() private.
1 parent 8b9dbc0 commit 484f20d

9 files changed

Lines changed: 42 additions & 41 deletions

File tree

Include/cpython/coreconfig.h

Lines changed: 5 additions & 1 deletion

Include/cpython/pylifecycle.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,6 @@ PyAPI_FUNC(_PyInitError) _Py_PreInitializeFromPreConfig(
2020
PyAPI_FUNC(_PyInitError) _Py_PreInitializeFromConfig(
2121
const _PyCoreConfig *coreconfig);
2222

23-
PyAPI_FUNC(_PyInitError) _Py_InitializeCore(
24-
const _PyCoreConfig *config,
25-
PyInterpreterState **interp);
2623
PyAPI_FUNC(int) _Py_IsCoreInitialized(void);
2724

2825

@@ -32,7 +29,8 @@ PyAPI_FUNC(_PyInitError) _Py_InitializeMainInterpreter(
3229
/* Initialization and finalization */
3330

3431
PyAPI_FUNC(_PyInitError) _Py_InitializeFromConfig(
35-
const _PyCoreConfig *config);
32+
const _PyCoreConfig *config,
33+
PyInterpreterState **interp_p);
3634
PyAPI_FUNC(void) _Py_NO_RETURN _Py_ExitInitError(_PyInitError err);
3735

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

Lib/test/test_embed.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -338,6 +338,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase):
338338
'_install_importlib': 1,
339339
'_check_hash_pycs_mode': 'default',
340340
'_frozen': 0,
341+
'_init_main': 1,
341342
}
342343
if MS_WINDOWS:
343344
DEFAULT_PRE_CONFIG.update({

Modules/main.c

Lines changed: 10 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -53,19 +53,6 @@ pymain_init_preconfig(const _PyArgv *args)
5353
}
5454

5555

56-
static _PyInitError
57-
pymain_init_coreconfig(_PyCoreConfig *config, const _PyArgv *args,
58-
PyInterpreterState **interp_p)
59-
{
60-
_PyInitError err = _PyCoreConfig_Read(config, args);
61-
if (_Py_INIT_FAILED(err)) {
62-
return err;
63-
}
64-
65-
return _Py_InitializeCore(config, interp_p);
66-
}
67-
68-
6956
static _PyInitError
7057
pymain_init(const _PyArgv *args, PyInterpreterState **interp_p)
7158
{
@@ -91,18 +78,22 @@ pymain_init(const _PyArgv *args, PyInterpreterState **interp_p)
9178
}
9279

9380
_PyCoreConfig config = _PyCoreConfig_INIT;
94-
err = pymain_init_coreconfig(&config, args, interp_p);
95-
_PyCoreConfig_Clear(&config);
81+
82+
err = _PyCoreConfig_Read(&config, args);
9683
if (_Py_INIT_FAILED(err)) {
97-
return err;
84+
goto done;
9885
}
9986

100-
err = _Py_InitializeMainInterpreter(*interp_p);
87+
err = _Py_InitializeFromConfig(&config, interp_p);
10188
if (_Py_INIT_FAILED(err)) {
102-
return err;
89+
goto done;
10390
}
10491

105-
return _Py_INIT_OK();
92+
err = _Py_INIT_OK();
93+
94+
done:
95+
_PyCoreConfig_Clear(&config);
96+
return err;
10697
}
10798

10899

Programs/_freeze_importlib.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,9 @@ main(int argc, char *argv[])
8484
/* Don't install importlib, since it could execute outdated bytecode. */
8585
config._install_importlib = 0;
8686
config._frozen = 1;
87+
config._init_main = 0;
8788

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

Programs/_testembed.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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);
532+
err = _Py_InitializeFromConfig(&config, NULL);
533533
/* Don't call _PyCoreConfig_Clear() since all strings are static */
534534
if (_Py_INIT_FAILED(err)) {
535535
_Py_ExitInitError(err);
@@ -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);
641+
err = _Py_InitializeFromConfig(&config, NULL);
642642
if (_Py_INIT_FAILED(err)) {
643643
_Py_ExitInitError(err);
644644
}
@@ -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);
672+
err = _Py_InitializeFromConfig(&config, NULL);
673673
if (_Py_INIT_FAILED(err)) {
674674
_Py_ExitInitError(err);
675675
}
@@ -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);
709+
err = _Py_InitializeFromConfig(&config, NULL);
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);
726+
_PyInitError err = _Py_InitializeFromConfig(&config, NULL);
727727
if (_Py_INIT_FAILED(err)) {
728728
_Py_ExitInitError(err);
729729
}

Python/coreconfig.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -610,6 +610,7 @@ _PyCoreConfig_Copy(_PyCoreConfig *config, const _PyCoreConfig *config2)
610610
COPY_WSTR_ATTR(run_filename);
611611
COPY_ATTR(_check_hash_pycs_mode);
612612
COPY_ATTR(_frozen);
613+
COPY_ATTR(_init_main);
613614

614615
#undef COPY_ATTR
615616
#undef COPY_STR_ATTR
@@ -715,6 +716,7 @@ _PyCoreConfig_AsDict(const _PyCoreConfig *config)
715716
SET_ITEM_INT(_install_importlib);
716717
SET_ITEM_STR(_check_hash_pycs_mode);
717718
SET_ITEM_INT(_frozen);
719+
SET_ITEM_INT(_init_main);
718720

719721
return dict;
720722

Python/frozenmain.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ Py_FrozenMain(int argc, char **argv)
8282
if (argc >= 1)
8383
Py_SetProgramName(argv_copy[0]);
8484

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

Python/pylifecycle.c

Lines changed: 14 additions & 10 deletions

0 commit comments

Comments
 (0)