]> granicus.if.org Git - python/commitdiff
Issue #16218: Support non ascii characters in python launcher.
authorAndrew Svetlov <andrew.svetlov@gmail.com>
Thu, 1 Nov 2012 12:51:14 +0000 (14:51 +0200)
committerAndrew Svetlov <andrew.svetlov@gmail.com>
Thu, 1 Nov 2012 12:51:14 +0000 (14:51 +0200)
Patch by Serhiy Storchaka.

Lib/test/test_cmd_line_script.py
Python/pythonrun.c

index 17dfbc2322bdc28460b46b6d24af56273c59f9eb..6e097e37a4f8b4d516e6e49fca26af675aa6c83c 100644 (file)
@@ -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()
index b1ca125781cc818afc2530f2d996b79d84848d21..7c4fb4a3c9a64a68c32f71e6f3e46051520810cd 100644 (file)
@@ -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;