bpo-36301: Add _PyPreCmdline internal API (GH-12458) · python/cpython@fa15376 (original) (raw)

`@@ -1658,7 +1658,7 @@ _PyCoreConfig_AsDict(const _PyCoreConfig *config)

`

1658

1658

`/* --- _PyCmdline ------------------------------------------------- */

`

1659

1659

``

1660

1660

`typedef struct {

`

1661

``

`-

_PyWstrList argv;

`

``

1661

`+

_PyPreCmdline precmdline;

`

1662

1662

`_PyWstrList warnoptions; /* Command line -W options */

`

1663

1663

`_PyWstrList env_warnoptions; /* PYTHONWARNINGS environment variables */

`

1664

1664

`int print_help; /* -h, -? options */

`

`@@ -1669,9 +1669,9 @@ typedef struct {

`

1669

1669

`static void

`

1670

1670

`cmdline_clear(_PyCmdline *cmdline)

`

1671

1671

`{

`

``

1672

`+

_PyPreCmdline_Clear(&cmdline->precmdline);

`

1672

1673

`_PyWstrList_Clear(&cmdline->warnoptions);

`

1673

1674

`_PyWstrList_Clear(&cmdline->env_warnoptions);

`

1674

``

`-

_PyWstrList_Clear(&cmdline->argv);

`

1675

1675

`}

`

1676

1676

``

1677

1677

``

`@@ -1682,10 +1682,12 @@ static _PyInitError

`

1682

1682

`config_parse_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline,

`

1683

1683

`int *need_usage)

`

1684

1684

`{

`

``

1685

`+

const _PyWstrList *argv = &cmdline->precmdline.argv;

`

``

1686

+

1685

1687

`_PyOS_ResetGetOpt();

`

1686

1688

`do {

`

1687

1689

`int longindex = -1;

`

1688

``

`-

int c = _PyOS_GetOpt(cmdline->argv.length, cmdline->argv.items, &longindex);

`

``

1690

`+

int c = _PyOS_GetOpt(argv->length, argv->items, &longindex);

`

1689

1691

`if (c == EOF) {

`

1690

1692

`break;

`

1691

1693

` }

`

`@@ -1754,6 +1756,7 @@ config_parse_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline,

`

1754

1756

``

1755

1757

`case 'E':

`

1756

1758

`case 'I':

`

``

1759

`+

case 'X':

`

1757

1760

`/* option handled by _PyPreConfig_ReadFromArgv() */

`

1758

1761

`break;

`

1759

1762

``

`@@ -1806,12 +1809,6 @@ config_parse_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline,

`

1806

1809

` }

`

1807

1810

`break;

`

1808

1811

``

1809

``

`-

case 'X':

`

1810

``

`-

if (_PyWstrList_Append(&config->xoptions, _PyOS_optarg) < 0) {

`

1811

``

`-

return _Py_INIT_NO_MEMORY();

`

1812

``

`-

}

`

1813

``

`-

break;

`

1814

``

-

1815

1812

`case 'q':

`

1816

1813

`config->quiet++;

`

1817

1814

`break;

`

`@@ -1830,11 +1827,11 @@ config_parse_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline,

`

1830

1827

` } while (1);

`

1831

1828

``

1832

1829

`if (config->run_command == NULL && config->run_module == NULL

`

1833

``

`-

&& _PyOS_optind < cmdline->argv.length

`

1834

``

`-

&& wcscmp(cmdline->argv.items[_PyOS_optind], L"-") != 0

`

``

1830

`+

&& _PyOS_optind < argv->length

`

``

1831

`+

&& wcscmp(argv->items[_PyOS_optind], L"-") != 0

`

1835

1832

`&& config->run_filename == NULL)

`

1836

1833

` {

`

1837

``

`-

config->run_filename = _PyMem_RawWcsdup(cmdline->argv.items[_PyOS_optind]);

`

``

1834

`+

config->run_filename = _PyMem_RawWcsdup(argv->items[_PyOS_optind]);

`

1838

1835

`if (config->run_filename == NULL) {

`

1839

1836

`return _Py_INIT_NO_MEMORY();

`

1840

1837

` }

`

`@@ -1892,9 +1889,10 @@ cmdline_init_env_warnoptions(_PyCmdline *cmdline, const _PyCoreConfig *config)

`

1892

1889

`static _PyInitError

`

1893

1890

`config_init_program(_PyCoreConfig *config, const _PyCmdline *cmdline)

`

1894

1891

`{

`

``

1892

`+

const _PyWstrList *argv = &cmdline->precmdline.argv;

`

1895

1893

`wchar_t *program;

`

1896

``

`-

if (cmdline->argv.length >= 1) {

`

1897

``

`-

program = cmdline->argv.items[0];

`

``

1894

`+

if (argv->length >= 1) {

`

``

1895

`+

program = argv->items[0];

`

1898

1896

` }

`

1899

1897

`else {

`

1900

1898

`program = L"";

`

`@@ -1965,24 +1963,25 @@ config_init_warnoptions(_PyCoreConfig *config, const _PyCmdline *cmdline)

`

1965

1963

`static _PyInitError

`

1966

1964

`config_init_argv(_PyCoreConfig *config, const _PyCmdline *cmdline)

`

1967

1965

`{

`

1968

``

`-

_PyWstrList wargv = _PyWstrList_INIT;

`

``

1966

`+

const _PyWstrList *cmdline_argv = &cmdline->precmdline.argv;

`

