]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-45822: Respect PEP 263's coding cookies in the parser even if flags are not provi...
authorPablo Galindo Salgado <Pablogsal@gmail.com>
Tue, 16 Nov 2021 20:30:47 +0000 (20:30 +0000)
committerGitHub <noreply@github.com>
Tue, 16 Nov 2021 20:30:47 +0000 (12:30 -0800)
Lib/test/test_capi.py
Misc/NEWS.d/next/Core and Builtins/2021-11-16-19-41-04.bpo-45822.OT6ueS.rst [new file with mode: 0644]
Modules/_testcapimodule.c
Parser/pegen.c

index d954942286676466701f3c064d4e913e7108fe9c..5e1619bf7dc9da9f4376f101ce6ffc2865fab28c 100644 (file)
@@ -1017,6 +1017,14 @@ class Test_ModuleStateAccess(unittest.TestCase):
                 with self.assertRaises(TypeError):
                     increment_count(1, 2, 3)
 
+    def test_Py_CompileString(self):
+        # Check that Py_CompileString respects the coding cookie
+        _compile = _testcapi.Py_CompileString
+        code = b"# -*- coding: latin1 -*-\nprint('\xc2\xa4')\n"
+        result = _compile(code)
+        expected = compile(code, "<string>", "exec")
+        self.assertEqual(result.co_consts, expected.co_consts)
+
 
 if __name__ == "__main__":
     unittest.main()
diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-11-16-19-41-04.bpo-45822.OT6ueS.rst b/Misc/NEWS.d/next/Core and Builtins/2021-11-16-19-41-04.bpo-45822.OT6ueS.rst
new file mode 100644 (file)
index 0000000..1ac7a8b
--- /dev/null
@@ -0,0 +1,2 @@
+Fixed a bug in the parser that was causing it to not respect :pep:`263`
+coding cookies when no flags are provided. Patch by Pablo Galindo
index 5e4c577962601860e4ba73f352c1d229d1b4e440..c9ba1489731622530ed1f4031a174496f69bfbcd 100644 (file)
@@ -381,6 +381,19 @@ static PyTypeObject _HashInheritanceTester_Type = {
     PyType_GenericNew,                  /* tp_new */
 };
 
+static PyObject*
+pycompilestring(PyObject* self, PyObject *obj) {
+    if (PyBytes_CheckExact(obj) == 0) {
+        PyErr_SetString(PyExc_ValueError, "Argument must be a bytes object");
+        return NULL;
+    }
+    const char *the_string = PyBytes_AsString(obj);
+    if (the_string == NULL) {
+        return NULL;
+    }
+    return Py_CompileString(the_string, "blech", Py_file_input);
+}
+
 static PyObject*
 test_lazy_hash_inheritance(PyObject* self, PyObject *Py_UNUSED(ignored))
 {
@@ -6070,6 +6083,7 @@ static PyMethodDef TestMethods[] = {
     {"return_null_without_error", return_null_without_error, METH_NOARGS},
     {"return_result_with_error", return_result_with_error, METH_NOARGS},
     {"getitem_with_error", getitem_with_error, METH_VARARGS},
+    {"Py_CompileString",     pycompilestring, METH_O},
     {"PyTime_FromSeconds", test_pytime_fromseconds,  METH_VARARGS},
     {"PyTime_FromSecondsObject", test_pytime_fromsecondsobject,  METH_VARARGS},
     {"PyTime_AsSecondsDouble", test_pytime_assecondsdouble, METH_VARARGS},
index 2931a40560867c2e1c190c0461e06b06095914c4..15879a64f279cfdfb35fd832409444af4d704a25 100644 (file)
@@ -1463,7 +1463,7 @@ _PyPegen_run_parser_from_string(const char *str, int start_rule, PyObject *filen
     int exec_input = start_rule == Py_file_input;
 
     struct tok_state *tok;
-    if (flags == NULL || flags->cf_flags & PyCF_IGNORE_COOKIE) {
+    if (flags != NULL && flags->cf_flags & PyCF_IGNORE_COOKIE) {
         tok = _PyTokenizer_FromUTF8(str, exec_input);
     } else {
         tok = _PyTokenizer_FromString(str, exec_input);