[pypy-svn] r76825 - pypy/trunk/pypy/translator/c

arigo at codespeak.net arigo at codespeak.net
Wed Sep 1 20:07:18 CEST 2010


Author: arigo
Date: Wed Sep  1 20:07:14 2010
New Revision: 76825

Modified:
   pypy/trunk/pypy/translator/c/database.py
   pypy/trunk/pypy/translator/c/gc.py
   pypy/trunk/pypy/translator/c/node.py
Log:
Move around the time at which string attributes are computed:

* on the DefNodes, compute them once and cache them, instead of
  recomputing every time someone asks.  Avoids ending up with
  tons of copies of the same string in the process.

* on the ContainerNodes, do the exact opposite: instead of caching
  'ptrname', compute it whenever asked, because it will typically
  be used to build some larger string sent to C and then forgotten.


Modified: pypy/trunk/pypy/translator/c/database.py
==============================================================================
--- pypy/trunk/pypy/translator/c/database.py	(original)
+++ pypy/trunk/pypy/translator/c/database.py	Wed Sep  1 20:07:14 2010
@@ -213,7 +213,7 @@
                         forcename = self.idelayedfunctionnames[obj][0]
                         node = self.getcontainernode(container,
                                                      forcename=forcename)
-                        assert node.ptrname == forcename
+                        assert node.getptrname() == forcename
                         return forcename
                     # /hack hack hack
 
@@ -222,7 +222,7 @@
                     return '((%s) %d)' % (cdecl(self.gettype(T), ''),
                                           obj._obj)
                 node = self.getcontainernode(container)
-                return node.ptrname
+                return node.getptrname()
             else:
                 return '((%s) NULL)' % (cdecl(self.gettype(T), ''), )
         else:

Modified: pypy/trunk/pypy/translator/c/gc.py
==============================================================================
--- pypy/trunk/pypy/translator/c/gc.py	(original)
+++ pypy/trunk/pypy/translator/c/gc.py	Wed Sep  1 20:07:14 2010
@@ -172,7 +172,9 @@
         defnode = db.gettypedefnode(obj.about)
         self.implementationtypename = 'void (@)(void *)'
         self.name = defnode.gcinfo.static_deallocator
-        self.ptrname = '((void (*)(void *)) %s)' % (self.name,)
+
+    def getptrname(self):
+        return '((void (*)(void *)) %s)' % (self.name,)
 
     def enum_dependencies(self):
         return []
@@ -266,7 +268,9 @@
         defnode = db.gettypedefnode(obj.about)
         self.implementationtypename = self.typename
         self.name = self.db.namespace.uniquename('g_rtti_v_'+ defnode.barename)
-        self.ptrname = '(&%s)' % (self.name,)
+
+    def getptrname(self):
+        return '(&%s)' % (self.name,)
 
     def enum_dependencies(self):
         return []

Modified: pypy/trunk/pypy/translator/c/node.py
==============================================================================
--- pypy/trunk/pypy/translator/c/node.py	(original)
+++ pypy/trunk/pypy/translator/c/node.py	Wed Sep  1 20:07:14 2010
@@ -77,6 +77,8 @@
             if db.gcpolicy.need_no_typeptr():
                 assert self.fieldnames == ('typeptr',)
                 self.fieldnames = ()
+        #
+        self.fulltypename = '%s %s @' % (self.typetag, self.name)
 
     def setup(self):
         # this computes self.fields
@@ -119,7 +121,7 @@
     gcinfo = defaultproperty(computegcinfo)
 
     def gettype(self):
-        return '%s %s @' % (self.typetag, self.name)
+        return self.fulltypename
 
     def c_struct_field_name(self, name):
         # occasionally overridden in __init__():
@@ -211,6 +213,8 @@
          self.name) = db.namespace.uniquename(basename, with_number=with_number,
                                               bare=True)
         self.dependencies = {}
+        self.fulltypename =  '%s %s @' % (self.typetag, self.name)
+        self.fullptrtypename = '%s %s *@' % (self.typetag, self.name)
 
     def setup(self):
         if hasattr(self, 'itemtypename'):
@@ -236,10 +240,10 @@
     gcinfo = defaultproperty(computegcinfo)
 
     def gettype(self):
-        return '%s %s @' % (self.typetag, self.name)
+        return self.fulltypename
 
     def getptrtype(self):
-        return '%s %s *@' % (self.typetag, self.name)
+        return self.fullptrtypename
 
     def access_expr(self, baseexpr, index):
         return '%s.items[%s]' % (baseexpr, index)
