mirror of
https://github.com/python/cpython.git
synced 2025-11-27 05:44:16 +00:00
Merged revisions 83259,83261,83264-83265,83268-83269,83271-83272,83281 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/branches/py3k ........ r83259 | georg.brandl | 2010-07-30 09:03:39 +0200 (Fr, 30 Jul 2010) | 1 line Clarification. ........ r83261 | georg.brandl | 2010-07-30 09:21:26 +0200 (Fr, 30 Jul 2010) | 1 line #9230: allow Pdb.checkline() to be called without a current frame, for setting breakpoints before starting debugging. ........ r83264 | georg.brandl | 2010-07-30 10:45:26 +0200 (Fr, 30 Jul 2010) | 1 line Document the "jump" command in pdb.__doc__, and add a version tag for "until X". ........ r83265 | georg.brandl | 2010-07-30 10:54:49 +0200 (Fr, 30 Jul 2010) | 1 line #8015: fix crash when entering an empty line for breakpoint commands. Also restore environment properly when an exception occurs during the definition of commands. ........ r83268 | georg.brandl | 2010-07-30 11:23:23 +0200 (Fr, 30 Jul 2010) | 2 lines Issue #8048: Prevent doctests from failing when sys.displayhook has been reassigned. ........ r83269 | georg.brandl | 2010-07-30 11:43:00 +0200 (Fr, 30 Jul 2010) | 1 line #6719: In pdb, do not stop somewhere in the encodings machinery if the source file to be debugged is in a non-builtin encoding. ........ r83271 | georg.brandl | 2010-07-30 11:59:28 +0200 (Fr, 30 Jul 2010) | 1 line #5727: Restore the ability to use readline when calling into pdb in doctests. ........ r83272 | georg.brandl | 2010-07-30 12:29:19 +0200 (Fr, 30 Jul 2010) | 1 line #5294: Fix the behavior of pdb "continue" command when called in the top-level debugged frame. ........ r83281 | georg.brandl | 2010-07-30 15:36:43 +0200 (Fr, 30 Jul 2010) | 1 line Add myself for pdb. ........
This commit is contained in:
parent
f59f9b1e97
commit
507759904c
8 changed files with 123 additions and 15 deletions
|
|
@ -220,9 +220,9 @@ followed by ``lines`` for the text version or ``binary`` for the binary version.
|
||||||
Retrieve a file or directory listing in ASCII transfer mode. *command*
|
Retrieve a file or directory listing in ASCII transfer mode. *command*
|
||||||
should be an appropriate ``RETR`` command (see :meth:`retrbinary`) or a
|
should be an appropriate ``RETR`` command (see :meth:`retrbinary`) or a
|
||||||
command such as ``LIST``, ``NLST`` or ``MLSD`` (usually just the string
|
command such as ``LIST``, ``NLST`` or ``MLSD`` (usually just the string
|
||||||
``'LIST'``). The *callback* function is called for each line, with the
|
``'LIST'``). The *callback* function is called for each line with a
|
||||||
trailing CRLF stripped. The default *callback* prints the line to
|
string argument containing the line with the trailing CRLF stripped.
|
||||||
``sys.stdout``.
|
The default *callback* prints the line to ``sys.stdout``.
|
||||||
|
|
||||||
|
|
||||||
.. method:: FTP.set_pasv(boolean)
|
.. method:: FTP.set_pasv(boolean)
|
||||||
|
|
|
||||||
10
Lib/bdb.py
10
Lib/bdb.py
|
|
@ -109,6 +109,8 @@ class Bdb:
|
||||||
self.is_skipped_module(frame.f_globals.get('__name__')):
|
self.is_skipped_module(frame.f_globals.get('__name__')):
|
||||||
return False
|
return False
|
||||||
if frame is self.stopframe:
|
if frame is self.stopframe:
|
||||||
|
if self.stoplineno == -1:
|
||||||
|
return False
|
||||||
return frame.f_lineno >= self.stoplineno
|
return frame.f_lineno >= self.stoplineno
|
||||||
while frame is not None and frame is not self.stopframe:
|
while frame is not None and frame is not self.stopframe:
|
||||||
if frame is self.botframe:
|
if frame is self.botframe:
|
||||||
|
|
@ -166,10 +168,12 @@ class Bdb:
|
||||||
but only if we are to stop at or just below this level."""
|
but only if we are to stop at or just below this level."""
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def _set_stopinfo(self, stopframe, returnframe, stoplineno=-1):
|
def _set_stopinfo(self, stopframe, returnframe, stoplineno=0):
|
||||||
self.stopframe = stopframe
|
self.stopframe = stopframe
|
||||||
self.returnframe = returnframe
|
self.returnframe = returnframe
|
||||||
self.quitting = 0
|
self.quitting = 0
|
||||||
|
# stoplineno >= 0 means: stop at line >= the stoplineno
|
||||||
|
# stoplineno -1 means: don't stop at all
|
||||||
self.stoplineno = stoplineno
|
self.stoplineno = stoplineno
|
||||||
|
|
||||||
# Derived classes and clients can call the following methods
|
# Derived classes and clients can call the following methods
|
||||||
|
|
@ -182,7 +186,7 @@ class Bdb:
|
||||||
|
|
||||||
def set_step(self):
|
def set_step(self):
|
||||||
"""Stop after one line of code."""
|
"""Stop after one line of code."""
|
||||||
self._set_stopinfo(None,None)
|
self._set_stopinfo(None, None)
|
||||||
|
|
||||||
def set_next(self, frame):
|
def set_next(self, frame):
|
||||||
"""Stop on the next line in or below the given frame."""
|
"""Stop on the next line in or below the given frame."""
|
||||||
|
|
@ -209,7 +213,7 @@ class Bdb:
|
||||||
|
|
||||||
def set_continue(self):
|
def set_continue(self):
|
||||||
# Don't stop except at breakpoints or when finished
|
# Don't stop except at breakpoints or when finished
|
||||||
self._set_stopinfo(self.botframe, None)
|
self._set_stopinfo(self.botframe, None, -1)
|
||||||
if not self.breaks:
|
if not self.breaks:
|
||||||
# no breakpoints; run without debugger overhead
|
# no breakpoints; run without debugger overhead
|
||||||
sys.settrace(None)
|
sys.settrace(None)
|
||||||
|
|
|
||||||
|
|
@ -335,6 +335,8 @@ class _OutputRedirectingPdb(pdb.Pdb):
|
||||||
self.__out = out
|
self.__out = out
|
||||||
self.__debugger_used = False
|
self.__debugger_used = False
|
||||||
pdb.Pdb.__init__(self, stdout=out)
|
pdb.Pdb.__init__(self, stdout=out)
|
||||||
|
# still use input() to get user input
|
||||||
|
self.use_rawinput = 1
|
||||||
|
|
||||||
def set_trace(self, frame=None):
|
def set_trace(self, frame=None):
|
||||||
self.__debugger_used = True
|
self.__debugger_used = True
|
||||||
|
|
@ -1381,12 +1383,17 @@ class DocTestRunner:
|
||||||
self.save_linecache_getlines = linecache.getlines
|
self.save_linecache_getlines = linecache.getlines
|
||||||
linecache.getlines = self.__patched_linecache_getlines
|
linecache.getlines = self.__patched_linecache_getlines
|
||||||
|
|
||||||
|
# Make sure sys.displayhook just prints the value to stdout
|
||||||
|
save_displayhook = sys.displayhook
|
||||||
|
sys.displayhook = sys.__displayhook__
|
||||||
|
|
||||||
try:
|
try:
|
||||||
return self.__run(test, compileflags, out)
|
return self.__run(test, compileflags, out)
|
||||||
finally:
|
finally:
|
||||||
sys.stdout = save_stdout
|
sys.stdout = save_stdout
|
||||||
pdb.set_trace = save_set_trace
|
pdb.set_trace = save_set_trace
|
||||||
linecache.getlines = self.save_linecache_getlines
|
linecache.getlines = self.save_linecache_getlines
|
||||||
|
sys.displayhook = save_displayhook
|
||||||
if clear_globs:
|
if clear_globs:
|
||||||
test.globs.clear()
|
test.globs.clear()
|
||||||
|
|
||||||
|
|
|
||||||
21
Lib/pdb.py
21
Lib/pdb.py
|
|
@ -183,14 +183,18 @@ class Pdb(bdb.Bdb, cmd.Cmd):
|
||||||
|
|
||||||
def user_return(self, frame, return_value):
|
def user_return(self, frame, return_value):
|
||||||
"""This function is called when a return trap is set here."""
|
"""This function is called when a return trap is set here."""
|
||||||
|
if self._wait_for_mainpyfile:
|
||||||
|
return
|
||||||
frame.f_locals['__return__'] = return_value
|
frame.f_locals['__return__'] = return_value
|
||||||
print >>self.stdout, '--Return--'
|
print >>self.stdout, '--Return--'
|
||||||
self.interaction(frame, None)
|
self.interaction(frame, None)
|
||||||
|
|
||||||
def user_exception(self, frame, exc_info):
|
def user_exception(self, frame, exc_info):
|
||||||
exc_type, exc_value, exc_traceback = exc_info
|
|
||||||
"""This function is called if an exception occurs,
|
"""This function is called if an exception occurs,
|
||||||
but only if we are to stop at or just below this level."""
|
but only if we are to stop at or just below this level."""
|
||||||
|
if self._wait_for_mainpyfile:
|
||||||
|
return
|
||||||
|
exc_type, exc_value, exc_traceback = exc_info
|
||||||
frame.f_locals['__exception__'] = exc_type, exc_value
|
frame.f_locals['__exception__'] = exc_type, exc_value
|
||||||
if type(exc_type) == type(''):
|
if type(exc_type) == type(''):
|
||||||
exc_type_name = exc_type
|
exc_type_name = exc_type
|
||||||
|
|
@ -277,8 +281,10 @@ class Pdb(bdb.Bdb, cmd.Cmd):
|
||||||
return self.handle_command_def(line)
|
return self.handle_command_def(line)
|
||||||
|
|
||||||
def handle_command_def(self,line):
|
def handle_command_def(self,line):
|
||||||
""" Handles one command line during command list definition. """
|
"""Handles one command line during command list definition."""
|
||||||
cmd, arg, line = self.parseline(line)
|
cmd, arg, line = self.parseline(line)
|
||||||
|
if not cmd:
|
||||||
|
return
|
||||||
if cmd == 'silent':
|
if cmd == 'silent':
|
||||||
self.commands_silent[self.commands_bnum] = True
|
self.commands_silent[self.commands_bnum] = True
|
||||||
return # continue to handle other cmd def in the cmd list
|
return # continue to handle other cmd def in the cmd list
|
||||||
|
|
@ -286,7 +292,7 @@ class Pdb(bdb.Bdb, cmd.Cmd):
|
||||||
self.cmdqueue = []
|
self.cmdqueue = []
|
||||||
return 1 # end of cmd list
|
return 1 # end of cmd list
|
||||||
cmdlist = self.commands[self.commands_bnum]
|
cmdlist = self.commands[self.commands_bnum]
|
||||||
if (arg):
|
if arg:
|
||||||
cmdlist.append(cmd+' '+arg)
|
cmdlist.append(cmd+' '+arg)
|
||||||
else:
|
else:
|
||||||
cmdlist.append(cmd)
|
cmdlist.append(cmd)
|
||||||
|
|
@ -329,7 +335,9 @@ class Pdb(bdb.Bdb, cmd.Cmd):
|
||||||
prompt_back = self.prompt
|
prompt_back = self.prompt
|
||||||
self.prompt = '(com) '
|
self.prompt = '(com) '
|
||||||
self.commands_defining = True
|
self.commands_defining = True
|
||||||
|
try:
|
||||||
self.cmdloop()
|
self.cmdloop()
|
||||||
|
finally:
|
||||||
self.commands_defining = False
|
self.commands_defining = False
|
||||||
self.prompt = prompt_back
|
self.prompt = prompt_back
|
||||||
|
|
||||||
|
|
@ -467,7 +475,10 @@ class Pdb(bdb.Bdb, cmd.Cmd):
|
||||||
Return `lineno` if it is, 0 if not (e.g. a docstring, comment, blank
|
Return `lineno` if it is, 0 if not (e.g. a docstring, comment, blank
|
||||||
line or EOF). Warning: testing is not comprehensive.
|
line or EOF). Warning: testing is not comprehensive.
|
||||||
"""
|
"""
|
||||||
line = linecache.getline(filename, lineno, self.curframe.f_globals)
|
# this method should be callable before starting debugging, so default
|
||||||
|
# to "no globals" if there is no current frame
|
||||||
|
globs = self.curframe.f_globals if hasattr(self, 'curframe') else None
|
||||||
|
line = linecache.getline(filename, lineno, globs)
|
||||||
if not line:
|
if not line:
|
||||||
print >>self.stdout, 'End of file'
|
print >>self.stdout, 'End of file'
|
||||||
return 0
|
return 0
|
||||||
|
|
@ -1298,7 +1309,7 @@ def main():
|
||||||
# changed by the user from the command line. There is a "restart" command
|
# changed by the user from the command line. There is a "restart" command
|
||||||
# which allows explicit specification of command line arguments.
|
# which allows explicit specification of command line arguments.
|
||||||
pdb = Pdb()
|
pdb = Pdb()
|
||||||
while 1:
|
while True:
|
||||||
try:
|
try:
|
||||||
pdb._runscript(mainpyfile)
|
pdb._runscript(mainpyfile)
|
||||||
if pdb._user_requested_quit:
|
if pdb._user_requested_quit:
|
||||||
|
|
|
||||||
|
|
@ -980,6 +980,35 @@ unexpected exception:
|
||||||
...
|
...
|
||||||
ZeroDivisionError: integer division or modulo by zero
|
ZeroDivisionError: integer division or modulo by zero
|
||||||
TestResults(failed=1, attempted=1)
|
TestResults(failed=1, attempted=1)
|
||||||
|
"""
|
||||||
|
def displayhook(): r"""
|
||||||
|
Test that changing sys.displayhook doesn't matter for doctest.
|
||||||
|
|
||||||
|
>>> import sys
|
||||||
|
>>> orig_displayhook = sys.displayhook
|
||||||
|
>>> def my_displayhook(x):
|
||||||
|
... print('hi!')
|
||||||
|
>>> sys.displayhook = my_displayhook
|
||||||
|
>>> def f():
|
||||||
|
... '''
|
||||||
|
... >>> 3
|
||||||
|
... 3
|
||||||
|
... '''
|
||||||
|
>>> test = doctest.DocTestFinder().find(f)[0]
|
||||||
|
>>> r = doctest.DocTestRunner(verbose=False).run(test)
|
||||||
|
>>> post_displayhook = sys.displayhook
|
||||||
|
|
||||||
|
We need to restore sys.displayhook now, so that we'll be able to test
|
||||||
|
results.
|
||||||
|
|
||||||
|
>>> sys.displayhook = orig_displayhook
|
||||||
|
|
||||||
|
Ok, now we can check that everything is ok.
|
||||||
|
|
||||||
|
>>> r
|
||||||
|
TestResults(failed=0, attempted=1)
|
||||||
|
>>> post_displayhook is my_displayhook
|
||||||
|
True
|
||||||
"""
|
"""
|
||||||
def optionflags(): r"""
|
def optionflags(): r"""
|
||||||
Tests of `DocTestRunner`'s option flag handling.
|
Tests of `DocTestRunner`'s option flag handling.
|
||||||
|
|
|
||||||
|
|
@ -126,6 +126,48 @@ def test_pdb_skip_modules_with_callback():
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
def test_pdb_continue_in_bottomframe():
|
||||||
|
"""Test that "continue" and "next" work properly in bottom frame (issue #5294).
|
||||||
|
|
||||||
|
>>> def test_function():
|
||||||
|
... import pdb, sys; inst = pdb.Pdb()
|
||||||
|
... inst.set_trace()
|
||||||
|
... inst.botframe = sys._getframe() # hackery to get the right botframe
|
||||||
|
... print(1)
|
||||||
|
... print(2)
|
||||||
|
... print(3)
|
||||||
|
... print(4)
|
||||||
|
|
||||||
|
>>> with PdbTestInput([
|
||||||
|
... 'next',
|
||||||
|
... 'break 7',
|
||||||
|
... 'continue',
|
||||||
|
... 'next',
|
||||||
|
... 'continue',
|
||||||
|
... 'continue',
|
||||||
|
... ]):
|
||||||
|
... test_function()
|
||||||
|
> <doctest test.test_pdb.test_pdb_continue_in_bottomframe[0]>(4)test_function()
|
||||||
|
-> inst.botframe = sys._getframe() # hackery to get the right botframe
|
||||||
|
(Pdb) next
|
||||||
|
> <doctest test.test_pdb.test_pdb_continue_in_bottomframe[0]>(5)test_function()
|
||||||
|
-> print(1)
|
||||||
|
(Pdb) break 7
|
||||||
|
Breakpoint 1 at <doctest test.test_pdb.test_pdb_continue_in_bottomframe[0]>:7
|
||||||
|
(Pdb) continue
|
||||||
|
1
|
||||||
|
2
|
||||||
|
> <doctest test.test_pdb.test_pdb_continue_in_bottomframe[0]>(7)test_function()
|
||||||
|
-> print(3)
|
||||||
|
(Pdb) next
|
||||||
|
3
|
||||||
|
> <doctest test.test_pdb.test_pdb_continue_in_bottomframe[0]>(8)test_function()
|
||||||
|
-> print(4)
|
||||||
|
(Pdb) continue
|
||||||
|
4
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
def test_main():
|
def test_main():
|
||||||
from test import test_pdb
|
from test import test_pdb
|
||||||
test_support.run_doctest(test_pdb, verbosity=True)
|
test_support.run_doctest(test_pdb, verbosity=True)
|
||||||
|
|
|
||||||
15
Misc/NEWS
15
Misc/NEWS
|
|
@ -24,6 +24,21 @@ Core and Builtins
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Issue #5294: Fix the behavior of pdb's "continue" command when called
|
||||||
|
in the top-level debugged frame.
|
||||||
|
|
||||||
|
- Issue #5727: Restore the ability to use readline when calling into pdb
|
||||||
|
in doctests.
|
||||||
|
|
||||||
|
- Issue #6719: In pdb, do not stop somewhere in the encodings machinery
|
||||||
|
if the source file to be debugged is in a non-builtin encoding.
|
||||||
|
|
||||||
|
- Issue #8048: Prevent doctests from failing when sys.displayhook has
|
||||||
|
been reassigned.
|
||||||
|
|
||||||
|
- Issue #8015: In pdb, do not crash when an empty line is entered as
|
||||||
|
a breakpoint command.
|
||||||
|
|
||||||
- Issue #9448: Fix a leak of OS resources (mutexes or semaphores) when
|
- Issue #9448: Fix a leak of OS resources (mutexes or semaphores) when
|
||||||
re-initializing a buffered IO object by calling its ``__init__`` method.
|
re-initializing a buffered IO object by calling its ``__init__`` method.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -151,7 +151,7 @@ optparse aronacher
|
||||||
os loewis
|
os loewis
|
||||||
ossaudiodev
|
ossaudiodev
|
||||||
parser
|
parser
|
||||||
pdb
|
pdb georg.brandl
|
||||||
pickle alexandre.vassalotti, pitrou
|
pickle alexandre.vassalotti, pitrou
|
||||||
pickletools alexandre.vassalotti
|
pickletools alexandre.vassalotti
|
||||||
pipes
|
pipes
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue