[pypy-svn] r7286 - in pypy/trunk/src: goal pypy/annotation pypy/translator

arigo at codespeak.net arigo at codespeak.net
Tue Nov 16 15:00:05 CET 2004


Author: arigo
Date: Tue Nov 16 15:00:05 2004
New Revision: 7286

Modified:
   pypy/trunk/src/goal/translate_pypy.py
   pypy/trunk/src/pypy/annotation/binaryop.py
   pypy/trunk/src/pypy/annotation/builtin.py
   pypy/trunk/src/pypy/annotation/model.py
   pypy/trunk/src/pypy/translator/genc.py
Log:
- Added SomePrebuiltConstant annotation for pre-built global constant
  instances.
- isinstance() annotation support.
- enabled freezing the caches in translate_pypy.
- generate the name of well-known built-in types in genc.



Modified: pypy/trunk/src/goal/translate_pypy.py
==============================================================================
--- pypy/trunk/src/goal/translate_pypy.py	(original)
+++ pypy/trunk/src/goal/translate_pypy.py	Tue Nov 16 15:00:05 2004
@@ -23,7 +23,7 @@
     global t
     t = Translator(entry_point, verbose=True, simplifying=True)
     space = StdObjSpace()
-    #buildcache.buildcache(space) 
+    buildcache.buildcache(space) 
     a = t.annotate([annmodel.immutablevalue(space)])
     a.simplify()
 

Modified: pypy/trunk/src/pypy/annotation/binaryop.py
==============================================================================
--- pypy/trunk/src/pypy/annotation/binaryop.py	(original)
+++ pypy/trunk/src/pypy/annotation/binaryop.py	Tue Nov 16 15:00:05 2004
@@ -8,8 +8,10 @@
 from pypy.annotation.model import SomeTuple, SomeImpossibleValue
 from pypy.annotation.model import SomeInstance, SomeFunction, SomeMethod
 from pypy.annotation.model import SomeBuiltin, SomeIterator
+from pypy.annotation.model import SomePrebuiltConstant, immutablevalue
 from pypy.annotation.model import unionof, set, setunion, missing_operation
 from pypy.annotation.factory import generalize
+from pypy.objspace.flow.model import Constant
 
 
 # XXX unify this with ObjSpace.MethodTable
@@ -217,3 +219,26 @@
 class __extend__(pairtype(SomeObject, SomeImpossibleValue)):
     def union((obj1, imp2)):
         return obj1
+
+
+class __extend__(pairtype(SomePrebuiltConstant, SomePrebuiltConstant)):
+    def union((pbc1, pbc2)):
+        return SomePrebuiltConstant(setunion(pbc1.prebuiltinstances,
+                                             pbc2.prebuiltinstances))
+
+class __extend__(pairtype(SomePrebuiltConstant, SomeObject)):
+    def getitem((pbc1, obj2)):
+        # special case for SomePrebuiltConstants that are dictionaries
+        # (actually frozendicts)
+        possibleresults = []
+        for c_inst in pbc1.prebuiltinstances:
+            assert isinstance(c_inst, Constant)
+            inst = c_inst.value
+            if isinstance(inst, dict):
+                possibleresults += inst.values()
+            elif isinstance(inst, list):
+                possibleresults += inst   # maybe
+            else:
+                raise TypeError, "cannot getitem() from %r" % (inst,)
+        possibleresults = [immutablevalue(x) for x in possibleresults]
+        return unionof(*possibleresults)