@@ -336,16 +340,19 @@
         if ARRAY._hints.get("render_as_void"):
             contained_type = Void
         self.itemtypename = db.gettype(contained_type, who_asks=self)
+        self.fulltypename = self.itemtypename.replace('@', '(@)[%d]' %
+                                                      (self.varlength,))
+        self.fullptrtypename = self.itemtypename.replace('@', '*@')
 
     def setup(self):
         """Array loops are forbidden by ForwardReference.become() because
         there is no way to declare them in C."""
 
     def gettype(self):
-        return self.itemtypename.replace('@', '(@)[%d]' % (self.varlength,))
+        return self.fulltypename
 
     def getptrtype(self):
-        return self.itemtypename.replace('@', '*@')
+        return self.fullptrtypename
 
     def access_expr(self, baseexpr, index):
         return '%s[%d]' % (baseexpr, index)
@@ -383,17 +390,19 @@
         self.LLTYPE = FIXEDARRAY
         self.dependencies = {}
         self.itemtypename = db.gettype(FIXEDARRAY.OF, who_asks=self)
+        self.fulltypename = self.itemtypename.replace('@', '(@)[%d]' %
+                                                      FIXEDARRAY.length)
+        self.fullptrtypename = self.itemtypename.replace('@', '*@')
 
     def setup(self):
         """Loops are forbidden by ForwardReference.become() because
         there is no way to declare them in C."""
 
     def gettype(self):
-        FIXEDARRAY = self.FIXEDARRAY
-        return self.itemtypename.replace('@', '(@)[%d]' % FIXEDARRAY.length)
+        return self.fulltypename
 
     def getptrtype(self):
-        return self.itemtypename.replace('@', '*@')
+        return self.fullptrtypename
 
     def access_expr(self, baseexpr, index, dummy=False):
         if not isinstance(index, int):
@@ -469,7 +478,7 @@
     if USESLOTS:      # keep the number of slots down!
         __slots__ = """db obj 
                        typename implementationtypename
-                        name ptrname
+                        name
                         globalcontainer""".split()
     eci_name = '_compilation_info'
 
@@ -494,7 +503,9 @@
         if self.typename != self.implementationtypename:
             if db.gettypedefnode(T).extra_union_for_varlength:
                 self.name += '.b'
-        self.ptrname = '(&%s)' % self.name
+
+    def getptrname(self):
+        return '(&%s)' % self.name
 
     def getTYPE(self):
         return typeOf(self.obj)
@@ -667,10 +678,10 @@
     if USESLOTS:
         __slots__ = ()
 
-    def __init__(self, db, T, obj):
-        ContainerNode.__init__(self, db, T, obj)
-        if barebonearray(T):
-            self.ptrname = self.name
+    def getptrname(self):
+        if barebonearray(self.getTYPE()):
+            return self.name
+        return ContainerNode.getptrname(self)
 
     def basename(self):
         return 'array'
@@ -728,10 +739,10 @@
     if USESLOTS:
         __slots__ = ()
 
-    def __init__(self, db, T, obj):
-        ContainerNode.__init__(self, db, T, obj)
-        if not isinstance(obj, _subarray):   # XXX hackish
-            self.ptrname = self.name
+    def getptrname(self):
+        if not isinstance(self.obj, _subarray):   # XXX hackish
+            return self.name
+        return ContainerNode.getptrname(self)
 
     def basename(self):
         T = self.getTYPE()
@@ -812,7 +823,9 @@
         self.make_funcgens()
         #self.dependencies = {}
         self.typename = db.gettype(T)  #, who_asks=self)
-        self.ptrname = self.name
+
+    def getptrname(self):
+        return self.name
 
     def make_funcgens(self):
         self.funcgens = select_function_code_generators(self.obj, self.db, self.name)
@@ -958,7 +971,7 @@
 
     def startupcode(self):
         T = self.getTYPE()
-        args = [self.ptrname]
+        args = [self.getptrname()]
         # XXX how to make this code more generic?
         if T.tag == 'ThreadLock':
             lock = self.obj.externalobj
@@ -990,13 +1003,15 @@
         self.obj = obj
         value = obj.value
         self.name = self._python_c_name(value)
-        self.ptrname = self.name
         self.exported_name = self.name
         # a list of expressions giving places where this constant PyObject
         # must be copied.  Normally just in the global variable of the same
         # name, but see also StructNode.initializationexpr()  :-(
         self.where_to_copy_me = []
 
+    def getptrname(self):
+        return self.name
+
     def _python_c_name(self, value):
         # just some minimal cases: None and builtin exceptions
         if value is None:



More information about the Pypy-commit mailing list