Skip to content

Commit 5f38b84

Browse files
authored
bpo-36763: Add _PyCoreConfig_SetArgv() (GH-13030)
* Add 2 new config methods: * _PyCoreConfig_SetArgv() * _PyCoreConfig_SetWideArgv() * Add also an internal _PyCoreConfig_SetPyArgv() method. * Remove 'args' parameter from _PyCoreConfig_Read().
1 parent 463b82a commit 5f38b84

File tree

5 files changed

+58
-17
lines changed

5 files changed

+58
-17
lines changed

Include/internal/pycore_coreconfig.h

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,11 +108,21 @@ PyAPI_FUNC(int) _PyCoreConfig_Copy(
108108
PyAPI_FUNC(_PyInitError) _PyCoreConfig_InitPathConfig(_PyCoreConfig *config);
109109
PyAPI_FUNC(_PyInitError) _PyCoreConfig_SetPathConfig(
110110
const _PyCoreConfig *config);
111-
PyAPI_FUNC(_PyInitError) _PyCoreConfig_Read(_PyCoreConfig *config,
112-
const _PyArgv *args);
111+
PyAPI_FUNC(_PyInitError) _PyCoreConfig_Read(_PyCoreConfig *config);
113112
PyAPI_FUNC(void) _PyCoreConfig_Write(const _PyCoreConfig *config,
114113
_PyRuntimeState *runtime);
115114

115+
PyAPI_FUNC(_PyInitError) _PyCoreConfig_SetPyArgv(
116+
_PyCoreConfig *config,
117+
const _PyArgv *args);
118+
PyAPI_FUNC(_PyInitError) _PyCoreConfig_SetArgv(
119+
_PyCoreConfig *config,
120+
int argc,
121+
char **argv);
122+
PyAPI_FUNC(_PyInitError) _PyCoreConfig_SetWideArgv(_PyCoreConfig *config,
123+
int argc,
124+
wchar_t **argv);
125+
116126

117127
/* --- Function used for testing ---------------------------------- */
118128

Lib/test/pythoninfo.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -602,8 +602,7 @@ def collect_gdbm(info_add):
602602

603603

604604
def collect_get_config(info_add):
605-
# Dump global configuration variables, _PyCoreConfig
606-
# and _PyMainInterpreterConfig
605+
# Get global configuration variables, _PyPreConfig and _PyCoreConfig
607606
try:
608607
from _testinternalcapi import get_configs
609608
except ImportError:

Python/coreconfig.c

Lines changed: 34 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2003,8 +2003,7 @@ config_init_argv(_PyCoreConfig *config, const _PyPreCmdline *cmdline)
20032003

20042004

20052005
static _PyInitError
2006-
core_read_precmdline(_PyCoreConfig *config, const _PyArgv *args,
2007-
_PyPreCmdline *precmdline)
2006+
core_read_precmdline(_PyCoreConfig *config, _PyPreCmdline *precmdline)
20082007
{
20092008
_PyInitError err;
20102009

@@ -2072,23 +2071,47 @@ config_read_cmdline(_PyCoreConfig *config, _PyPreCmdline *precmdline)
20722071
}
20732072

20742073

2074+
_PyInitError
2075+
_PyCoreConfig_SetPyArgv(_PyCoreConfig *config, const _PyArgv *args)
2076+
{
2077+
return _PyArgv_AsWstrList(args, &config->argv);
2078+
}
2079+
2080+
2081+
_PyInitError
2082+
_PyCoreConfig_SetArgv(_PyCoreConfig *config, int argc, char **argv)
2083+
{
2084+
_PyArgv args = {
2085+
.argc = argc,
2086+
.use_bytes_argv = 1,
2087+
.bytes_argv = argv,
2088+
.wchar_argv = NULL};
2089+
return _PyCoreConfig_SetPyArgv(config, &args);
2090+
}
2091+
2092+
2093+
_PyInitError
2094+
_PyCoreConfig_SetWideArgv(_PyCoreConfig *config, int argc, wchar_t **argv)
2095+
{
2096+
_PyArgv args = {
2097+
.argc = argc,
2098+
.use_bytes_argv = 0,
2099+
.bytes_argv = NULL,
2100+
.wchar_argv = argv};
2101+
return _PyCoreConfig_SetPyArgv(config, &args);
2102+
}
2103+
2104+
20752105
/* Read the configuration into _PyCoreConfig from:
20762106
20772107
* Command line arguments
20782108
* Environment variables
20792109
* Py_xxx global configuration variables */
20802110
_PyInitError
2081-
_PyCoreConfig_Read(_PyCoreConfig *config, const _PyArgv *args)
2111+
_PyCoreConfig_Read(_PyCoreConfig *config)
20822112
{
20832113
_PyInitError err;
20842114

2085-
if (args) {
2086-
err = _PyArgv_AsWstrList(args, &config->argv);
2087-
if (_Py_INIT_FAILED(err)) {
2088-
return err;
2089-
}
2090-
}
2091-
20922115
err = _Py_PreInitializeFromCoreConfig(config);
20932116
if (_Py_INIT_FAILED(err)) {
20942117
return err;
@@ -2097,7 +2120,7 @@ _PyCoreConfig_Read(_PyCoreConfig *config, const _PyArgv *args)
20972120
_PyCoreConfig_GetGlobalConfig(config);
20982121

20992122
_PyPreCmdline precmdline = _PyPreCmdline_INIT;
2100-
err = core_read_precmdline(config, args, &precmdline);
2123+
err = core_read_precmdline(config, &precmdline);
21012124
if (_Py_INIT_FAILED(err)) {
21022125
goto done;
21032126
}

Python/pathconfig.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -394,7 +394,7 @@ pathconfig_global_init(void)
394394
_PyInitError err;
395395
_PyCoreConfig config = _PyCoreConfig_INIT;
396396

397-
err = _PyCoreConfig_Read(&config, NULL);
397+
err = _PyCoreConfig_Read(&config);
398398
if (_Py_INIT_FAILED(err)) {
399399
goto error;
400400
}

Python/pylifecycle.c

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -801,13 +801,22 @@ pyinit_coreconfig(_PyRuntimeState *runtime,
801801
const _PyArgv *args,
802802
PyInterpreterState **interp_p)
803803
{
804+
_PyInitError err;
805+
804806
if (src_config) {
805807
if (_PyCoreConfig_Copy(config, src_config) < 0) {
806808
return _Py_INIT_NO_MEMORY();
807809
}
808810
}
809811

810-
_PyInitError err = _PyCoreConfig_Read(config, args);
812+
if (args) {
813+
err = _PyCoreConfig_SetPyArgv(config, args);
814+
if (_Py_INIT_FAILED(err)) {
815+
return err;
816+
}
817+
}
818+
819+
err = _PyCoreConfig_Read(config);
811820
if (_Py_INIT_FAILED(err)) {
812821
return err;
813822
}

0 commit comments

Comments
 (0)