Modified: pypy/trunk/src/pypy/annotation/builtin.py
==============================================================================
--- pypy/trunk/src/pypy/annotation/builtin.py	(original)
+++ pypy/trunk/src/pypy/annotation/builtin.py	Tue Nov 16 15:00:05 2004
@@ -2,7 +2,8 @@
 Built-in functions.
 """
 
-from pypy.annotation.model import SomeInteger, SomeObject, SomeChar
+from pypy.annotation.model import SomeInteger, SomeObject, SomeChar, SomeBool
+from pypy.annotation.model import immutablevalue
 from pypy.annotation.factory import ListFactory, getbookkeeper
 import pypy.objspace.std.restricted_int
 
@@ -30,6 +31,14 @@
 def builtin_chr(s_int):
     return SomeChar()
 
+def builtin_isinstance(s_obj, s_type):
+    # XXX simple case only
+    if s_type.is_constant():
+        typ = s_type.const
+        if issubclass(s_obj.knowntype, typ):
+            return immutablevalue(True)
+    return SomeBool()
+
 
 # collect all functions
 import __builtin__

Modified: pypy/trunk/src/pypy/annotation/model.py
==============================================================================
--- pypy/trunk/src/pypy/annotation/model.py	(original)
+++ pypy/trunk/src/pypy/annotation/model.py	Tue Nov 16 15:00:05 2004
@@ -29,7 +29,9 @@
 
 
 from types import ClassType, BuiltinFunctionType, FunctionType, MethodType
+from types import InstanceType
 from pypy.annotation.pairtype import pair, extendabletype
+from pypy.objspace.flow.model import Constant
 
 
 class SomeObject:
@@ -134,6 +136,14 @@
     def __init__(self, meths):
         self.meths = meths   # map {python_function: classdef}
 
+class SomePrebuiltConstant(SomeObject):
+    """Stands for a global user instance, built prior to the analysis,
+    or a set of such instances."""
+    def __init__(self, prebuiltinstances):
+        self.prebuiltinstances = prebuiltinstances  # set of Constants
+        self.knowntype = reduce(commonbase, [x.value.__class__
+                                             for x in prebuiltinstances])
+
 class SomeImpossibleValue(SomeObject):
     """The empty set.  Instances are placeholders for objects that
     will never show up at run-time, e.g. elements of an empty list."""
@@ -171,6 +181,8 @@
         result = SomeClass(x)
     elif isinstance(x, (FunctionType, MethodType)):
         result = SomeFunction({x: True})
+    elif hasattr(x, '__class__') and x.__class__.__module__ != '__builtin__':
+        result = SomePrebuiltConstant({Constant(x): True}) # pre-built instances
     else:
         result = SomeObject()
     result.const = x
@@ -218,6 +230,11 @@
         d[x] = True
     return d
 
+def commonbase(cls1, cls2):   # XXX single inheritance only  XXX hum
+    while not issubclass(cls1, cls2):
+        cls2, = [x for x in cls2.__bases__ if x is not object] or [object]
+    return cls2
+
 def missing_operation(cls, name):
     def default_op(*args):
         #print '* warning, no type available for %s(%s)' % (

Modified: pypy/trunk/src/pypy/translator/genc.py
==============================================================================
--- pypy/trunk/src/pypy/translator/genc.py	(original)
+++ pypy/trunk/src/pypy/translator/genc.py	Tue Nov 16 15:00:05 2004
@@ -157,9 +157,10 @@
         bases = [base for base in cls.__bases__ if base is not object]
         assert len(bases) <= 1, "%r needs multiple inheritance" % (cls,)
         if bases:
-            base = self.nameof(bases[0])
+            base = bases[0]
         else:
-            base = '(PyObject*) &PyBaseObject_Type'
+            base = object
+        base = self.nameof(base)
         def initclassobj():
             content = cls.__dict__.items()
             content.sort()
@@ -180,9 +181,22 @@
 
     nameof_class = nameof_classobj   # for Python 2.2
 
+    typename_mapping = {
+        object: 'PyBaseObject_Type',
+        int:    'PyInt_Type',
+        long:   'PyLong_Type',
+        bool:   'PyBool_Type',
+        list:   'PyList_Type',
+        tuple:  'PyTuple_Type',
+        dict:   'PyDict_Type',
+        str:    'PyString_Type',
+        }
+
     def nameof_type(self, cls):
+        if cls in self.typename_mapping:
+            return '(PyObject*) &%s' % self.typename_mapping[cls]
         assert hasattr(cls, '__weakref__'), (
-            "%r is not a user-defined class" % (cls,))
+            "built-in class %r not found in typename_mapping" % (cls,))
         return self.nameof_classobj(cls)
 
     def nameof_tuple(self, tup):



More information about the Pypy-commit mailing list