[py-svn] r46772 - in py/trunk/py/test: . rsession rsession/testing terminal

cfbolz at codespeak.net cfbolz at codespeak.net
Thu Sep 20 17:26:09 CEST 2007


Author: cfbolz
Date: Thu Sep 20 17:26:09 2007
New Revision: 46772

Added:
   py/trunk/py/test/custompdb.py
Modified:
   py/trunk/py/test/rsession/executor.py
   py/trunk/py/test/rsession/testing/test_lsession.py
   py/trunk/py/test/terminal/terminal.py
Log:
add a custom pdb.Pdb subclass that has the ability to properly list the lines
generated by py.code.Source. Very useful in PyPy debugging.


Added: py/trunk/py/test/custompdb.py
==============================================================================
--- (empty file)
+++ py/trunk/py/test/custompdb.py	Thu Sep 20 17:26:09 2007
@@ -0,0 +1,72 @@
+import pdb, sys, linecache
+
+class Pdb(pdb.Pdb):
+    def do_list(self, arg):
+        self.lastcmd = 'list'
+        last = None
+        if arg:
+            try:
+                x = eval(arg, {}, {})
+                if type(x) == type(()):
+                    first, last = x
+                    first = int(first)
+                    last = int(last)
+                    if last < first:
+                        # Assume it's a count
+                        last = first + last
+                else:
+                    first = max(1, int(x) - 5)
+            except:
+                print '*** Error in argument:', repr(arg)
+                return
+        elif self.lineno is None:
+            first = max(1, self.curframe.f_lineno - 5)
+        else:
+            first = self.lineno + 1
+        if last is None:
+            last = first + 10
+        filename = self.curframe.f_code.co_filename
+        breaklist = self.get_file_breaks(filename)
+        try:
+            for lineno in range(first, last+1):
+                # start difference from normal do_line
+                line = self._getline(filename, lineno)
+                # end difference from normal do_line
+                if not line:
+                    print '[EOF]'
+                    break
+                else:
+                    s = repr(lineno).rjust(3)
+                    if len(s) < 4: s = s + ' '
+                    if lineno in breaklist: s = s + 'B'
+                    else: s = s + ' '
+                    if lineno == self.curframe.f_lineno:
+                        s = s + '->'
+                    print s + '\t' + line,
+                    self.lineno = lineno
+        except KeyboardInterrupt:
+            pass
+    do_l = do_list
+
+    def _getline(self, filename, lineno):
+        if hasattr(filename, "__source__"):
+            try:
+                return filename.__source__.lines[lineno - 1] + "\n"
+            except IndexError:
+                return None
+        return linecache.getline(filename, lineno)
+
+def post_mortem(t):
+    # again, a copy of the version in pdb.py
+    t = outcome.excinfo._excinfo[2]
+    p = Pdb()
+    p.reset()
+    while t.tb_next is not None:
+        t = t.tb_next
+    p.interaction(t.tb_frame, t)
+
+def set_trace():
+    # again, a copy of the version in pdb.py
+    Pdb().set_trace(sys._getframe().f_back)
+
+

Modified: py/trunk/py/test/rsession/executor.py
==============================================================================
--- py/trunk/py/test/rsession/executor.py	(original)
+++ py/trunk/py/test/rsession/executor.py	Thu Sep 20 17:26:09 2007
@@ -7,6 +7,7 @@
 from py.__.test.rsession.box import Box
 from py.__.test import repevent
 from py.__.test.outcome import Skipped, Failed
+import py.__.test.custompdb
 
 class RunExecutor(object):
     """ Same as in executor, but just running run
@@ -55,8 +56,7 @@
                     self.reporter(repevent.ImmediateFailure(self.item,
                         ReprOutcome(outcome.make_repr
                                     (self.config.option.tbstyle))))
-                import pdb
-                pdb.post_mortem(excinfo._excinfo[2])
+                py.__.test.custompdb.post_mortem(excinfo._excinfo[2])
                 # XXX hmm, we probably will not like to continue from that
                 #     point
                 raise SystemExit()

Modified: py/trunk/py/test/rsession/testing/test_lsession.py
==============================================================================
--- py/trunk/py/test/rsession/testing/test_lsession.py	(original)
+++ py/trunk/py/test/rsession/testing/test_lsession.py	Thu Sep 20 17:26:09 2007
@@ -6,6 +6,7 @@
 from py.__.test.rsession.rsession import LSession
 from py.__.test import repevent
 from py.__.test.rsession.local import box_runner, plain_runner, apigen_runner
+import py.__.test.custompdb
 
 def setup_module(mod): 
     mod.tmp = py.test.ensuretemp("lsession_module") 
@@ -78,14 +79,13 @@
             def test_1(): 
                 assert 0
         """))
-        import pdb
         l = []
         def some_fun(*args):
             l.append(args)
 
         try:
-            post_mortem = pdb.post_mortem
-            pdb.post_mortem = some_fun
+            post_mortem = py.__.test.custompdb.post_mortem
+            py.__.test.custompdb.post_mortem = some_fun
             args = [str(tmpdir.join(subdir)), '--pdb']
             config = py.test.config._reparse(args)
             lsession = LSession(config)
@@ -101,7 +101,7 @@
             assert len(failure_events) == 1
             assert len(l) == 1
         finally:
-            pdb.post_mortem = post_mortem
+            py.__.test.custompdb.post_mortem = post_mortem
 
     def test_minus_x(self):
         if not hasattr(py.std.os, 'fork'):

Modified: py/trunk/py/test/terminal/terminal.py
==============================================================================
--- py/trunk/py/test/terminal/terminal.py	(original)
+++ py/trunk/py/test/terminal/terminal.py	Thu Sep 20 17:26:09 2007
@@ -4,6 +4,7 @@
 from py.__.test.terminal.out import getout 
 from py.__.test.representation import Presenter
 from py.__.test.outcome import Skipped, Passed, Failed
+import py.__.test.custompdb
 
 def getrelpath(source, dest): 
     base = source.common(dest)
@@ -97,9 +98,8 @@
             if isinstance(outcome, Failed): 
                 print "dispatching to ppdb", colitem
                 self.repr_failure(colitem, outcome) 
-                import pdb
                 self.out.write('\n%s\n' % (outcome.excinfo.exconly(),))
-                pdb.post_mortem(outcome.excinfo._excinfo[2])
+                py.__.test.custompdb.post_mortem(excinfo._excinfo[2])
         if isinstance(colitem, py.test.collect.Module):
             resultstring = self.repr_progress_module_result(colitem, outcome)
             if resultstring:


More information about the py-svn mailing list