diff options
author | Tian Gao <gaogaotiantian@hotmail.com> | 2023-06-15 23:34:42 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-06-15 23:34:42 (GMT) |
commit | 25a64fd28aaaaf2d21fae23212a0554c24fc7b20 (patch) | |
tree | 894d7e7c7a7677cde1a6128e390a7436aba0415e /Lib | |
parent | a4056c8f9c2d9970d39e3cb6bffb255cd4b8a42c (diff) | |
download | cpython-25a64fd28aaaaf2d21fae23212a0554c24fc7b20.zip cpython-25a64fd28aaaaf2d21fae23212a0554c24fc7b20.tar.gz cpython-25a64fd28aaaaf2d21fae23212a0554c24fc7b20.tar.bz2 |
GH-103124: Multiline statement support for pdb (GH-103125)
Diffstat (limited to 'Lib')
-rwxr-xr-x | Lib/pdb.py | 26 | ||||
-rw-r--r-- | Lib/test/test_pdb.py | 33 |
2 files changed, 55 insertions, 4 deletions
@@ -76,6 +76,7 @@ import bdb import dis import code import glob +import codeop import pprint import signal import inspect @@ -444,7 +445,30 @@ class Pdb(bdb.Bdb, cmd.Cmd): locals = self.curframe_locals globals = self.curframe.f_globals try: - code = compile(line + '\n', '<stdin>', 'single') + if (code := codeop.compile_command(line + '\n', '<stdin>', 'single')) is None: + # Multi-line mode + buffer = line + continue_prompt = "... " + while (code := codeop.compile_command(buffer, '<stdin>', 'single')) is None: + if self.use_rawinput: + try: + line = input(continue_prompt) + except (EOFError, KeyboardInterrupt): + self.lastcmd = "" + print('\n') + return + else: + self.stdout.write(continue_prompt) + self.stdout.flush() + line = self.stdin.readline() + if not len(line): + self.lastcmd = "" + self.stdout.write('\n') + self.stdout.flush() + return + else: + line = line.rstrip('\r\n') + buffer += '\n' + line save_stdout = sys.stdout save_stdin = sys.stdin save_displayhook = sys.displayhook diff --git a/Lib/test/test_pdb.py b/Lib/test/test_pdb.py index 277400e..a669535 100644 --- a/Lib/test/test_pdb.py +++ b/Lib/test/test_pdb.py @@ -389,7 +389,7 @@ def test_pdb_breakpoints_preserved_across_interactive_sessions(): 1 breakpoint keep yes at ...test_pdb.py:... 2 breakpoint keep yes at ...test_pdb.py:... (Pdb) break pdb.find_function - Breakpoint 3 at ...pdb.py:97 + Breakpoint 3 at ...pdb.py:... (Pdb) break Num Type Disp Enb Where 1 breakpoint keep yes at ...test_pdb.py:... @@ -1589,6 +1589,32 @@ def test_pdb_next_command_subiterator(): (Pdb) continue """ +def test_pdb_multiline_statement(): + """Test for multiline statement + + >>> def test_function(): + ... import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() + ... pass + + >>> with PdbTestInput([ # doctest: +NORMALIZE_WHITESPACE + ... 'def f(x):', + ... ' return x * 2', + ... '', + ... 'f(2)', + ... 'c' + ... ]): + ... test_function() + > <doctest test.test_pdb.test_pdb_multiline_statement[0]>(3)test_function() + -> pass + (Pdb) def f(x): + ... return x * 2 + ... + (Pdb) f(2) + 4 + (Pdb) c + """ + + def test_pdb_issue_20766(): """Test for reference leaks when the SIGINT handler is set. @@ -2362,7 +2388,7 @@ def bœr(): def test_errors_in_command(self): commands = "\n".join([ - 'print(', + 'print(]', 'debug print(', 'debug doesnotexist', 'c', @@ -2371,7 +2397,8 @@ def bœr(): self.assertEqual(stdout.splitlines()[1:], [ '-> pass', - '(Pdb) *** SyntaxError: \'(\' was never closed', + "(Pdb) *** SyntaxError: closing parenthesis ']' does not match opening " + "parenthesis '('", '(Pdb) ENTERING RECURSIVE DEBUGGER', '*** SyntaxError: \'(\' was never closed', |