]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
GH-101673: Fix pdb bug where local variable changes are lost after longlist (GH-101674)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Sun, 12 Mar 2023 23:40:56 +0000 (16:40 -0700)
committerGitHub <noreply@github.com>
Sun, 12 Mar 2023 23:40:56 +0000 (16:40 -0700)
(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 411ce53115e7dd3c4bcd04fffd0750cd1a3804a8..57d070a87e8105bddd0a5d0d5169f75a6e866d0d 100755 (executable)
@@ -107,15 +107,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()
@@ -1357,7 +1348,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
@@ -1373,7 +1364,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 48f419e62fbbedcc78c0fcd8e5ae6f10814b7fce..d91bd0b2f03a0f633cb0f2ad155d2bd94f5d2eea 100644 (file)
@@ -1474,6 +1474,35 @@ def test_pdb_issue_gh_94215():
     (Pdb) continue
     """
 
+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
+    """
+
 
 @support.requires_subprocess()
 class PdbTestCase(unittest.TestCase):
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.