Author: Maciej Fijalkowski <fij...@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) _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit