diff options
Diffstat (limited to 'Modules/main.c')
-rw-r--r-- | Modules/main.c | 69 |
1 files changed, 39 insertions, 30 deletions
diff --git a/Modules/main.c b/Modules/main.c index 5d1d896..a16ce65 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -6,6 +6,7 @@ #include <locale.h> #ifdef __VMS +#error "PEP 11: VMS is now unsupported, code will be removed in Python 3.4" #include <unixlib.h> #endif @@ -72,9 +73,6 @@ static char *usage_2 = "\ -O : optimize generated bytecode slightly; also PYTHONOPTIMIZE=x\n\ -OO : remove doc-strings in addition to the -O optimizations\n\ -q : don't print version and copyright messages on interactive startup\n\ --R : use a pseudo-random salt to make hash() values of various types be\n\ - unpredictable between separate invocations of the interpreter, as\n\ - a defence against denial-of-service attacks\n\ -s : don't add user site directory to sys.path; also PYTHONNOUSERSITE\n\ -S : don't imply 'import site' on initialization\n\ "; @@ -102,13 +100,14 @@ static char *usage_5 = "PYTHONHOME : alternate <prefix> directory (or <prefix>%c<exec_prefix>).\n" " The default module search path uses %s.\n" "PYTHONCASEOK : ignore case in 'import' statements (Windows).\n" -"PYTHONIOENCODING: Encoding[:errors] used for stdin/stdout/stderr.\n\ +"PYTHONIOENCODING: Encoding[:errors] used for stdin/stdout/stderr.\n" +"PYTHONFAULTHANDLER: dump the Python traceback on fatal errors.\n\ "; static char *usage_6 = "\ -PYTHONHASHSEED: if this variable is set to 'random', the effect is the same\n\ - as specifying the -R option: a random value is used to seed the hashes of\n\ - str, bytes and datetime objects. It can also be set to an integer\n\ - in the range [0,4294967295] to get hash values with a predictable seed.\n\ +PYTHONHASHSEED: if this variable is set to 'random', a random value is used\n\ + to seed the hashes of str, bytes and datetime objects. It can also be\n\ + set to an integer in the range [0,4294967295] to get hash values with a\n\ + predictable seed.\n\ "; static int @@ -225,7 +224,7 @@ RunMainFromImporter(wchar_t *filename) if (importer == NULL) goto error; - if (importer->ob_type == &PyNullImporter_Type) { + if (importer == Py_None) { Py_DECREF(argv0); Py_DECREF(importer); return -1; @@ -345,21 +344,13 @@ Py_Main(int argc, wchar_t **argv) not interpreter options. */ break; } - switch (c) { - case 'E': + if (c == 'E') { Py_IgnoreEnvironmentFlag++; break; - case 'R': - Py_HashRandomizationFlag++; - break; } } - /* The variable is only tested for existence here; _PyRandom_Init will - check its value further. */ - if (!Py_HashRandomizationFlag && - (p = Py_GETENV("PYTHONHASHSEED")) && *p != '\0') - Py_HashRandomizationFlag = 1; + Py_HashRandomizationFlag = 1; _PyRandom_Init(); PySys_ResetWarnOptions(); @@ -466,7 +457,7 @@ Py_Main(int argc, wchar_t **argv) break; case 'R': - /* Already handled above */ + /* Ignored */ break; /* This space reserved for other options */ @@ -533,16 +524,13 @@ Py_Main(int argc, wchar_t **argv) /* Use utf-8 on Mac OS X */ unicode = PyUnicode_FromString(p); #else - wchar_t *wchar; - size_t len; - wchar = _Py_char2wchar(p, &len); - if (wchar == NULL) - continue; - unicode = PyUnicode_FromWideChar(wchar, len); - PyMem_Free(wchar); + unicode = PyUnicode_DecodeLocale(p, "surrogateescape"); #endif - if (unicode == NULL) + if (unicode == NULL) { + /* ignore errors */ + PyErr_Clear(); continue; + } PySys_AddWarnOptionUnicode(unicode); Py_DECREF(unicode); } @@ -617,7 +605,6 @@ Py_Main(int argc, wchar_t **argv) if ((p = Py_GETENV("PYTHONEXECUTABLE")) && *p != '\0') { wchar_t* buffer; size_t len = strlen(p) + 1; - size_t r; buffer = malloc(len * sizeof(wchar_t)); if (buffer == NULL) { @@ -625,11 +612,33 @@ Py_Main(int argc, wchar_t **argv) "not enough memory to copy PYTHONEXECUTABLE"); } - r = mbstowcs(buffer, p, len); + mbstowcs(buffer, p, len); Py_SetProgramName(buffer); /* buffer is now handed off - do not free */ } else { +#ifdef WITH_NEXT_FRAMEWORK + char* pyvenv_launcher = getenv("__PYVENV_LAUNCHER__"); + + if (pyvenv_launcher && *pyvenv_launcher) { + /* Used by Mac/Tools/pythonw.c to forward + * the argv0 of the stub executable + */ + wchar_t* wbuf = _Py_char2wchar(pyvenv_launcher, NULL); + + if (wbuf == NULL) { + Py_FatalError("Cannot decode __PYVENV_LAUNCHER__"); + } + Py_SetProgramName(wbuf); + + /* Don't free wbuf, the argument to Py_SetProgramName + * must remain valid until the Py_Finalize is called. + */ + } else { + Py_SetProgramName(argv[0]); + } +#else Py_SetProgramName(argv[0]); +#endif } #else Py_SetProgramName(argv[0]); |