Skip to content

Commit b594784

Browse files
authored
bpo-36763: _Py_InitializeFromArgs() argc becomes Py_ssize_t (GH-13396)
* The type of initlization function 'argc' parameters becomes Py_ssize_t, instead of int. * Change _PyPreConfig_Copy() return type to void, instead of int. The function cannot fail anymore. * Fix compilation warnings on Windows.
1 parent 4fa7504 commit b594784

File tree

5 files changed

+25
-53
lines changed

5 files changed

+25
-53
lines changed

Include/cpython/pylifecycle.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@ PyAPI_FUNC(_PyInitError) _Py_PreInitialize(
1818
const _PyPreConfig *src_config);
1919
PyAPI_FUNC(_PyInitError) _Py_PreInitializeFromArgs(
2020
const _PyPreConfig *src_config,
21-
int argc,
21+
Py_ssize_t argc,
2222
char **argv);
2323
PyAPI_FUNC(_PyInitError) _Py_PreInitializeFromWideArgs(
2424
const _PyPreConfig *src_config,
25-
int argc,
25+
Py_ssize_t argc,
2626
wchar_t **argv);
2727

2828
PyAPI_FUNC(int) _Py_IsCoreInitialized(void);
@@ -34,11 +34,11 @@ PyAPI_FUNC(_PyInitError) _Py_InitializeFromConfig(
3434
const _PyCoreConfig *config);
3535
PyAPI_FUNC(_PyInitError) _Py_InitializeFromArgs(
3636
const _PyCoreConfig *config,
37-
int argc,
37+
Py_ssize_t argc,
3838
char **argv);
3939
PyAPI_FUNC(_PyInitError) _Py_InitializeFromWideArgs(
4040
const _PyCoreConfig *config,
41-
int argc,
41+
Py_ssize_t argc,
4242
wchar_t **argv);
4343
PyAPI_FUNC(_PyInitError) _Py_InitializeMain(void);
4444

