From 0db55c945cc655d0a57e2f7a52ebf0bcbbfdb503 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) (cherry picked from commit 19fcffa92773e008e4f5efb80047420a0cfafeec) Co-authored-by: Serhiy Storchaka --- 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 806bc6741f2b23..90a26535e01acf 100755 --- a/Lib/pdb.py +++ b/Lib/pdb.py @@ -78,6 +78,7 @@ import pprint import signal import inspect +import tokenize import traceback import linecache @@ -92,7 +93,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 63909e21f246d4..8f861db81608dd 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 @@ -1199,9 +1200,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 ( @@ -1210,22 +1209,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.