[pypy-svn] r69768 - pypy/branch/virtual-forcing/pypy/jit/backend/llgraph

arigo at codespeak.net arigo at codespeak.net
Mon Nov 30 15:10:46 CET 2009


Author: arigo
Date: Mon Nov 30 15:10:46 2009
New Revision: 69768

Modified:
   pypy/branch/virtual-forcing/pypy/jit/backend/llgraph/runner.py
Log:
Modernize the descr construction and caching.


Modified: pypy/branch/virtual-forcing/pypy/jit/backend/llgraph/runner.py
==============================================================================
--- pypy/branch/virtual-forcing/pypy/jit/backend/llgraph/runner.py	(original)
+++ pypy/branch/virtual-forcing/pypy/jit/backend/llgraph/runner.py	Mon Nov 30 15:10:46 2009
@@ -21,35 +21,16 @@
 
 
 class Descr(history.AbstractDescr):
-    name = None
-    ofs = -1
-    typeinfo = '?'
-    
-    def __init__(self, ofs, typeinfo='?', extrainfo=None):
+
+    def __init__(self, ofs, typeinfo, extrainfo=None, name=None):
         self.ofs = ofs
         self.typeinfo = typeinfo
         self.extrainfo = extrainfo
-        # Note: this class has a custom __eq__, so don't forget
-        # to fix it if you add more fields.
+        self.name = name
 
     def get_extra_info(self):
         return self.extrainfo
 
-    def __hash__(self):
-        return hash((self.ofs, self.typeinfo, self.extrainfo))
-
-    def __eq__(self, other):
-        if not isinstance(other, Descr):
-            return NotImplemented
-        return (self.ofs == other.ofs and self.typeinfo == other.typeinfo
-                and self.extrainfo == other.extrainfo)
-
-    def __ne__(self, other):
-        if not isinstance(other, Descr):
-            return NotImplemented
-        return (self.ofs != other.ofs or self.typeinfo != other.typeinfo
-                or self.extrainfo != other.extrainfo)
-
     def sort_key(self):
         return self.ofs
 
@@ -80,9 +61,12 @@
         raise TypeError("cannot use comparison on Descrs")
 
     def __repr__(self):
+        args = [repr(self.ofs), repr(self.typeinfo)]
         if self.name is not None:
-            return '<Descr %r, %r, %r>' % (self.ofs, self.typeinfo, self.name)
-        return '<Descr %r, %r>' % (self.ofs, self.typeinfo)
+            args.append(repr(self.name))
+        if self.extrainfo is not None:
+            args.append('E')
+        return '<Descr %r>' % (', '.join(args),)
 
 
 history.TreeLoop._compiled_version = lltype.nullptr(llimpl.COMPILEDLOOP.TO)
@@ -104,11 +88,21 @@
         llimpl._stats = self.stats
         llimpl._llinterp = LLInterpreter(self.rtyper)
         self._future_values = []
+        self._descrs = {}
 
     def _freeze_(self):
         assert self.translate_support_code
         return False
 
+    def getdescr(self, ofs, typeinfo='?', extrainfo=None, name=None):
+        key = (ofs, typeinfo, extrainfo, name)
+        try:
+            return self._descrs[key]
+        except KeyError:
+            descr = Descr(ofs, typeinfo, extrainfo, name)
+            self._descrs[key] = descr
+            return descr
+
     def set_class_sizes(self, class_sizes):
         self.class_sizes = class_sizes
         for vtable, size in class_sizes.items():
@@ -261,16 +255,9 @@
         return (self.cast_adr_to_int(llimpl.get_zero_division_error()),
                 llimpl.get_zero_division_error_value())
 
-    @staticmethod
-    def sizeof(S):
+    def sizeof(self, S):
         assert not isinstance(S, lltype.Ptr)
-        return Descr(symbolic.get_size(S))
-
-    @staticmethod
-    def numof(S):
-        return 4
-
-    ##addresssuffix = '4'
+        return self.getdescr(symbolic.get_size(S))
 
     def cast_adr_to_int(self, adr):
         return llimpl.cast_adr_to_int(self.memo_cast, adr)
@@ -291,18 +278,14 @@
         BaseCPU.__init__(self, *args, **kwds)
         self.fielddescrof_vtable = self.fielddescrof(rclass.OBJECT, 'typeptr')
         
-    @staticmethod
-    def fielddescrof(S, fieldname):
+    def fielddescrof(self, S, fieldname):
         ofs, size = symbolic.get_field_token(S, fieldname)
         token = history.getkind(getattr(S, fieldname))
-        res = Descr(ofs, token[0])
-        res.name = fieldname
-        return res
+        return self.getdescr(ofs, token[0], name=fieldname)
 
-    @staticmethod
-    def calldescrof(FUNC, ARGS, RESULT, extrainfo=None):
+    def calldescrof(self, FUNC, ARGS, RESULT, extrainfo=None):
         token = history.getkind(RESULT)
-        return Descr(0, token[0], extrainfo=extrainfo)
+        return self.getdescr(0, token[0], extrainfo=extrainfo)
 
     def get_exception(self):
         return self.cast_adr_to_int(llimpl.get_exception())
@@ -310,13 +293,12 @@
     def get_exc_value(self):
         return llimpl.get_exc_value()
 
-    @staticmethod
-    def arraydescrof(A):
+    def arraydescrof(self, A):
         assert isinstance(A, lltype.GcArray)
         assert A.OF != lltype.Void
         size = symbolic.get_size(A)
         token = history.getkind(A.OF)
-        return Descr(size, token[0])
+        return self.getdescr(size, token[0])
 
     # ---------- the backend-dependent operations ----------
 



More information about the Pypy-commit mailing list