[py-svn] r33023 - in py/branch/apigen/py/test/tracer: . testing

fijal at codespeak.net fijal at codespeak.net
Sun Oct 8 23:19:26 CEST 2006


Author: fijal
Date: Sun Oct  8 23:19:24 2006
New Revision: 33023

Modified:
   py/branch/apigen/py/test/tracer/description.py
   py/branch/apigen/py/test/tracer/docstorage.py
   py/branch/apigen/py/test/tracer/genrest.py
   py/branch/apigen/py/test/tracer/testing/test_docgen.py
Log:
Added some return value tests as well as fixed it.


Modified: py/branch/apigen/py/test/tracer/description.py
==============================================================================
--- py/branch/apigen/py/test/tracer/description.py	(original)
+++ py/branch/apigen/py/test/tracer/description.py	Sun Oct  8 23:19:24 2006
@@ -1,9 +1,5 @@
 
-from pypy.annotation.model import unionof
-
-# XXX: Global notice - for performance reason we have to make hash
-# out of probably code as a key to search for proper desc. I'm not doing that
-# right now, because I'm not absolutely sure what will be the real key
+from pypy.annotation import model
 
 import types
 
@@ -49,25 +45,27 @@
     # define code somehow
 
 class FunctionDesc(Desc):
+    def __init__(self, *args, **kwargs):
+        super(FunctionDesc, self).__init__(*args, **kwargs)
+        self.inputcells = [model.s_ImpossibleValue for i in xrange(self.\
+            code.co_argcount)]
+        self.call_sites = []
+        self.retval = model.s_ImpossibleValue
+    
     def consider_call(self, inputcells):
-        if not hasattr(self, 'inputcells'):
-            self.inputcells = inputcells
-            return
         for cell_num, cell in enumerate(inputcells):
-            self.inputcells[cell_num] = unionof(cell, self.inputcells[cell_num])
+            self.inputcells[cell_num] = model.unionof(cell, self.inputcells[cell_num])
 
     def consider_call_site(self, frame):
-        if not hasattr(self, 'call_sites'):
-            self.call_sites = []
         self.call_sites.append(CallSite(frame.code.raw.co_filename, frame.lineno+1, str(frame.statement)))
+    
+    def consider_return(self, arg):
+        self.retval = model.unionof(arg, self.retval)
 
     def getcode(self):
         return self.pyobj.func_code
     code = property(getcode)
     
-    def was_used(self):
-        return hasattr(self, 'inputcells')
-
 class ClassDesc(Desc):
     def __init__(self, *args, **kwargs):
         super(ClassDesc, self).__init__(*args, **kwargs)
@@ -84,6 +82,9 @@
         self.fields['__init__'] = md
         md.consider_call(inputcells)
     
+    def consider_return(self, arg):
+        pass # we *know* what return value we do have
+    
     def consider_call_site(self, frame):
         self.fields['__init__'].consider_call_site(frame)
     

Modified: py/branch/apigen/py/test/tracer/docstorage.py
==============================================================================
--- py/branch/apigen/py/test/tracer/docstorage.py	(original)
+++ py/branch/apigen/py/test/tracer/docstorage.py	Sun Oct  8 23:19:24 2006
@@ -15,16 +15,13 @@
 class DummyAnnotator(object):
     policy = AnnotatorPolicy()
 
-DEBUG_FRAMES = False # flag for debugging gathered frames
-
 class DocStorage(object):
     """ Class storing info about API
     """
     def __init__(self):
         self.bookkeeper = Bookkeeper(DummyAnnotator())
         #self.call_stack = []
-        if DEBUG_FRAMES:
-            self.frames = []
+        #self.frames = []
     
     def consider_call(self, frame, caller_frame):
         assert isinstance(frame, py.code.Frame)
@@ -32,25 +29,20 @@
         if desc:
             self.generalize_args(desc, frame)
             desc.consider_call_site(caller_frame)
