[pypy-svn] r52242 - pypy/branch/jit-refactoring/pypy/jit/rainbow

arigo at codespeak.net arigo at codespeak.net
Fri Mar 7 11:29:50 CET 2008


Author: arigo
Date: Fri Mar  7 11:29:49 2008
New Revision: 52242

Modified:
   pypy/branch/jit-refactoring/pypy/jit/rainbow/codewriter.py
   pypy/branch/jit-refactoring/pypy/jit/rainbow/interpreter.py
Log:
Share identical lists between JitCodes.


Modified: pypy/branch/jit-refactoring/pypy/jit/rainbow/codewriter.py
==============================================================================
--- pypy/branch/jit-refactoring/pypy/jit/rainbow/codewriter.py	(original)
+++ pypy/branch/jit-refactoring/pypy/jit/rainbow/codewriter.py	Fri Mar  7 11:29:49 2008
@@ -127,6 +127,14 @@
         self.num_global_mergepoints = 0
         self.ptr_to_jitcode = {}
         self.transformer = GraphTransformer(hannotator)
+        self._listcache = {}
+
+    def sharelist(self, name):
+        lst = getattr(self, name)
+        # 'lst' is typically a list of descs or low-level pointers.
+        # It's safer to compare its items by identity.
+        key = (name,) + tuple([id(x) for x in lst])
+        return self._listcache.setdefault(key, lst)
 
     def can_raise(self, op):
         return self.raise_analyzer.analyze(op)
@@ -207,23 +215,23 @@
         code = assemble_labelpos(labelpos, self.interpreter, *self.assembler)
         bytecode.__init__(graph.name,
                           code,
-                          self.constants,
-                          self.typekinds,
-                          self.redboxclasses,
-                          self.keydescs,
-                          self.structtypedescs,
-                          self.fielddescs,
-                          self.arrayfielddescs,
-                          self.interiordescs,
-                          self.exceptioninstances,
-                          self.oopspecdescs,
-                          self.promotiondescs,
-                          self.called_bytecodes,
+                          self.sharelist("constants"),
+                          self.sharelist("typekinds"),
+                          self.sharelist("redboxclasses"),
+                          self.sharelist("keydescs"),
+                          self.sharelist("structtypedescs"),
+                          self.sharelist("fielddescs"),
+                          self.sharelist("arrayfielddescs"),
+                          self.sharelist("interiordescs"),
+                          self.sharelist("exceptioninstances"),
+                          self.sharelist("oopspecdescs"),
+                          self.sharelist("promotiondescs"),
+                          self.sharelist("called_bytecodes"),
                           self.num_local_mergepoints,
                           self.graph_color,
-                          self.calldescs,
-                          self.metacalldescs,
-                          self.indirectcalldescs,
+                          self.sharelist("calldescs"),
+                          self.sharelist("metacalldescs"),
+                          self.sharelist("indirectcalldescs"),
                           self.is_portal)
         bytecode._source = self.assembler
         bytecode._interpreter = self.interpreter

Modified: pypy/branch/jit-refactoring/pypy/jit/rainbow/interpreter.py
==============================================================================
--- pypy/branch/jit-refactoring/pypy/jit/rainbow/interpreter.py	(original)
+++ pypy/branch/jit-refactoring/pypy/jit/rainbow/interpreter.py	Fri Mar  7 11:29:49 2008
@@ -29,13 +29,9 @@
                  promotiondescs, called_bytecodes, num_mergepoints,
                  graph_color, calldescs, metacalldescs,
                  indirectcalldescs, is_portal):
-        # XXX quite a lot of lists of descs here...  We should at least
-        # try to share the empty lists between the numberous prebuilt
-        # JitCode instances.  A better approach memory-wise could be
-        # to have a single list of descs and use 'assert isinstance'
-        # checks; or move these lists to the Interpreter class and
-        # do something about the fact that some of these lists could
-        # then have more than 65536 items.
+        # XXX quite a lot of lists of descs here...  At least we
+        # share identical lists between the numberous prebuilt
+        # JitCode instances.
         self.name = name
         self.code = code
         self.constants = constants



More information about the Pypy-commit mailing list