[pypy-commit] pypy inline-dict-ops: add caching to interiorfielddescr

fijal noreply at buildbot.pypy.org
Fri Oct 21 07:22:05 CEST 2011


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: inline-dict-ops
Changeset: r48294:5c8426aeee4f
Date: 2011-10-21 07:20 +0200
http://bitbucket.org/pypy/pypy/changeset/5c8426aeee4f/

Log:	add caching to interiorfielddescr

diff --git a/pypy/jit/backend/llsupport/descr.py b/pypy/jit/backend/llsupport/descr.py
--- a/pypy/jit/backend/llsupport/descr.py
+++ b/pypy/jit/backend/llsupport/descr.py
@@ -20,6 +20,7 @@
         self._cache_field = {}
         self._cache_array = {}
         self._cache_call = {}
+        self._cache_interiorfield = {}
 
     def init_size_descr(self, STRUCT, sizedescr):
         assert isinstance(STRUCT, lltype.GcStruct)
@@ -240,6 +241,17 @@
                          NonGcPtrArrayNoLengthDescr, 'ArrayNoLength', 'get_item_size',
                          '_is_array_of_floats', '_is_item_signed')
 
+def get_interiorfield_descr(gc_ll_descr, ARRAY, FIELDTP, name):
+    cache = gc_ll_descr._cache_interiorfield
+    try:
+        return cache[(ARRAY, FIELDTP, name)]
+    except KeyError:
+        arraydescr = get_array_descr(gc_ll_descr, ARRAY)
+        fielddescr = get_field_descr(gc_ll_descr, FIELDTP, name)
+        descr = InteriorFieldDescr(arraydescr, fielddescr)
+        cache[(ARRAY, FIELDTP, name)] = descr
+        return descr
+
 def get_array_descr(gccache, ARRAY):
     cache = gccache._cache_array
     try:
diff --git a/pypy/jit/backend/llsupport/llmodel.py b/pypy/jit/backend/llsupport/llmodel.py
--- a/pypy/jit/backend/llsupport/llmodel.py
+++ b/pypy/jit/backend/llsupport/llmodel.py
@@ -11,7 +11,7 @@
 from pypy.jit.backend.llsupport.descr import (get_size_descr,
      get_field_descr, BaseFieldDescr, get_array_descr, BaseArrayDescr,
      get_call_descr, BaseIntCallDescr, GcPtrCallDescr, FloatCallDescr,
-     VoidCallDescr, InteriorFieldDescr)
+     VoidCallDescr, InteriorFieldDescr, get_interiorfield_descr)
 from pypy.jit.backend.llsupport.asmmemmgr import AsmMemoryManager
 
 
@@ -236,9 +236,7 @@
         return get_array_descr(self.gc_ll_descr, A)
 
     def interiorfielddescrof(self, A, fieldname):
-        arraydescr = get_array_descr(self.gc_ll_descr, A)
-        fielddescr = get_field_descr(self.gc_ll_descr, A.OF, fieldname)
-        return InteriorFieldDescr(arraydescr, fielddescr)
+        return get_interiorfield_descr(self.gc_ll_descr, A, A.OF, fieldname)
 
     def unpack_arraydescr(self, arraydescr):
         assert isinstance(arraydescr, BaseArrayDescr)


More information about the pypy-commit mailing list