From 19fcffa92773e008e4f5efb80047420a0cfafeec Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sun, 21 Jun 2020 11:07:50 +0300 Subject: [PATCH] bpo-41058: Use source file encoding in pdb.find_function(). (GH-21010) --- Lib/pdb.py | 3 +- Lib/test/test_pdb.py | 52 ++++++++++++++----- .../2020-06-20-21-03-55.bpo-41058.gztdZy.rst | 1 + 3 files changed, 42 insertions(+), 14 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-06-20-21-03-55.bpo-41058.gztdZy.rst diff --git a/Lib/pdb.py b/Lib/pdb.py index 701386e8b96..081023526c0 100755 --- a/Lib/pdb.py +++ b/Lib/pdb.py @@ -79,6 +79,7 @@ import glob import pprint import signal import inspect +import tokenize import traceback import linecache @@ -93,7 +94,7 @@ __all__ = ["run", "pm", "Pdb", "runeval", "runctx", "runcall", "set_trace", def find_function(funcname, filename): cre = re.compile(r'def\s+%s\s*[(]' % re.escape(funcname)) try: - fp = open(filename) + fp = tokenize.open(filename) except OSError: return None # consumer of this info expects the first line to be 1 diff --git a/Lib/test/test_pdb.py b/Lib/test/test_pdb.py index fcb7e4e6072..1e8b12a9af0 100644 --- a/Lib/test/test_pdb.py +++ b/Lib/test/test_pdb.py @@ -5,6 +5,7 @@ import os import pdb import sys import types +import codecs import unittest import subprocess import textwrap @@ -1226,9 +1227,7 @@ class PdbTestCase(unittest.TestCase): return self._run_pdb(['-m', self.module_name], commands) def _assert_find_function(self, file_content, func_name, expected): - file_content = textwrap.dedent(file_content) - - with open(support.TESTFN, 'w') as f: + with open(support.TESTFN, 'wb') as f: f.write(file_content) expected = None if not expected else ( @@ -1237,22 +1236,49 @@ class PdbTestCase(unittest.TestCase): expected, pdb.find_function(func_name, support.TESTFN)) def test_find_function_empty_file(self): - self._assert_find_function('', 'foo', None) + self._assert_find_function(b'', 'foo', None) def test_find_function_found(self): self._assert_find_function( """\ - def foo(): - pass +def foo(): + pass - def bar(): - pass +def bœr(): + pass - def quux(): - pass - """, - 'bar', - ('bar', 4), +def quux(): + pass +""".encode(), + 'bœr', + ('bœr', 4), + ) + + def test_find_function_found_with_encoding_cookie(self): + self._assert_find_function( + """\ +# coding: iso-8859-15 +def foo(): + pass + +def bœr(): + pass + +def quux(): + pass +""".encode('iso-8859-15'), + 'bœr', + ('bœr', 5), + ) + + def test_find_function_found_with_bom(self): + self._assert_find_function( + codecs.BOM_UTF8 + """\ +def bœr(): + pass +""".encode(), + 'bœr', + ('bœr', 1), ) def test_issue7964(self): diff --git a/Misc/NEWS.d/next/Library/2020-06-20-21-03-55.bpo-41058.gztdZy.rst b/Misc/NEWS.d/next/Library/2020-06-20-21-03-55.bpo-41058.gztdZy.rst new file mode 100644 index 00000000000..6ac90098aa5 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-06-20-21-03-55.bpo-41058.gztdZy.rst @@ -0,0 +1 @@ +:func:`pdb.find_function` now correctly determines the source file encoding.