diff options
author | gaogaotiantian <gaogaotiantian@hotmail.com> | 2023-03-12 23:09:55 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-03-12 23:09:55 (GMT) |
commit | 5d677c556f03a34d1c2d86e4cc96025870c20c12 (patch) | |
tree | 2caacebfd3a0b0e7fe4b598b35eaf6c690b12369 | |
parent | f6ca71a42268dcd890bd1930501b6c7e6d7ce66e (diff) | |
download | cpython-5d677c556f03a34d1c2d86e4cc96025870c20c12.zip cpython-5d677c556f03a34d1c2d86e4cc96025870c20c12.tar.gz cpython-5d677c556f03a34d1c2d86e4cc96025870c20c12.tar.bz2 |
GH-101673: Fix pdb bug where local variable changes are lost after longlist (#101674)
-rwxr-xr-x | Lib/pdb.py | 13 | ||||
-rw-r--r-- | Lib/test/test_pdb.py | 29 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Library/2023-02-09-19-40-41.gh-issue-101673.mX-Ppq.rst | 1 |
3 files changed, 32 insertions, 11 deletions
@@ -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 diff --git a/Lib/test/test_pdb.py b/Lib/test/test_pdb.py index 48f419e..d91bd0b 100644 --- a/Lib/test/test_pdb.py +++ b/Lib/test/test_pdb.py @@ -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 index 0000000..4e673ba --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-02-09-19-40-41.gh-issue-101673.mX-Ppq.rst @@ -0,0 +1 @@ +Fix a :mod:`pdb` bug where ``ll`` clears the changes to local variables. |