bpo-45822: Respect PEP 263's coding cookies in the parser even if flags are not provided (GH-29582) (GH-29585)

(cherry picked from commit da20d7401d)
This commit is contained in:
Pablo Galindo Salgado 2021-11-17 23:18:16 +00:00 committed by GitHub
parent 87787c8774
commit 0ef308a289
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 25 additions and 1 deletions

View file

@ -926,6 +926,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()

View file

@ -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

View file

@ -329,6 +329,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))
{
@ -5537,6 +5550,7 @@ static PyMethodDef TestMethods[] = {
return_null_without_error, METH_NOARGS},
{"return_result_with_error",
return_result_with_error, METH_NOARGS},
{"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},

View file

@ -1225,7 +1225,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);