]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.10] GH-101673: Fix pdb bug where local variable changes are lost after longlist...
authorIrit Katriel <1055913+iritkatriel@users.noreply.github.com>
Mon, 13 Mar 2023 14:24:01 +0000 (14:24 +0000)
committerGitHub <noreply@github.com>
Mon, 13 Mar 2023 14:24:01 +0000 (14:24 +0000)
GH-101673: Fix pdb bug where local variable changes are lost after longlist (#101674)

(cherry picked from commit 5d677c556f03a34d1c2d86e4cc96025870c20c12)

Co-authored-by: gaogaotiantian <gaogaotiantian@hotmail.com>
Lib/pdb.py
Lib/test/test_pdb.py
Misc/NEWS.d/next/Library/2023-02-09-19-40-41.gh-issue-101673.mX-Ppq.rst [new file with mode: 0644]

index 7401a675253d78c002961d069bc03b76e624ff7e..3bdb2ac36f719212f09c78c66473f1a3aea2ec07 100755 (executable)
@@ -104,15 +104,6 @@ def find_function(funcname, filename):
                 return funcname, filename, lineno
     return None
 
-def getsourcelines(obj):
-    lines, lineno = inspect.findsource(obj)
-    if inspect.isframe(obj) and obj.f_globals is obj.f_locals:
-        # must be a module frame: do not try to cut a block out of it
-        return lines, 1
-    elif inspect.ismodule(obj):
-        return lines, 1
-    return inspect.getblock(lines[lineno:]), lineno+1
-
 def lasti2lineno(code, lasti):
     linestarts = list(dis.findlinestarts(code))
     linestarts.reverse()
@@ -1273,7 +1264,7 @@ class Pdb(bdb.Bdb, cmd.Cmd):
         filename = self.curframe.f_code.co_filename
         breaklist = self.get_file_breaks(filename)
         try:
-            lines, lineno = getsourcelines(self.curframe)
+            lines, lineno = inspect.getsourcelines(self.curframe)
         except OSError as err:
             self.error(err)
             return
@@ -1289,7 +1280,7 @@ class Pdb(bdb.Bdb, cmd.Cmd):
         except:
             return
         try:
-            lines, lineno = getsourcelines(obj)
+            lines, lineno = inspect.getsourcelines(obj)
         except (OSError, TypeError) as err:
             self.error(err)
             return
index 7f0bc719f0afa741df1fc0af28230722eaba92b0..889262b1f1939a4c918beb0b466ae251526eedf9 100644 (file)
@@ -1351,6 +1351,35 @@ def test_pdb_issue_43318():
     4
     """
 
+def test_pdb_issue_gh_101673():
+    """See GH-101673
+
+    Make sure ll won't revert local variable assignment
+
+    >>> def test_function():
+    ...    a = 1
+    ...    import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
+
+    >>> with PdbTestInput([  # doctest: +NORMALIZE_WHITESPACE
+    ...     '!a = 2',
+    ...     'll',
+    ...     'p a',
+    ...     'continue'
+    ... ]):
+    ...     test_function()
+    --Return--
+    > <doctest test.test_pdb.test_pdb_issue_gh_101673[0]>(3)test_function()->None
+    -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
+    (Pdb) !a = 2
+    (Pdb) ll
+      1         def test_function():
+      2            a = 1
+      3  ->        import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
+    (Pdb) p a
+    2
+    (Pdb) continue
+    """
+
 
 class PdbTestCase(unittest.TestCase):
     def tearDown(self):
diff --git a/Misc/NEWS.d/next/Library/2023-02-09-19-40-41.gh-issue-101673.mX-Ppq.rst b/Misc/NEWS.d/next/Library/2023-02-09-19-40-41.gh-issue-101673.mX-Ppq.rst
new file mode 100644 (file)
index 0000000..4e673ba
--- /dev/null
@@ -0,0 +1 @@
+Fix a :mod:`pdb` bug where ``ll`` clears the changes to local variables.