Rev 132: Implement __getitem__ which returns objects from the collection. in http://bazaar.launchpad.net/~jameinel/meliae/mem-object-collection

John Arbash Meinel john at arbash-meinel.com
Mon Dec 28 04:25:42 GMT 2009


At http://bazaar.launchpad.net/~jameinel/meliae/mem-object-collection

------------------------------------------------------------
revno: 132
revision-id: john at arbash-meinel.com-20091228042527-or9tftzvy4g19q75
parent: john at arbash-meinel.com-20091228041337-3588e2grxelu0l3a
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: mem-object-collection
timestamp: Sun 2009-12-27 22:25:27 -0600
message:
  Implement __getitem__ which returns objects from the collection.
-------------- next part --------------
=== modified file 'meliae/_loader.pyx'
--- a/meliae/_loader.pyx	2009-12-28 04:13:37 +0000
+++ b/meliae/_loader.pyx	2009-12-28 04:25:27 +0000
@@ -235,6 +235,29 @@
             self._obj.type_str = <PyObject *>type_str
             Py_INCREF(self._obj.type_str)
 
+    property ref_list:
+        """The list of objects referenced by this object."""
+        def __get__(self):
+            self._ensure_obj()
+            return _ref_list_to_list(self._obj.ref_list)
+
+        def __set__(self, value):
+            self._ensure_obj()
+            _free_ref_list(self._obj.ref_list)
+            self._obj.ref_list = _list_to_ref_list(value)
+
+    def __getitem__(self, offset):
+        cdef long off
+        self._ensure_obj()
+
+        if self._obj.ref_list == NULL:
+            raise IndexError('%s has no references' % (self,))
+        off = offset
+        if off >= self._obj.ref_list.size:
+            raise IndexError('%s has only %d (not %d) references'
+                             % (self, self._obj.ref_list.size, offset))
+        return self.collection[<object>self._obj.ref_list.refs[off]]
+
     # def __getitem__(self, offset):
     #     cdef _MemObject *slot
     #     cdef PyObject *item_addr
@@ -242,11 +265,7 @@
 
     #     slot = self._get_obj()
     #     if slot.ref_list == NULL:
-    #         raise IndexError('%s has no references' % (self,))
     #     off = offset
-    #     if off >= slot.ref_list.size:
-    #         raise IndexError('%s has only %d (not %d) references'
-    #                          % (self, slot.ref_list.size, offset))
     #     item_addr = slot.ref_list.refs[off]
     #     return self.collection[<object>item_addr]
 

=== modified file 'meliae/tests/test__loader.py'
--- a/meliae/tests/test__loader.py	2009-12-28 04:13:37 +0000
+++ b/meliae/tests/test__loader.py	2009-12-28 04:25:27 +0000
@@ -260,3 +260,23 @@
         mop._intern_from_cache(cache)
         self.assertTrue(mop.address is addr)
         self.assertTrue(mop.type_str is t)
+
+    def test_ref_list(self):
+        mop = self.moc.add(1234567, 'type', 256, ref_list=[1, 2, 3])
+        self.assertEqual(3, len(mop))
+        self.assertEqual([1, 2, 3], mop.ref_list)
+        mop.ref_list = [87654321, 23456]
+        self.assertEqual([87654321, 23456], mop.ref_list)
+        self.assertEqual(2, len(mop))
+
+    def test__getitem__(self):
+        mop = self.moc.add(1234567, 'type', 256, ref_list=[0, 255])
+        self.assertEqual(2, len(mop))
+        self.assertEqual(2, len(list(mop)))
+        mop0 = mop[0]
+        mop255 = mop[1]
+        self.assertEqual([mop0, mop255], list(mop))
+        self.assertEqual(0, mop0.address)
+        self.assertEqual('foo', mop0.type_str)
+        self.assertEqual(255, mop255.address)
+        self.assertEqual('baz', mop255.type_str)



More information about the bazaar-commits mailing list