Source code for envi.pagelookup

'''
A home for the page lookup construct.  Basically it is a
python object which implements a similar lookup mechanism
to the i386 page table lookups...
'''

# FIXME move functions in here too so there is procedural "speed" way
# and objecty pythonic way...

[docs]class PageLookup: ''' An object capable of rapid lookups across a sparse address space which will also NOT eat *all* the RAMS like a straight dictionary full of millions of entries would. ''' def __init__(self): self._page_dict = {}
[docs] def getPageLookup(self, va): base = va >> 16 offs = va & 0xffff page = self._page_dict.get(base) if page == None: return None return page[offs]
[docs] def setPageLookup(self, va, size, obj): vamax = va+size while va < vamax: base = va >> 16 offs = va & 0xffff page = self._page_dict.get(base) if page == None: page = [None] * 0xffff self._page_dict[base] = page page[offs] = obj va += 1 # __getitem__ # __getslice__ # __setslice__
[docs]class MapLookup: ''' A specialized lookup object for large densely populated ranges which are layed out in a sparse field space themselves... ''' def __init__(self): self._maps_list = []
[docs] def initMapLookup(self, va, size, obj=None): marray = [obj] * size # FIXME optimize by size! self._maps_list.append((va, va+size, marray))
[docs] def setMapLookup(self, va, size, obj): for mva, mvamax, marray in self._maps_list: if va >= mva and va < mvamax: off = va - mva s = [obj] * size marray[off:off+size] = s return raise Exception('Address (0x%.8x) not in maps!' % va)
[docs] def getMapLookup(self, va): for mva, mvamax, marray in self._maps_list: if va >= mva and va < mvamax: off = va - mva return marray[off] return None
def __getslice__(self, start, end): print 'GET SLICE'