#1472251: remove addition of "\n" to code given to pdb.run[eval](), the bug in exec() that made this necessary has been fixed. Also document that you can give code objects to run() and runeval(), and add some tests to test_pdb.
This commit is contained in:
parent
44f8bf9411
commit
46b9afc862
|
@ -85,21 +85,21 @@ slightly different way:
|
||||||
|
|
||||||
.. function:: run(statement, globals=None, locals=None)
|
.. function:: run(statement, globals=None, locals=None)
|
||||||
|
|
||||||
Execute the *statement* (given as a string) under debugger control. The
|
Execute the *statement* (given as a string or a code object) under debugger
|
||||||
debugger prompt appears before any code is executed; you can set breakpoints
|
control. The debugger prompt appears before any code is executed; you can
|
||||||
and type :pdbcmd:`continue`, or you can step through the statement using
|
set breakpoints and type :pdbcmd:`continue`, or you can step through the
|
||||||
:pdbcmd:`step` or :pdbcmd:`next` (all these commands are explained below).
|
statement using :pdbcmd:`step` or :pdbcmd:`next` (all these commands are
|
||||||
The optional *globals* and *locals* arguments specify the environment in
|
explained below). The optional *globals* and *locals* arguments specify the
|
||||||
which the code is executed; by default the dictionary of the module
|
environment in which the code is executed; by default the dictionary of the
|
||||||
:mod:`__main__` is used. (See the explanation of the built-in :func:`exec`
|
module :mod:`__main__` is used. (See the explanation of the built-in
|
||||||
or :func:`eval` functions.)
|
:func:`exec` or :func:`eval` functions.)
|
||||||
|
|
||||||
|
|
||||||
.. function:: runeval(expression, globals=None, locals=None)
|
.. function:: runeval(expression, globals=None, locals=None)
|
||||||
|
|
||||||
Evaluate the *expression* (given as a string) under debugger control. When
|
Evaluate the *expression* (given as a string or a code object) under debugger
|
||||||
:func:`runeval` returns, it returns the value of the expression. Otherwise
|
control. When :func:`runeval` returns, it returns the value of the
|
||||||
this function is similar to :func:`run`.
|
expression. Otherwise this function is similar to :func:`run`.
|
||||||
|
|
||||||
|
|
||||||
.. function:: runcall(function, *args, **kwds)
|
.. function:: runcall(function, *args, **kwds)
|
||||||
|
|
|
@ -364,8 +364,9 @@ class Bdb:
|
||||||
if line: s = s + lprefix + line.strip()
|
if line: s = s + lprefix + line.strip()
|
||||||
return s
|
return s
|
||||||
|
|
||||||
# The following two methods can be called by clients to use
|
# The following methods can be called by clients to use
|
||||||
# a debugger to debug a statement, given as a string.
|
# a debugger to debug a statement or an expression.
|
||||||
|
# Both can be given as a string, or a code object.
|
||||||
|
|
||||||
def run(self, cmd, globals=None, locals=None):
|
def run(self, cmd, globals=None, locals=None):
|
||||||
if globals is None:
|
if globals is None:
|
||||||
|
@ -375,8 +376,6 @@ class Bdb:
|
||||||
locals = globals
|
locals = globals
|
||||||
self.reset()
|
self.reset()
|
||||||
sys.settrace(self.trace_dispatch)
|
sys.settrace(self.trace_dispatch)
|
||||||
if not isinstance(cmd, types.CodeType):
|
|
||||||
cmd = cmd+'\n'
|
|
||||||
try:
|
try:
|
||||||
exec(cmd, globals, locals)
|
exec(cmd, globals, locals)
|
||||||
except BdbQuit:
|
except BdbQuit:
|
||||||
|
@ -393,8 +392,6 @@ class Bdb:
|
||||||
locals = globals
|
locals = globals
|
||||||
self.reset()
|
self.reset()
|
||||||
sys.settrace(self.trace_dispatch)
|
sys.settrace(self.trace_dispatch)
|
||||||
if not isinstance(expr, types.CodeType):
|
|
||||||
expr = expr+'\n'
|
|
||||||
try:
|
try:
|
||||||
return eval(expr, globals, locals)
|
return eval(expr, globals, locals)
|
||||||
except BdbQuit:
|
except BdbQuit:
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
# A test suite for pdb; at the moment, this only validates skipping of
|
# A test suite for pdb; not very comprehensive at the moment.
|
||||||
# specified test modules (RFE #5142).
|
|
||||||
|
|
||||||
import imp
|
import imp
|
||||||
import sys
|
import sys
|
||||||
|
@ -123,6 +122,50 @@ def test_pdb_skip_modules_with_callback():
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
def pdb_invoke(method, arg):
|
||||||
|
"""Run pdb.method(arg)."""
|
||||||
|
import pdb; getattr(pdb, method)(arg)
|
||||||
|
|
||||||
|
|
||||||
|
def test_pdb_run_with_incorrect_argument():
|
||||||
|
"""Testing run and runeval with incorrect first argument.
|
||||||
|
|
||||||
|
>>> pti = PdbTestInput(['continue',])
|
||||||
|
>>> with pti:
|
||||||
|
... pdb_invoke('run', lambda x: x)
|
||||||
|
Traceback (most recent call last):
|
||||||
|
TypeError: exec() arg 1 must be a string, bytes or code object
|
||||||
|
|
||||||
|
>>> with pti:
|
||||||
|
... pdb_invoke('runeval', lambda x: x)
|
||||||
|
Traceback (most recent call last):
|
||||||
|
TypeError: eval() arg 1 must be a string, bytes or code object
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
def test_pdb_run_with_code_object():
|
||||||
|
"""Testing run and runeval with code object as a first argument.
|
||||||
|
|
||||||
|
>>> with PdbTestInput(['step','x', 'continue']):
|
||||||
|
... pdb_invoke('run', compile('x=1', '<string>', 'exec'))
|
||||||
|
> <string>(1)<module>()
|
||||||
|
(Pdb) step
|
||||||
|
--Return--
|
||||||
|
> <string>(1)<module>()->None
|
||||||
|
(Pdb) x
|
||||||
|
1
|
||||||
|
(Pdb) continue
|
||||||
|
|
||||||
|
>>> with PdbTestInput(['x', 'continue']):
|
||||||
|
... x=0
|
||||||
|
... pdb_invoke('runeval', compile('x+1', '<string>', 'eval'))
|
||||||
|
> <string>(1)<module>()->None
|
||||||
|
(Pdb) x
|
||||||
|
1
|
||||||
|
(Pdb) continue
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
def test_main():
|
def test_main():
|
||||||
from test import test_pdb
|
from test import test_pdb
|
||||||
support.run_doctest(test_pdb, verbosity=True)
|
support.run_doctest(test_pdb, verbosity=True)
|
||||||
|
|
Loading…
Reference in New Issue