From ccee39eca1bfe3c0e4230915d0b5314f14d5b534 Mon Sep 17 00:00:00 2001 From: Lysandros Nikolaou Date: Tue, 15 Aug 2023 12:56:33 +0300 Subject: [PATCH 1/2] gh-107967: Fix infinite recursion on invalid escape sequence warning --- Lib/test/test_fstring.py | 10 ++++++++++ Parser/tokenizer.c | 3 +++ 2 files changed, 13 insertions(+) diff --git a/Lib/test/test_fstring.py b/Lib/test/test_fstring.py index cb14bba2602def..804eeea854610f 100644 --- a/Lib/test/test_fstring.py +++ b/Lib/test/test_fstring.py @@ -1673,5 +1673,15 @@ def test_debug_in_file(self): self.assertEqual(stdout.decode('utf-8').strip().replace('\r\n', '\n').replace('\r', '\n'), "3\n=3") + def test_syntax_warning_infinite_recursion_in_file(self): + with temp_cwd(): + script = 'script.py' + with open(script, 'w') as f: + f.write(r"print(f'\{1}')") + + _, stdout, stderr = assert_python_ok(script) + self.assertIn(rb'\1', stdout) + self.assertEqual(len(stderr.decode('utf-8').strip().splitlines()), 2) + if __name__ == '__main__': unittest.main() diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c index 5a42f6f357317f..b10c9f1f8ea2cc 100644 --- a/Parser/tokenizer.c +++ b/Parser/tokenizer.c @@ -1539,6 +1539,9 @@ parser_warn(struct tok_state *tok, PyObject *category, const char *format, ...) static int warn_invalid_escape_sequence(struct tok_state *tok, int first_invalid_escape_char) { + if (!tok->report_warnings) { + return 0; + } PyObject *msg = PyUnicode_FromFormat( "invalid escape sequence '\\%c'", From e6ef5bab242ef1ca30488d1cf3700e2e9bc7245a Mon Sep 17 00:00:00 2001 From: Lysandros Nikolaou Date: Tue, 15 Aug 2023 13:22:39 +0300 Subject: [PATCH 2/2] Fix decode error in windows --- Lib/test/test_fstring.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/test/test_fstring.py b/Lib/test/test_fstring.py index 804eeea854610f..16f01973f99f3e 100644 --- a/Lib/test/test_fstring.py +++ b/Lib/test/test_fstring.py @@ -1681,7 +1681,7 @@ def test_syntax_warning_infinite_recursion_in_file(self): _, stdout, stderr = assert_python_ok(script) self.assertIn(rb'\1', stdout) - self.assertEqual(len(stderr.decode('utf-8').strip().splitlines()), 2) + self.assertEqual(len(stderr.strip().splitlines()), 2) if __name__ == '__main__': unittest.main()