Include/internal/pycore_coreconfig.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ PyAPI_FUNC(int) _PyWstrList_Extend(_PyWstrList *list,
6161
/* --- _PyArgv ---------------------------------------------------- */
6262

6363
typedef struct {
64-
int argc;
64+
Py_ssize_t argc;
6565
int use_bytes_argv;
6666
char **bytes_argv;
6767
wchar_t **wchar_argv;
@@ -123,7 +123,7 @@ PyAPI_FUNC(_PyInitError) _PyPreCmdline_Read(_PyPreCmdline *cmdline,
123123
PyAPI_FUNC(void) _PyPreConfig_Init(_PyPreConfig *config);
124124
PyAPI_FUNC(void) _PyPreConfig_InitPythonConfig(_PyPreConfig *config);
125125
PyAPI_FUNC(void) _PyPreConfig_InitIsolatedConfig(_PyPreConfig *config);
126-
PyAPI_FUNC(int) _PyPreConfig_Copy(_PyPreConfig *config,
126+
PyAPI_FUNC(void) _PyPreConfig_Copy(_PyPreConfig *config,
127127
const _PyPreConfig *config2);
128128
PyAPI_FUNC(PyObject*) _PyPreConfig_AsDict(const _PyPreConfig *config);
129129
PyAPI_FUNC(void) _PyPreConfig_GetCoreConfig(_PyPreConfig *config,
@@ -158,10 +158,10 @@ PyAPI_FUNC(_PyInitError) _PyCoreConfig_SetPyArgv(
158158
const _PyArgv *args);
159159
PyAPI_FUNC(_PyInitError) _PyCoreConfig_SetArgv(
160160
_PyCoreConfig *config,
161-
int argc,
161+
Py_ssize_t argc,
162162
char **argv);
163163
PyAPI_FUNC(_PyInitError) _PyCoreConfig_SetWideArgv(_PyCoreConfig *config,
164-
int argc,
164+
Py_ssize_t argc,
165165
wchar_t **argv);
166166

167167

Python/coreconfig.c

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1746,7 +1746,7 @@ config_usage(int error, const wchar_t* program)
17461746
/* Parse the command line arguments */
17471747
static _PyInitError
17481748
config_parse_cmdline(_PyCoreConfig *config, _PyWstrList *warnoptions,
1749-
int *opt_index)
1749+
Py_ssize_t *opt_index)
17501750
{
17511751
_PyInitError err;
17521752
const _PyWstrList *argv = &config->argv;
@@ -2044,7 +2044,7 @@ config_init_warnoptions(_PyCoreConfig *config,
20442044

20452045

20462046
static _PyInitError
2047-
config_update_argv(_PyCoreConfig *config, int opt_index)
2047+
config_update_argv(_PyCoreConfig *config, Py_ssize_t opt_index)
20482048
{
20492049
const _PyWstrList *cmdline_argv = &config->argv;
20502050
_PyWstrList config_argv = _PyWstrList_INIT;
@@ -2105,10 +2105,7 @@ core_read_precmdline(_PyCoreConfig *config, _PyPreCmdline *precmdline)
21052105

21062106
_PyPreConfig preconfig;
21072107
_PyPreConfig_Init(&preconfig);
2108-
if (_PyPreConfig_Copy(&preconfig, &_PyRuntime.preconfig) < 0) {
2109-
err = _Py_INIT_NO_MEMORY();
2110-
return err;
2111-
}
2108+
_PyPreConfig_Copy(&preconfig, &_PyRuntime.preconfig);
21122109

21132110
_PyPreConfig_GetCoreConfig(&preconfig, config);
21142111

@@ -2145,7 +2142,7 @@ config_read_cmdline(_PyCoreConfig *config)
21452142
}
21462143

21472144
if (config->parse_argv) {
2148-
int opt_index;
2145+
Py_ssize_t opt_index;
21492146
err = config_parse_cmdline(config, &cmdline_warnoptions, &opt_index);
21502147
if (_Py_INIT_FAILED(err)) {
21512148
goto done;
@@ -2207,7 +2204,7 @@ _PyCoreConfig_SetPyArgv(_PyCoreConfig *config, const _PyArgv *args)
22072204
/* Set config.argv: decode argv using Py_DecodeLocale(). Pre-initialize Python
22082205
if needed to ensure that encodings are properly configured. */
22092206
_PyInitError
2210-
_PyCoreConfig_SetArgv(_PyCoreConfig *config, int argc, char **argv)
2207+
_PyCoreConfig_SetArgv(_PyCoreConfig *config, Py_ssize_t argc, char **argv)
22112208
{
22122209
_PyArgv args = {
22132210
.argc = argc,
@@ -2219,7 +2216,7 @@ _PyCoreConfig_SetArgv(_PyCoreConfig *config, int argc, char **argv)
22192216

22202217

22212218
_PyInitError
2222-
_PyCoreConfig_SetWideArgv(_PyCoreConfig *config, int argc, wchar_t **argv)
2219+
_PyCoreConfig_SetWideArgv(_PyCoreConfig *config, Py_ssize_t argc, wchar_t **argv)
22232220
{
22242221
_PyArgv args = {
22252222
.argc = argc,

Python/preconfig.c

Lines changed: 6 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -297,35 +297,24 @@ _PyPreConfig_InitIsolatedConfig(_PyPreConfig *config)
297297
}
298298

299299

300-
int
300+
void
301301
_PyPreConfig_Copy(_PyPreConfig *config, const _PyPreConfig *config2)
302302
{
303303
#define COPY_ATTR(ATTR) config->ATTR = config2->ATTR
304-
#define COPY_STR_ATTR(ATTR) \
305-
do { \
306-
if (config2->ATTR != NULL) { \
307-
config->ATTR = _PyMem_RawStrdup(config2->ATTR); \
308-
if (config->ATTR == NULL) { \
309-
return -1; \
310-
} \
311-
} \
312-
} while (0)
313304

314305
COPY_ATTR(isolated);
315306
COPY_ATTR(use_environment);
316307
COPY_ATTR(configure_locale);
317308
COPY_ATTR(dev_mode);
318309
COPY_ATTR(coerce_c_locale);
319310
COPY_ATTR(coerce_c_locale_warn);
311+
COPY_ATTR(utf8_mode);
312+
COPY_ATTR(allocator);
320313
#ifdef MS_WINDOWS
321314
COPY_ATTR(legacy_windows_fs_encoding);
322315
#endif
323-
COPY_ATTR(utf8_mode);
324-
COPY_ATTR(allocator);
325316

326317
#undef COPY_ATTR
327-
#undef COPY_STR_ATTR
328-
return 0;
329318
}
330319

331320

@@ -750,9 +739,7 @@ _PyPreConfig_Read(_PyPreConfig *config, const _PyArgv *args)
750739
/* Save the config to be able to restore it if encodings change */
751740
_PyPreConfig save_config;
752741
_PyPreConfig_Init(&save_config);
753-
if (_PyPreConfig_Copy(&save_config, config) < 0) {
754-
return _Py_INIT_NO_MEMORY();
755-
}
742+
_PyPreConfig_Copy(&save_config, config);
756743

757744
/* Set LC_CTYPE to the user preferred locale */
758745
if (config->configure_locale) {
@@ -835,10 +822,7 @@ _PyPreConfig_Read(_PyPreConfig *config, const _PyArgv *args)
835822
just keep UTF-8 Mode value. */
836823
int new_utf8_mode = config->utf8_mode;
837824
int new_coerce_c_locale = config->coerce_c_locale;
838-
if (_PyPreConfig_Copy(config, &save_config) < 0) {
839-
err = _Py_INIT_NO_MEMORY();
840-
goto done;
841-
}
825+
_PyPreConfig_Copy(config, &save_config);
842826
config->utf8_mode = new_utf8_mode;
843827
config->coerce_c_locale = new_coerce_c_locale;
844828

@@ -900,13 +884,7 @@ _PyPreConfig_Write(const _PyPreConfig *config)
900884
}
901885

902886
/* Write the new pre-configuration into _PyRuntime */
903-
PyMemAllocatorEx old_alloc;
904-
_PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
905-
int res = _PyPreConfig_Copy(&_PyRuntime.preconfig, config);
906-
PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
907-
if (res < 0) {
908-
return _Py_INIT_NO_MEMORY();
909-
}
887+
_PyPreConfig_Copy(&_PyRuntime.preconfig, config);
910888

911889
return _Py_INIT_OK();
912890
}

Python/pylifecycle.c

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -705,10 +705,7 @@ _Py_PreInitializeFromPyArgv(const _PyPreConfig *src_config, const _PyArgv *args)
705705
_PyPreConfig_Init(&config);
706706

707707
if (src_config) {
708-
if (_PyPreConfig_Copy(&config, src_config) < 0) {
709-
err = _Py_INIT_NO_MEMORY();
710-
return err;
711-
}
708+
_PyPreConfig_Copy(&config, src_config);
712709
}
713710

714711
err = _PyPreConfig_Read(&config, args);
@@ -727,15 +724,15 @@ _Py_PreInitializeFromPyArgv(const _PyPreConfig *src_config, const _PyArgv *args)
727724

728725

729726
_PyInitError
730-
_Py_PreInitializeFromArgs(const _PyPreConfig *src_config, int argc, char **argv)
727+
_Py_PreInitializeFromArgs(const _PyPreConfig *src_config, Py_ssize_t argc, char **argv)
731728
{
732729
_PyArgv args = {.use_bytes_argv = 1, .argc = argc, .bytes_argv = argv};
733730
return _Py_PreInitializeFromPyArgv(src_config, &args);
734731
}
735732

736733

737734
_PyInitError
738-
_Py_PreInitializeFromWideArgs(const _PyPreConfig *src_config, int argc, wchar_t **argv)
735+
_Py_PreInitializeFromWideArgs(const _PyPreConfig *src_config, Py_ssize_t argc, wchar_t **argv)
739736
{
740737
_PyArgv args = {.use_bytes_argv = 0, .argc = argc, .wchar_argv = argv};
741738
return _Py_PreInitializeFromPyArgv(src_config, &args);
@@ -1024,15 +1021,15 @@ init_python(const _PyCoreConfig *config, const _PyArgv *args)
10241021

10251022

10261023
_PyInitError
1027-
_Py_InitializeFromArgs(const _PyCoreConfig *config, int argc, char **argv)
1024+
_Py_InitializeFromArgs(const _PyCoreConfig *config, Py_ssize_t argc, char **argv)
10281025
{
10291026
_PyArgv args = {.use_bytes_argv = 1, .argc = argc, .bytes_argv = argv};
10301027
return init_python(config, &args);
10311028
}
10321029

10331030

10341031
_PyInitError
1035-
_Py_InitializeFromWideArgs(const _PyCoreConfig *config, int argc, wchar_t **argv)
1032+
_Py_InitializeFromWideArgs(const _PyCoreConfig *config, Py_ssize_t argc, wchar_t **argv)
10361033
{
10371034
_PyArgv args = {.use_bytes_argv = 0, .argc = argc, .wchar_argv = argv};
10381035
return init_python(config, &args);

0 commit comments

Comments
 (0)