diff options
author | Andrew Svetlov <andrew.svetlov@gmail.com> | 2012-11-01 12:51:14 (GMT) |
---|---|---|
committer | Andrew Svetlov <andrew.svetlov@gmail.com> | 2012-11-01 12:51:14 (GMT) |
commit | 90c0eb28c5ff1da76b258f9cf6a54abc6df19675 (patch) | |
tree | bae4b773402590e3a2f56342da5704120f82f77d | |
parent | 2e99d63e72018f17dfc3f6cb01666622de90c0be (diff) | |
download | cpython-90c0eb28c5ff1da76b258f9cf6a54abc6df19675.zip cpython-90c0eb28c5ff1da76b258f9cf6a54abc6df19675.tar.gz cpython-90c0eb28c5ff1da76b258f9cf6a54abc6df19675.tar.bz2 |
Issue #16218: Support non ascii characters in python launcher.
Patch by Serhiy Storchaka.
-rw-r--r-- | Lib/test/test_cmd_line_script.py | 9 | ||||
-rw-r--r-- | Python/pythonrun.c | 9 |
2 files changed, 16 insertions, 2 deletions
diff --git a/Lib/test/test_cmd_line_script.py b/Lib/test/test_cmd_line_script.py index 17dfbc2..6e097e3 100644 --- a/Lib/test/test_cmd_line_script.py +++ b/Lib/test/test_cmd_line_script.py @@ -363,6 +363,15 @@ class CmdLineTest(unittest.TestCase): self.assertTrue(text[1].startswith(' File ')) self.assertTrue(text[3].startswith('NameError')) + def test_non_utf8(self): + # Issue #16218 + with temp_dir() as script_dir: + script_name = _make_test_script(script_dir, + '\udcf1\udcea\udcf0\udce8\udcef\udcf2') + self._check_script(script_name, script_name, script_name, + script_dir, None, + importlib.machinery.SourceFileLoader) + def test_main(): support.run_unittest(CmdLineTest) support.reap_children() diff --git a/Python/pythonrun.c b/Python/pythonrun.c index b1ca125..7c4fb4a 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -1358,16 +1358,21 @@ static set_main_loader(PyObject *d, const char *filename, const char *loader_nam { PyInterpreterState *interp; PyThreadState *tstate; - PyObject *loader_type, *loader; + PyObject *filename_obj, *loader_type, *loader; int result = 0; + + filename_obj = PyUnicode_DecodeFSDefault(filename); + if (filename_obj == NULL) + return -1; /* Get current thread state and interpreter pointer */ tstate = PyThreadState_GET(); interp = tstate->interp; loader_type = PyObject_GetAttrString(interp->importlib, loader_name); if (loader_type == NULL) { + Py_DECREF(filename_obj); return -1; } - loader = PyObject_CallFunction(loader_type, "ss", "__main__", filename); + loader = PyObject_CallFunction(loader_type, "sN", "__main__", filename_obj); Py_DECREF(loader_type); if (loader == NULL) { return -1; |