From 0ab5a688f9f08f53fc6efe2a90c09773446f4474 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sat, 20 Jun 2020 21:04:24 +0300 Subject: [PATCH] bpo-41058: Use source file encoding in pdb.find_function(). --- 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 701386e8b96c29..081023526c0ea0 100755 --- a/Lib/pdb.py +++ b/Lib/pdb.py @@ -79,6 +79,7 @@ import pprint import signal import inspect +import tokenize import traceback import linecache @@ -93,7 +94,7 @@ class Restart(Exception): 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 fcb7e4e6072cb6..1e8b12a9af0d83 100644 --- a/Lib/test/test_pdb.py +++ b/Lib/test/test_pdb.py @@ -5,6 +5,7 @@ import pdb import sys import types +import codecs import unittest import subprocess import textwrap @@ -1226,9 +1227,7 @@ def run_pdb_module(self, script, commands): 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 @@ def _assert_find_function(self, file_content, func_name, expected): 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 00000000000000..6ac90098aa52b0 --- /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.