summaryrefslogtreecommitdiffstats
path: root/Python/frozenmain.c
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@python.org>2021-05-20 10:08:05 (GMT)
committerGitHub <noreply@github.com>2021-05-20 10:08:05 (GMT)
commit58a993957abec7e47acb20376d2753051fa75452 (patch)
tree51f07a305a5706e6f4be489a5c041c5f0bc966a1 /Python/frozenmain.c
parent4d396e7d79bd1152f991147718dc5f094a3cc957 (diff)
downloadcpython-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.c84
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;
}