summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xLib/pdb.py3
-rw-r--r--Lib/test/test_pdb.py52
-rw-r--r--Misc/NEWS.d/next/Library/2020-06-20-21-03-55.bpo-41058.gztdZy.rst1
3 files changed, 42 insertions, 14 deletions
diff --git a/Lib/pdb.py b/Lib/pdb.py
index 701386e..0810235 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 fcb7e4e..1e8b12a 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 0000000..6ac9009
--- /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.