diff options
author | Victor Stinner <vstinner@python.org> | 2021-05-20 10:08:05 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-05-20 10:08:05 (GMT) |
commit | 58a993957abec7e47acb20376d2753051fa75452 (patch) | |
tree | 51f07a305a5706e6f4be489a5c041c5f0bc966a1 /Python/frozenmain.c | |
parent | 4d396e7d79bd1152f991147718dc5f094a3cc957 (diff) | |
download | cpython-58a993957abec7e47acb20376d2753051fa75452.zip cpython-58a993957abec7e47acb20376d2753051fa75452.tar.gz cpython-58a993957abec7e47acb20376d2753051fa75452.tar.bz2 |
bpo-44131: Py_FrozenMain() uses PyConfig_SetBytesArgv() (GH-26201)
Moreover, Py_FrozenMain() relies on Py_InitializeFromConfig() to
handle the PYTHONUNBUFFERED environment variable and configure C
stdio streams like stdout (make the stream unbuffered).
Diffstat (limited to 'Python/frozenmain.c')
-rw-r--r-- | Python/frozenmain.c | 84 |
1 files changed, 14 insertions, 70 deletions
diff --git a/Python/frozenmain.c b/Python/frozenmain.c index c3104da..8743e08 100644 --- a/Python/frozenmain.c +++ b/Python/frozenmain.c @@ -20,74 +20,28 @@ Py_FrozenMain(int argc, char **argv) Py_ExitStatusException(status); } - const char *p; - int i, n, sts = 1; - int inspect = 0; - int unbuffered = 0; - char *oldloc = NULL; - wchar_t **argv_copy = NULL; - /* We need a second copies, as Python might modify the first one. */ - wchar_t **argv_copy2 = NULL; - - if (argc > 0) { - argv_copy = PyMem_RawMalloc(sizeof(wchar_t*) * argc); - argv_copy2 = PyMem_RawMalloc(sizeof(wchar_t*) * argc); - if (!argv_copy || !argv_copy2) { - fprintf(stderr, "out of memory\n"); - goto error; - } - } - PyConfig config; PyConfig_InitPythonConfig(&config); - config.pathconfig_warnings = 0; /* Suppress errors from getpath.c */ - - if ((p = Py_GETENV("PYTHONINSPECT")) && *p != '\0') { - inspect = 1; - } - if ((p = Py_GETENV("PYTHONUNBUFFERED")) && *p != '\0') { - unbuffered = 1; - } - - if (unbuffered) { - setbuf(stdin, (char *)NULL); - setbuf(stdout, (char *)NULL); - setbuf(stderr, (char *)NULL); - } + // Suppress errors from getpath.c + config.pathconfig_warnings = 0; + // Don't parse command line options like -E + config.parse_argv = 0; - oldloc = _PyMem_RawStrdup(setlocale(LC_ALL, NULL)); - if (!oldloc) { - fprintf(stderr, "out of memory\n"); - goto error; + status = PyConfig_SetBytesArgv(&config, argc, argv); + if (PyStatus_Exception(status)) { + PyConfig_Clear(&config); + Py_ExitStatusException(status); } - setlocale(LC_ALL, ""); - for (i = 0; i < argc; i++) { - argv_copy[i] = Py_DecodeLocale(argv[i], NULL); - argv_copy2[i] = argv_copy[i]; - if (!argv_copy[i]) { - fprintf(stderr, - "Unable to decode the command line argument #%i\n", - i + 1); - argc = i; - goto error; - } + const char *p; + int inspect = 0; + if ((p = Py_GETENV("PYTHONINSPECT")) && *p != '\0') { + inspect = 1; } - setlocale(LC_ALL, oldloc); - PyMem_RawFree(oldloc); - oldloc = NULL; #ifdef MS_WINDOWS PyInitFrozenExtensions(); #endif /* MS_WINDOWS */ - if (argc >= 1) { - status = PyConfig_SetString(&config, &config.program_name, - argv_copy[0]); - if (PyStatus_Exception(status)) { - PyConfig_Clear(&config); - Py_ExitStatusException(status); - } - } status = Py_InitializeFromConfig(&config); PyConfig_Clear(&config); @@ -104,9 +58,8 @@ Py_FrozenMain(int argc, char **argv) Py_GetVersion(), Py_GetCopyright()); } - PySys_SetArgv(argc, argv_copy); - - n = PyImport_ImportFrozenModule("__main__"); + int sts = 1; + int n = PyImport_ImportFrozenModule("__main__"); if (n == 0) { Py_FatalError("the __main__ module is not frozen"); } @@ -128,14 +81,5 @@ Py_FrozenMain(int argc, char **argv) if (Py_FinalizeEx() < 0) { sts = 120; } - -error: - PyMem_RawFree(argv_copy); - if (argv_copy2) { - for (i = 0; i < argc; i++) - PyMem_RawFree(argv_copy2[i]); - PyMem_RawFree(argv_copy2); - } - PyMem_RawFree(oldloc); return sts; } |