[py-svn] r17669 - in py/branch/monday/py: code code/testing test/terminal

hpk at codespeak.net hpk at codespeak.net
Mon Sep 19 20:20:58 CEST 2005


Author: hpk
Date: Mon Sep 19 20:20:57 2005
New Revision: 17669

Modified:
   py/branch/monday/py/code/testing/test_excinfo.py
   py/branch/monday/py/code/traceback2.py
   py/branch/monday/py/test/terminal/terminal.py
Log:
(hpk, arigo)

Moved the recursion detection to the Traceback class.


Modified: py/branch/monday/py/code/testing/test_excinfo.py
==============================================================================
--- py/branch/monday/py/code/testing/test_excinfo.py	(original)
+++ py/branch/monday/py/code/testing/test_excinfo.py	Mon Sep 19 20:20:57 2005
@@ -100,6 +100,16 @@
         traceback = self.excinfo.traceback
         ntraceback = traceback.filter()
         assert len(ntraceback) == len(traceback) - 1
+
+    def test_traceback_recursion_index(self):
+        def f(n):
+            if n < 10:
+                n += 1
+            f(n)
+        excinfo = py.test.raises(RuntimeError, f, 8)
+        traceback = excinfo.traceback 
+        recindex = traceback.recursionindex() 
+        assert recindex == 3
         
     #def test_traceback_display_func(self):
     #    tb = self.excinfo.traceback 

Modified: py/branch/monday/py/code/traceback2.py
==============================================================================
--- py/branch/monday/py/code/traceback2.py	(original)
+++ py/branch/monday/py/code/traceback2.py	Mon Sep 19 20:20:57 2005
@@ -99,6 +99,23 @@
     def filter(self, fn=lambda x: not x.ishidden()):
         return Traceback(filter(fn, self))
 
+    def recursionindex(self):
+        cache = {}
+        for i, entry in py.builtin.enumerate(self):
+            key = entry.frame.code.path, entry.frame.lineno 
+            #print "checking for recursion at", key
+            l = cache.setdefault(key, [])
+            if l: 
+                f = entry.frame
+                loc = f.f_locals
+                for otherloc in l: 
+                    if f.is_true(f.eval(co_equal, 
+                        __recursioncache_locals_1=loc,
+                        __recursioncache_locals_2=otherloc)):
+                        return i 
+            l.append(entry.frame.f_locals)
+        return None
+        
 #    def __str__(self): 
 #        for x in self
 #        l = []
@@ -106,3 +123,6 @@
 #            l.append(entry.display()) 
 #        return "".join(l) 
 
+
+co_equal = compile('__recursioncache_locals_1 == __recursioncache_locals_2',
+                   '?', 'eval')

Modified: py/branch/monday/py/test/terminal/terminal.py
==============================================================================
--- py/branch/monday/py/test/terminal/terminal.py	(original)
+++ py/branch/monday/py/test/terminal/terminal.py	Mon Sep 19 20:20:57 2005
@@ -266,8 +266,11 @@
             return
         last = traceback[-1]
         first = traceback[0]
-        recursioncache = {}
-        for entry in traceback: 
+        if not self.config.option.nomagic and excinfo.errisinstance(RuntimeError):
+            recursionindex = traceback.recursionindex()
+        else:
+            recursionindex = None
+        for index, entry in py.builtin.enumerate(traceback): 
             if entry == first: 
                 if item: 
                     self.repr_failure_info(item, entry) 
@@ -291,27 +294,11 @@
                 self.out.sep("_")
             else: 
                 self.out.sep("_ ")
-                if not self.config.option.nomagic and excinfo.errisinstance(RuntimeError) \
-                       and self.isrecursive(entry, recursioncache): 
+                if index == recursionindex:
                     self.out.line("Recursion detected (same locals & position)")
                     self.out.sep("!")
                     break 
 
-    def isrecursive(self, entry, recursioncache): 
-        # recursion detection 
-        key = entry.frame.code.path, entry.frame.lineno 
-        #print "checking for recursion at", key
-        l = recursioncache.setdefault(key, [])
-        if l: 
-            f = entry.frame
-            loc = f.f_locals
-            for otherloc in l: 
-                if f.is_true(f.eval(co_equal, 
-                    __recursioncache_locals_1=loc,
-                    __recursioncache_locals_2=otherloc)):
-                    return True 
-        l.append(entry.frame.f_locals)
-        
     def repr_failure_info(self, item, entry): 
         root = item.fspath 
         modpath = item.getmodpath() 
@@ -407,9 +394,6 @@
                     self.out.line("%-10s =\\" % (name,))
                     py.std.pprint.pprint(value, stream=self.out)
 
-co_equal = compile('__recursioncache_locals_1 == __recursioncache_locals_2',
-                   '?', 'eval')
-
 def repr_pythonversion():
     v = py.std.sys.version_info
     try:



More information about the pytest-commit mailing list