Rev 125: Implement __delitem__. in http://bazaar.launchpad.net/~jameinel/meliae/mem-object-collection
John Arbash Meinel
john at arbash-meinel.com
Thu Dec 24 12:03:04 GMT 2009
At http://bazaar.launchpad.net/~jameinel/meliae/mem-object-collection
------------------------------------------------------------
revno: 125
revision-id: john at arbash-meinel.com-20091224120246-qsyy8i0bil8ng920
parent: john at arbash-meinel.com-20091224052116-q568ek1c9qgthyx2
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: mem-object-collection
timestamp: Thu 2009-12-24 06:02:46 -0600
message:
Implement __delitem__.
Before we get much further, I'm probably going to switch to external storage.
The main issue is the waste of having empty _MemObject slots.
-------------- next part --------------
=== modified file 'meliae/_loader.pyx'
--- a/meliae/_loader.pyx 2009-12-24 05:21:16 +0000
+++ b/meliae/_loader.pyx 2009-12-24 12:02:46 +0000
@@ -275,23 +275,21 @@
i = i + 1 + n_lookup
raise AssertionError('we failed to find an open slot')
- cdef _clear_slot(self, int offset):
- cdef _MemObject *cur
-
- cur = self._table + offset
- if cur.address == NULL: # Already cleared
+ cdef _clear_slot(self, _MemObject *slot):
+ if slot.address == NULL: # Already cleared
return
- Py_XDECREF(cur.address)
- Py_XDECREF(cur.type_str)
- cur.type_str = NULL
- _free_ref_list(cur.ref_list)
- cur.ref_list = NULL
- Py_XDECREF(cur.value)
- cur.value = NULL
- Py_XDECREF(cur.name)
- cur.name = NULL
- _free_ref_list(cur.referrer_list)
- cur.referrer_list = NULL
+ Py_XDECREF(slot.address)
+ slot.address = NULL
+ Py_XDECREF(slot.type_str)
+ slot.type_str = NULL
+ _free_ref_list(slot.ref_list)
+ slot.ref_list = NULL
+ Py_XDECREF(slot.value)
+ slot.value = NULL
+ Py_XDECREF(slot.name)
+ slot.name = NULL
+ _free_ref_list(slot.referrer_list)
+ slot.referrer_list = NULL
def _test_lookup(self, address):
cdef _MemObject *slot
@@ -307,16 +305,35 @@
return False
return True
- def __getitem__(self, address):
- cdef _MemObject *slot
-
- slot = self._lookup(address)
- if slot.address == NULL or slot.address == _dummy:
- raise KeyError('address %s not present' % (address,))
- return _MemObjectProxy(address, self)
-
- # def __delitem__(self, address):
- # pass
+ def __getitem__(self, at):
+ cdef _MemObject *slot
+
+ if isinstance(at, _MemObjectProxy):
+ address = at.address
+ else:
+ address = at
+
+ slot = self._lookup(address)
+ if slot.address == NULL or slot.address == _dummy:
+ raise KeyError('address %s not present' % (at,))
+ if at is address:
+ return _MemObjectProxy(address, self)
+ return at
+
+ def __delitem__(self, at):
+ cdef _MemObject *slot
+
+ if isinstance(at, _MemObjectProxy):
+ address = at.address
+ else:
+ address = at
+
+ slot = self._lookup(address)
+ if slot.address == NULL or slot.address == _dummy:
+ raise KeyError('address %s not present' % (at,))
+ self._clear_slot(slot)
+ slot.address = _dummy
+ # TODO: Shrink
#def __setitem__(self, address, value):
# """moc[address] = value"""
@@ -432,7 +449,7 @@
cdef long i
for i from 0 <= i < self._table_mask:
- self._clear_slot(i)
+ self._clear_slot(self._table + i)
PyMem_Free(self._table)
self._table = NULL
=== modified file 'meliae/tests/test__loader.py'
--- a/meliae/tests/test__loader.py 2009-12-24 05:21:16 +0000
+++ b/meliae/tests/test__loader.py 2009-12-24 12:02:46 +0000
@@ -170,6 +170,27 @@
self.assertEqual('foo', mop.type_str)
self.assertEqual(100, mop.size)
self.assertRaises(KeyError, get, 1024)
+ self.assertTrue(mop is moc[mop])
+
+ def test__delitem__(self):
+ moc = _loader.MemObjectCollection()
+ def get(offset):
+ return moc[offset]
+ def delete(offset):
+ del moc[offset]
+ self.assertRaises(KeyError, delete, 0)
+ self.assertRaises(KeyError, delete, 1024)
+ moc.add(0, 'foo', 100)
+ self.assertTrue(0 in moc)
+ self.assertFalse(1024 in moc)
+ self.assertRaises(KeyError, delete, 1024)
+ moc.add(1024, 'bar', 200)
+ del moc[0]
+ self.assertFalse(0 in moc)
+ self.assertRaises(KeyError, get, 0)
+ mop = moc[1024]
+ del moc[mop]
+ self.assertRaises(KeyError, get, 1024)
def test_add_until_resize(self):
moc = _loader.MemObjectCollection()
More information about the bazaar-commits
mailing list