``

1967

`+

_PyWstrList config_argv = _PyWstrList_INIT;

`

1969

1968

``

1970

1969

`/* Copy argv to be able to modify it (to force -c/-m) */

`

1971

``

`-

if (cmdline->argv.length <= _PyOS_optind) {

`

``

1970

`+

if (cmdline_argv->length <= _PyOS_optind) {

`

1972

1971

`/* Ensure at least one (empty) argument is seen */

`

1973

``

`-

if (_PyWstrList_Append(&wargv, L"") < 0) {

`

``

1972

`+

if (_PyWstrList_Append(&config_argv, L"") < 0) {

`

1974

1973

`return _Py_INIT_NO_MEMORY();

`

1975

1974

` }

`

1976

1975

` }

`

1977

1976

`else {

`

1978

1977

`_PyWstrList slice;

`

1979

``

`-

slice.length = cmdline->argv.length - _PyOS_optind;

`

1980

``

`-

slice.items = &cmdline->argv.items[_PyOS_optind];

`

1981

``

`-

if (_PyWstrList_Copy(&wargv, &slice) < 0) {

`

``

1978

`+

slice.length = cmdline_argv->length - _PyOS_optind;

`

``

1979

`+

slice.items = &cmdline_argv->items[_PyOS_optind];

`

``

1980

`+

if (_PyWstrList_Copy(&config_argv, &slice) < 0) {

`

1982

1981

`return _Py_INIT_NO_MEMORY();

`

1983

1982

` }

`

1984

1983

` }

`

1985

``

`-

assert(wargv.length >= 1);

`

``

1984

`+

assert(config_argv.length >= 1);

`

1986

1985

``

1987

1986

`wchar_t *arg0 = NULL;

`

1988

1987

`if (config->run_command != NULL) {

`

`@@ -1996,16 +1995,16 @@ config_init_argv(_PyCoreConfig *config, const _PyCmdline *cmdline)

`

1996

1995

`if (arg0 != NULL) {

`

1997

1996

`arg0 = _PyMem_RawWcsdup(arg0);

`

1998

1997

`if (arg0 == NULL) {

`

1999

``

`-

_PyWstrList_Clear(&wargv);

`

``

1998

`+

_PyWstrList_Clear(&config_argv);

`

2000

1999

`return _Py_INIT_NO_MEMORY();

`

2001

2000

` }

`

2002

2001

``

2003

``

`-

PyMem_RawFree(wargv.items[0]);

`

2004

``

`-

wargv.items[0] = arg0;

`

``

2002

`+

PyMem_RawFree(config_argv.items[0]);

`

``

2003

`+

config_argv.items[0] = arg0;

`

2005

2004

` }

`

2006

2005

``

2007

2006

`_PyWstrList_Clear(&config->argv);

`

2008

``

`-

config->argv = wargv;

`

``

2007

`+

config->argv = config_argv;

`

2009

2008

`return _Py_INIT_OK();

`

2010

2009

`}

`

2011

2010

``

`@@ -2046,6 +2045,16 @@ config_from_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline,

`

2046

2045

` }

`

2047

2046

` }

`

2048

2047

``

``

2048

`+

err = _PyPreCmdline_Read(&cmdline->precmdline);

`

``

2049

`+

if (_Py_INIT_FAILED(err)) {

`

``

2050

`+

return err;

`

``

2051

`+

}

`

``

2052

+

``

2053

`+

_PyPreCmdline_SetPreConfig(&cmdline->precmdline, &config->preconfig);

`

``

2054

`+

if (_PyWstrList_Extend(&config->xoptions, &cmdline->precmdline.xoptions) < 0) {

`

``

2055

`+

return _Py_INIT_NO_MEMORY();

`

``

2056

`+

}

`

``

2057

+

2049

2058

`err = config_parse_cmdline(config, cmdline, &need_usage);

`

2050

2059

`if (_Py_INIT_FAILED(err)) {

`

2051

2060

`return err;

`

`@@ -2089,7 +2098,8 @@ config_from_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline,

`

2089

2098

`return err;

`

2090

2099

` }

`

2091

2100

``

2092

``

`-

if (_Py_SetArgcArgv(cmdline->argv.length, cmdline->argv.items) < 0) {

`

``

2101

`+

const _PyWstrList *argv = &cmdline->precmdline.argv;

`

``

2102

`+

if (_Py_SetArgcArgv(argv->length, argv->items) < 0) {

`

2093

2103

`return _Py_INIT_NO_MEMORY();

`

2094

2104

` }

`

2095

2105

`return _Py_INIT_OK();

`

`@@ -2107,10 +2117,9 @@ _PyCoreConfig_ReadFromArgv(_PyCoreConfig *config, const _PyArgv *args,

`

2107

2117

`{

`

2108

2118

`_PyInitError err;

`

2109

2119

``

2110

``

`-

_PyCmdline cmdline;

`

2111

``

`-

memset(&cmdline, 0, sizeof(cmdline));

`

``

2120

`+

_PyCmdline cmdline = {.precmdline = _PyPreCmdline_INIT};

`

2112

2121

``

2113

``

`-

err = _PyArgv_AsWstrList(args, &cmdline.argv);

`

``

2122

`+

err = _PyPreCmdline_Init(&cmdline.precmdline, args);

`

2114

2123

`if (_Py_INIT_FAILED(err)) {

`

2115

2124

` goto done;

`

2116

2125

` }

`