[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