[pypy-svn] r36598 - pypy/dist/pypy/annotation

fijal at codespeak.net fijal at codespeak.net
Fri Jan 12 18:13:28 CET 2007


Author: fijal
Date: Fri Jan 12 18:13:13 2007
New Revision: 36598

Modified:
   pypy/dist/pypy/annotation/bookkeeper.py
   pypy/dist/pypy/annotation/signature.py
Log:
(arigo, fijal) - Create new function annotationoftype, so we can create annotations out of type in a more general way.


Modified: pypy/dist/pypy/annotation/bookkeeper.py
==============================================================================
--- pypy/dist/pypy/annotation/bookkeeper.py	(original)
+++ pypy/dist/pypy/annotation/bookkeeper.py	Fri Jan 12 18:13:13 2007
@@ -16,6 +16,7 @@
 from pypy.annotation.listdef import ListDef, MOST_GENERAL_LISTDEF
 from pypy.annotation.dictdef import DictDef, MOST_GENERAL_DICTDEF
 from pypy.annotation import description
+from pypy.annotation.signature import annotationoftype
 from pypy.interpreter.argument import Arguments, ArgErr
 from pypy.rlib.rarithmetic import r_int, r_uint, r_ulonglong, r_longlong
 from pypy.rlib.rarithmetic import base_int
@@ -539,39 +540,7 @@
             clsdef.add_source_for_attribute(attr, source) # can trigger reflowing
 
     def valueoftype(self, t):
-        """The most precise SomeValue instance that contains all
-        objects of type t."""
-        assert isinstance(t, (type, types.ClassType))
-        if t is bool:
-            return SomeBool()
-        elif t is int:
-            return SomeInteger()
-        elif issubclass(t, str): # py.lib uses annotated str subclasses
-            return SomeString()
-        elif t is float:
-            return SomeFloat()
-        elif t is list:
-            return SomeList(MOST_GENERAL_LISTDEF)
-        elif t is dict:
-            return SomeDict(MOST_GENERAL_DICTDEF)
-        # can't do tuple
-        elif t is types.NoneType:
-            return s_None
-        elif t in EXTERNAL_TYPE_ANALYZERS:
-            return SomeExternalObject(t)
-##        elif hasattr(t, "compute_annotation"):
-##            return t.compute_annotation()
-        elif extregistry.is_registered_type(t, self.policy):
-            entry = extregistry.lookup_type(t, self.policy)
-            return entry.compute_annotation_bk(self)
-        elif t.__module__ != '__builtin__' and t not in self.pbctypes:
-            classdef = self.getuniqueclassdef(t)
-            return SomeInstance(classdef)
-        else:
-            o = SomeObject()
-            if t != object:
-                o.knowntype = t
-            return o
+        return annotationoftype(t, self)
 
     def get_classpbc_attr_families(self, attrname):
         """Return the UnionFind for the ClassAttrFamilies corresponding to

Modified: pypy/dist/pypy/annotation/signature.py
==============================================================================
--- pypy/dist/pypy/annotation/signature.py	(original)
+++ pypy/dist/pypy/annotation/signature.py	Fri Jan 12 18:13:13 2007
@@ -1,6 +1,48 @@
 
 import types
-from pypy.annotation import model as annmodel
+from pypy.annotation.model import SomeBool, SomeInteger, SomeString,\
+     SomeFloat, SomeList, SomeDict, s_None, SomeExternalObject,\
+     SomeObject, SomeInstance
+from pypy.annotation.classdef import ClassDef, InstanceSource
+from pypy.annotation.listdef import ListDef, MOST_GENERAL_LISTDEF
+from pypy.annotation.dictdef import DictDef, MOST_GENERAL_DICTDEF
+
+def annotationoftype(t, bookkeeper=False):
+    from pypy.annotation.builtin import BUILTIN_ANALYZERS
+    from pypy.annotation.builtin import EXTERNAL_TYPE_ANALYZERS
+    from pypy.rpython import extregistry
+
+    """The most precise SomeValue instance that contains all
+    objects of type t."""
+    assert isinstance(t, (type, types.ClassType))
+    if t is bool:
+        return SomeBool()
+    elif t is int:
+        return SomeInteger()
+    elif issubclass(t, str): # py.lib uses annotated str subclasses
+        return SomeString()
+    elif t is float:
+        return SomeFloat()
+    elif t is list:
+        return SomeList(MOST_GENERAL_LISTDEF)
+    elif t is dict:
+        return SomeDict(MOST_GENERAL_DICTDEF)
+    # can't do tuple
+    elif t is types.NoneType:
+        return s_None
+    elif t in EXTERNAL_TYPE_ANALYZERS:
+        return SomeExternalObject(t)
+    elif bookkeeper and extregistry.is_registered_type(t, bookkeeper.policy):
+        entry = extregistry.lookup_type(t, bookkeeper.policy)
+        return entry.compute_annotation_bk(bookkeeper)
+    elif bookkeeper and t.__module__ != '__builtin__' and t not in bookkeeper.pbctypes:
+        classdef = bookkeeper.getuniqueclassdef(t)
+        return SomeInstance(classdef)
+    else:
+        o = SomeObject()
+        if t != object:
+            o.knowntype = t
+        return o
 
 class Sig(object):
 
@@ -10,6 +52,7 @@
     def __call__(self, funcdesc, inputcells):
         from pypy.rpython.lltypesystem import lltype
         args_s = []
+        from pypy.annotation import model as annmodel
         for i, argtype in enumerate(self.argtypes):
             if isinstance(argtype, (types.FunctionType, types.MethodType)):
                 argtype = argtype(*inputcells)



More information about the Pypy-commit mailing list