[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