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