From: Pablo Galindo Date: Mon, 11 May 2020 00:41:26 +0000 (+0100) Subject: bpo-40585: Normalize errors messages in codeop when comparing them (GH-20030) X-Git-Tag: v3.9.0b1~120 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=5b956ca42de37c761562e9c9aeb96a0e67606e33;p=thirdparty%2FPython%2Fcpython.git bpo-40585: Normalize errors messages in codeop when comparing them (GH-20030) With the new parser, the error message contains always the trailing newlines, causing the comparison of the repr of the error messages in codeop to fail. This commit makes the new parser mirror the old parser's behaviour regarding trailing newlines. --- diff --git a/Lib/test/test_codeop.py b/Lib/test/test_codeop.py index 1f27830ae50b..0c5e362feea0 100644 --- a/Lib/test/test_codeop.py +++ b/Lib/test/test_codeop.py @@ -288,6 +288,15 @@ class CodeopTests(unittest.TestCase): ai("[i for i in range(10)] = (1, 2, 3)") + def test_invalid_exec(self): + ai = self.assertInvalid + ai("raise = 4", symbol="exec") + ai('def a-b', symbol='exec') + ai('await?', symbol='exec') + ai('=!=', symbol='exec') + ai('a await raise b', symbol='exec') + ai('a await raise b?+1', symbol='exec') + def test_filename(self): self.assertEqual(compile_command("a = 1\n", "abc").co_filename, compile("a = 1\n", "abc", 'single').co_filename) diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-05-11-00-19-42.bpo-40585.yusknY.rst b/Misc/NEWS.d/next/Core and Builtins/2020-05-11-00-19-42.bpo-40585.yusknY.rst new file mode 100644 index 000000000000..7a9258ef0a93 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-05-11-00-19-42.bpo-40585.yusknY.rst @@ -0,0 +1,2 @@ +Fixed a bug when using :func:`codeop.compile_command` that was causing +exceptions to be swallowed with the new parser. Patch by Pablo Galindo diff --git a/Parser/pegen/pegen.c b/Parser/pegen/pegen.c index 06af53b3597f..c80f08668b07 100644 --- a/Parser/pegen/pegen.c +++ b/Parser/pegen/pegen.c @@ -310,6 +310,12 @@ get_error_line(char *buffer, int is_file) newline = strchr(buffer, '\n'); } + if (is_file) { + while (newline > buffer && newline[-1] == '\n') { + --newline; + } + } + if (newline) { return PyUnicode_DecodeUTF8(buffer, newline - buffer, "replace"); }