@@ -94,6 +94,7 @@ def _test():
94
94
95
95
import __future__
96
96
import difflib
97
+ import functools
97
98
import inspect
98
99
import linecache
99
100
import os
@@ -358,24 +359,16 @@ class _OutputRedirectingPdb(pdb.Pdb):
358
359
"""
359
360
def __init__ (self , out ):
360
361
self .__out = out
361
- self .__debugger_used = False
362
362
# do not play signal games in the pdb
363
363
pdb .Pdb .__init__ (self , stdout = out , nosigint = True )
364
364
# still use input() to get user input
365
365
self .use_rawinput = 1
366
366
367
367
def set_trace (self , frame = None ):
368
- self .__debugger_used = True
369
368
if frame is None :
370
369
frame = sys ._getframe ().f_back
371
370
pdb .Pdb .set_trace (self , frame )
372
371
373
- def set_continue (self ):
374
- # Calling set_continue unconditionally would break unit test
375
- # coverage reporting, as Bdb.set_continue calls sys.settrace(None).
376
- if self .__debugger_used :
377
- pdb .Pdb .set_continue (self )
378
-
379
372
def trace_dispatch (self , * args ):
380
373
# Redirect stdout to the given stream.
381
374
save_stdout = sys .stdout
@@ -1217,6 +1210,8 @@ def __init__(self, checker=None, verbose=None, optionflags=0):
1217
1210
# Create a fake output target for capturing doctest output.
1218
1211
self ._fakeout = _SpoofOut ()
1219
1212
1213
+ self .debugger = None
1214
+
1220
1215
#/////////////////////////////////////////////////////////////////
1221
1216
# Reporting methods
1222
1217
#/////////////////////////////////////////////////////////////////
@@ -1335,13 +1330,15 @@ def __run(self, test, compileflags, out):
1335
1330
# Don't blink! This is where the user's code gets run.
1336
1331
exec (compile (example .source , filename , "single" ,
1337
1332
compileflags , True ), test .globs )
1338
- self .debugger .set_continue () # ==== Example Finished ====
1333
+ if self .debugger :
1334
+ self .debugger .set_continue () # ==== Example Finished ====
1339
1335
exception = None
1340
1336
except KeyboardInterrupt :
1341
1337
raise
1342
1338
except :
1343
1339
exception = sys .exc_info ()
1344
- self .debugger .set_continue () # ==== Example Finished ====
1340
+ if self .debugger :
1341
+ self .debugger .set_continue () # ==== Example Finished ====
1345
1342
1346
1343
got = self ._fakeout .getvalue () # the actual output
1347
1344
self ._fakeout .truncate (0 )
@@ -1422,6 +1419,12 @@ def __patched_linecache_getlines(self, filename, module_globals=None):
1422
1419
else :
1423
1420
return self .save_linecache_getlines (filename , module_globals )
1424
1421
1422
+ def _pdb_set_trace (self , stdout ):
1423
+ if not self .debugger :
1424
+ self .debugger = _OutputRedirectingPdb (stdout )
1425
+ self .debugger .reset ()
1426
+ self .debugger .set_trace (frame = sys ._getframe ().f_back )
1427
+
1425
1428
def run (self , test , compileflags = None , out = None , clear_globs = True ):
1426
1429
"""
1427
1430
Run the examples in `test`, and display the results using the
@@ -1466,9 +1469,7 @@ def out(s):
1466
1469
# allows us to write test cases for the set_trace behavior.
1467
1470
save_trace = sys .gettrace ()
1468
1471
save_set_trace = pdb .set_trace
1469
- self .debugger = _OutputRedirectingPdb (save_stdout )
1470
- self .debugger .reset ()
1471
- pdb .set_trace = self .debugger .set_trace
1472
+ pdb .set_trace = functools .partial (self ._pdb_set_trace , save_stdout )
1472
1473
1473
1474
# Patch linecache.getlines, so we can see the example's source
1474
1475
# when we're inside the debugger.
0 commit comments