]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-41058: Use source file encoding in pdb.find_function(). (GH-21010)
authorSerhiy Storchaka <storchaka@gmail.com>
Sun, 21 Jun 2020 08:07:50 +0000 (11:07 +0300)
committerGitHub <noreply@github.com>
Sun, 21 Jun 2020 08:07:50 +0000 (11:07 +0300)
Lib/pdb.py
Lib/test/test_pdb.py
Misc/NEWS.d/next/Library/2020-06-20-21-03-55.bpo-41058.gztdZy.rst [new file with mode: 0644]

index 701386e8b96c29094b33a18387025823440f7bff..081023526c0ea0438bf9e91f498b5b78f0e17ad2 100755 (executable)
@@ -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
index fcb7e4e6072cb68631e6f91f3e0926027f27ad18..1e8b12a9af0d83522778927d392faccdd3504b72 100644 (file)
@@ -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 (file)
index 0000000..6ac9009
--- /dev/null
@@ -0,0 +1 @@
+:func:`pdb.find_function` now correctly determines the source file encoding.