]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-35931: Gracefully handle SyntaxError in pdb debug command (GH-11782)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Fri, 15 Feb 2019 21:19:44 +0000 (13:19 -0800)
committerGitHub <noreply@github.com>
Fri, 15 Feb 2019 21:19:44 +0000 (13:19 -0800)
Previously, `debug print(` would cause the interpreter to exit on a SyntaxError whereas `print(` would properly display the error and return to the pdb prompt.

This patch fixes this by pre-compiling the code before passing it to `Pdb.run`.

https://bugs.python.org/issue35931
(cherry picked from commit 4327705cfab3eb09073ec828570bbd8f789e1611)

Co-authored-by: Daniel Hahler <github@thequod.de>
Lib/pdb.py
Lib/test/test_pdb.py
Misc/NEWS.d/next/Library/2019-02-07-16-22-50.bpo-35931._63i7B.rst [new file with mode: 0644]

index 60bdb7675c8131660b2064150fa739911382c1d2..1443f9f85c7e1231a1e0b02a47313c06580c8118 100755 (executable)
@@ -1093,10 +1093,16 @@ class Pdb(bdb.Bdb, cmd.Cmd):
         sys.settrace(None)
         globals = self.curframe.f_globals
         locals = self.curframe_locals
+        try:
+            code = compile(arg, "<string>", "exec")
+        except SyntaxError:
+            exc_info = sys.exc_info()[:2]
+            self.error(traceback.format_exception_only(*exc_info)[-1].strip())
+            return
         p = Pdb(self.completekey, self.stdin, self.stdout)
         p.prompt = "(%s) " % self.prompt.strip()
         self.message("ENTERING RECURSIVE DEBUGGER")
-        sys.call_tracing(p.run, (arg, globals, locals))
+        sys.call_tracing(p.run, (code, globals, locals))
         self.message("LEAVING RECURSIVE DEBUGGER")
         sys.settrace(self.trace_dispatch)
         self.lastcmd = p.lastcmd
index 9aa38e08dd6e6c204a9585d25adf0ed6d3a15823..5b03b47ef468c674611b31e866c0434855308416 100644 (file)
@@ -1482,6 +1482,14 @@ class PdbTestCase(unittest.TestCase):
         stdout, _ = self._run_pdb(['-m', self.module_name + '.runme'], commands)
         self.assertTrue(any("VAR from module" in l for l in stdout.splitlines()), stdout)
 
+    def test_syntaxerror_in_command(self):
+        commands = "print(\ndebug print("
+        stdout, _ = self.run_pdb_script("", commands)
+        self.assertEqual(stdout.splitlines()[1:], [
+            '(Pdb) *** SyntaxError: unexpected EOF while parsing',
+            '(Pdb) *** SyntaxError: unexpected EOF while parsing',
+            '(Pdb) ',
+        ])
 
 def load_tests(*args):
     from test import test_pdb
diff --git a/Misc/NEWS.d/next/Library/2019-02-07-16-22-50.bpo-35931._63i7B.rst b/Misc/NEWS.d/next/Library/2019-02-07-16-22-50.bpo-35931._63i7B.rst
new file mode 100644 (file)
index 0000000..a229968
--- /dev/null
@@ -0,0 +1 @@
+The :mod:`pdb` ``debug`` command now gracefully handles syntax errors.