From 31acfd78a0810f84898d36a8289e407d3754b823 Mon Sep 17 00:00:00 2001 From: Tian Gao Date: Tue, 25 Apr 2023 22:04:51 -0700 Subject: gh-103578: Fix pdb reading code with non-utf8 encoding (#103581) `pdb` should use `io.open_code` to open code to avoid encoding issue. --- Lib/pdb.py | 2 +- Lib/test/test_pdb.py | 6 ++++++ .../next/Library/2023-04-16-18-29-04.gh-issue-103578.fly1wc.rst | 1 + 3 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2023-04-16-18-29-04.gh-issue-103578.fly1wc.rst diff --git a/Lib/pdb.py b/Lib/pdb.py index a3553b3..645cbf5 100755 --- a/Lib/pdb.py +++ b/Lib/pdb.py @@ -154,7 +154,7 @@ class _ScriptTarget(str): @property def code(self): - with io.open(self) as fp: + with io.open_code(self) as fp: return f"exec(compile({fp.read()!r}, {self!r}, 'exec'))" diff --git a/Lib/test/test_pdb.py b/Lib/test/test_pdb.py index b5c413a..2f712a1 100644 --- a/Lib/test/test_pdb.py +++ b/Lib/test/test_pdb.py @@ -2396,6 +2396,12 @@ def bœr(): # verify that pdb found the source of the "frozen" function self.assertIn('x = "Sentinel string for gh-93696"', stdout, "Sentinel statement not found") + def test_non_utf8_encoding(self): + script_dir = os.path.join(os.path.dirname(__file__), 'encoded_modules') + for filename in os.listdir(script_dir): + if filename.endswith(".py"): + self._run_pdb([os.path.join(script_dir, filename)], 'q') + class ChecklineTests(unittest.TestCase): def setUp(self): linecache.clearcache() # Pdb.checkline() uses linecache.getline() diff --git a/Misc/NEWS.d/next/Library/2023-04-16-18-29-04.gh-issue-103578.fly1wc.rst b/Misc/NEWS.d/next/Library/2023-04-16-18-29-04.gh-issue-103578.fly1wc.rst new file mode 100644 index 0000000..69986c2 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-04-16-18-29-04.gh-issue-103578.fly1wc.rst @@ -0,0 +1 @@ +Fixed a bug where :mod:`pdb` crashes when reading source file with different encoding by replacing :func:`io.open` with :func:`io.open_code`. The new method would also call into the hook set by :func:`PyFile_SetOpenCodeHook`. -- cgit v0.12