[py-svn] r34591 - in py/dist/py/apigen/tracer: . testing
fijal at codespeak.net
fijal at codespeak.net
Tue Nov 14 10:50:06 CET 2006
Author: fijal
Date: Tue Nov 14 10:50:03 2006
New Revision: 34591
Modified:
py/dist/py/apigen/tracer/description.py
py/dist/py/apigen/tracer/docstorage.py
py/dist/py/apigen/tracer/testing/test_docgen.py
py/dist/py/apigen/tracer/tracer.py
Log:
Added exception handling code.
Modified: py/dist/py/apigen/tracer/description.py
==============================================================================
--- py/dist/py/apigen/tracer/description.py (original)
+++ py/dist/py/apigen/tracer/description.py Tue Nov 14 10:50:03 2006
@@ -124,6 +124,7 @@
self.keep_frames = kwargs.get('keep_frames', False)
self.frame_copier = kwargs.get('frame_copier', lambda x:x)
self.retval = model.s_ImpossibleValue
+ self.exceptions = {}
def consider_call(self, inputcells):
for cell_num, cell in enumerate(inputcells):
@@ -136,6 +137,9 @@
cs = cut_stack(stack, frame, cut_frame)
self.call_sites[cs] = cs
+ def consider_exception(self, exc, value):
+ self.exceptions[exc] = True
+
def get_call_sites(self):
# convinient accessor for various data which we keep there
if not self.keep_frames:
@@ -204,6 +208,14 @@
def consider_return(self, arg):
pass # we *know* what return value we do have
+
+ def consider_exception(self, exc, value):
+ if '__init__' in self.fields:
+ md = self.fields['__init__']
+ else:
+ md = MethodDesc(self.name + '.__init__', self.pyobj.__init__)
+ self.fields['__init__'] = md
+ md.consider_exception(exc, value)
def consider_start_locals(self, frame):
if '__init__' in self.fields:
Modified: py/dist/py/apigen/tracer/docstorage.py
==============================================================================
--- py/dist/py/apigen/tracer/docstorage.py (original)
+++ py/dist/py/apigen/tracer/docstorage.py Tue Nov 14 10:50:03 2006
@@ -37,6 +37,12 @@
if desc:
self.generalize_retval(desc, arg)
desc.consider_end_locals(frame)
+
+ def consider_exception(self, frame, arg):
+ desc = self.find_desc(frame.code, frame.raw.f_locals)
+ if desc:
+ exc_class, value, _ = arg
+ desc.consider_exception(exc_class, value)
def find_desc(self, code, locals):
if code.name == '__init__':
Modified: py/dist/py/apigen/tracer/testing/test_docgen.py
==============================================================================
--- py/dist/py/apigen/tracer/testing/test_docgen.py (original)
+++ py/dist/py/apigen/tracer/testing/test_docgen.py Tue Nov 14 10:50:03 2006
@@ -194,3 +194,25 @@
t.end_tracing()
assert len(ds.descs['A'].fields['__init__'].call_sites) == 1
assert len(ds.descs['B'].fields['__init__'].call_sites) == 1
+
+def test_exception_raise():
+ def x():
+ 1/0
+
+ def y():
+ try:
+ x()
+ except ZeroDivisionError:
+ pass
+
+ def z():
+ y()
+
+ ds = DocStorage().from_dict({'x':x, 'y':y, 'z':z})
+ t = Tracer(ds)
+ t.start_tracing()
+ z()
+ t.end_tracing()
+ assert ds.descs['x'].exceptions.keys() == [ZeroDivisionError]
+ assert ds.descs['y'].exceptions.keys() == [ZeroDivisionError]
+ assert ds.descs['z'].exceptions.keys() == []
Modified: py/dist/py/apigen/tracer/tracer.py
==============================================================================
--- py/dist/py/apigen/tracer/tracer.py (original)
+++ py/dist/py/apigen/tracer/tracer.py Tue Nov 14 10:50:03 2006
@@ -38,6 +38,8 @@
self.docstorage.consider_call(frame, None, self.frame)
elif event == 'return':
self.docstorage.consider_return(frame, arg)
+ elif event == 'exception':
+ self.docstorage.consider_exception(frame, arg)
return self._tracer
def start_tracing(self):
More information about the pytest-commit
mailing list