-        if DEBUG_FRAMES:
-            all_frames = []
-            num = 0
-            try:
-                while 1:
-                    all_frames.append(sys._getframe(num))
-                    num += 1
-            except ValueError:
-                pass
-            
-            self.frames.append(all_frames)
     
     def generalize_args(self, desc, frame):
         args = [arg for key, arg in frame.getargs()]
         #self.call_stack.append((desc, args))
         desc.consider_call([self.bookkeeper.immutablevalue(arg) for arg in args])
+    
+    def generalize_retval(self, desc, arg):
+        desc.consider_return(self.bookkeeper.immutablevalue(arg))
 
     def consider_return(self, frame, arg):
-        pass
+        assert isinstance(frame, py.code.Frame)
+        desc = self.find_desc(frame)
+        if desc:
+            self.generalize_retval(desc, arg)
 
     def find_desc(self, frame):
         return self.desc_cache.get(frame.code.raw, None)
@@ -104,9 +96,10 @@
     def __init__(self, ds):
         self.ds = ds
 
-    def get_names(self):
+    def get_function_names(self):
         # get iterator over all API exposed names
-        return self.ds.descs.iterkeys()
+        return [i for i, desc in self.ds.descs.iteritems() if isinstance(desc, 
+            FunctionDesc)]
     
     #def get_function(self, name):
     #    return self.ds.descs[name].pyobj

Modified: py/branch/apigen/py/test/tracer/genrest.py
==============================================================================
--- py/branch/apigen/py/test/tracer/genrest.py	(original)
+++ py/branch/apigen/py/test/tracer/genrest.py	Sun Oct  8 23:19:24 2006
@@ -56,11 +56,12 @@
         self.list = []
         self.add(Title("Module: %s" % self.dsa.get_module_name(), belowchar="="))
         self.add(Paragraph(Text(self.dsa.get_module_info())))
-        self.add(Title("Exported functions:", belowchar="-"))
         self.write_functions()
+        self.write_classes()
     
     def write_functions(self):
-        for key in self.dsa.get_names():
+        self.add(Title("Exported functions:", belowchar="-"))
+        for key in self.dsa.get_function_names():
             title = Title("%s description:" % key, belowchar="^")
             docstr = Paragraph(self.dsa.get_function_doc(key))
             args = self.dsa.get_function_args(key)
@@ -74,7 +75,10 @@
                 link_str = "File %s:%s" % (call_site.filename,
                     call_site.lineno)
                 link_target = self.linkgen.getlink(call_site.filename, call_site.lineno)
-                call_sites.append(Paragraph(Link(link_str, link_target)))
+                if link_target: # otherwise it's just inline text
+                    call_sites.append(Paragraph(Link(link_str, link_target)))
+                else:
+                    call_sites.append(Paragraph(link_str))
                 call_sites.append(BlockQuote(call_site.source))
             
             for item in [title, docstr, arg_quote, call_site_title] + call_sites:
@@ -83,3 +87,7 @@
             #for call_site in self.dsa.get_function_callpoints(key):
             #    self.writeline("File %s:%s\n%s" % call_site.get_tuple())
         self.output.write(Rest(*self.list).text())
+
+    def write_classes(self):
+        self.add(Title("Exported classes:", belowchar="-"))
+        

Modified: py/branch/apigen/py/test/tracer/testing/test_docgen.py
==============================================================================
--- py/branch/apigen/py/test/tracer/testing/test_docgen.py	(original)
+++ py/branch/apigen/py/test/tracer/testing/test_docgen.py	Sun Oct  8 23:19:24 2006
@@ -30,6 +30,7 @@
     assert isinstance(inputcells[0], model.SomeFloat)
     assert isinstance(inputcells[1], model.SomeTuple)
     assert isinstance(inputcells[2], model.SomeObject)
+    assert isinstance(desc.retval, model.SomeChar)
     cs = desc.call_sites
     assert len(cs) == 2
     f_name = __file__
@@ -86,3 +87,4 @@
     assert isinstance(inputcells[1], model.SomeInteger)
     assert isinstance(inputcells[2], model.SomeFloat)
     assert isinstance(inputcells[3], model.SomeList)
+    assert isinstance(desc.fields['exposed_method'].retval, model.SomeChar)



More information about the pytest-commit mailing list