From 5b956ca42de37c761562e9c9aeb96a0e67606e33 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Mon, 11 May 2020 01:41:26 +0100 Subject: [PATCH] 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. --- Lib/test/test_codeop.py | 9 +++++++++ .../2020-05-11-00-19-42.bpo-40585.yusknY.rst | 2 ++ Parser/pegen/pegen.c | 6 ++++++ 3 files changed, 17 insertions(+) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-05-11-00-19-42.bpo-40585.yusknY.rst diff --git a/Lib/test/test_codeop.py b/Lib/test/test_codeop.py index 1f27830ae50..0c5e362feea 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 00000000000..7a9258ef0a9 --- /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 06af53b3597..c80f08668b0 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"); }