Rev 121: Add a __getitem__ helper, which should make it easier to walk around. in http://bazaar.launchpad.net/~meliae-dev/meliae/trunk

John Arbash Meinel john at arbash-meinel.com
Wed Dec 23 22:55:45 GMT 2009


At http://bazaar.launchpad.net/~meliae-dev/meliae/trunk

------------------------------------------------------------
revno: 121
revision-id: john at arbash-meinel.com-20091223225529-zee858e6tz84pvph
parent: john at arbash-meinel.com-20091223172239-54paa072jangsls3
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: trunk
timestamp: Wed 2009-12-23 16:55:29 -0600
message:
  Add a __getitem__ helper, which should make it easier to walk around.
-------------- next part --------------
=== modified file 'meliae/_loader.pyx'
--- a/meliae/_loader.pyx	2009-12-23 17:22:39 +0000
+++ b/meliae/_loader.pyx	2009-12-23 22:55:29 +0000
@@ -25,6 +25,8 @@
     int PyDict_SetItem(object d, object key, object val) except -1
     void Py_INCREF(PyObject*)
     void Py_DECREF(PyObject*)
+    object PyTuple_New(Py_ssize_t)
+    object PyTuple_SET_ITEM(object, Py_ssize_t, object)
 
 
 ctypedef struct RefList:
@@ -67,7 +69,7 @@
     """
     cdef long i
     # TODO: Always return a tuple, we already know the width, and this prevents
-    #       double malloc()
+    #       double malloc(). However, this probably isn't a critical code path
 
     if ref_list == NULL:
         return ()
@@ -267,6 +269,19 @@
                    name_str, self.size, num_refs, ref_space, ref_str,
                    referrer_str, value_str, total_size_str))
 
+    def __getitem__(self, offset):
+        cdef long off
+        cdef PyObject *res
+
+        if self._ref_list == NULL:
+            raise IndexError('%s has no refs' % (self,))
+        off = offset
+        if off >= self._ref_list.size:
+            raise IndexError('%s has only %d refs'
+                             % (self, self._ref_list.size))
+        res = self._ref_list.refs[off]
+        return <object>res
+
     def _intern_from_cache(self, cache):
         self.address = _set_default(cache, self.address)
         self.type_str = _set_default(cache, self.type_str)

=== modified file 'meliae/tests/test__loader.py'
--- a/meliae/tests/test__loader.py	2009-10-17 01:41:49 +0000
+++ b/meliae/tests/test__loader.py	2009-12-23 22:55:29 +0000
@@ -46,6 +46,17 @@
         mem = _loader.MemObject(1234, 'tuple', 12, [])
         self.assertEqual(0, mem.num_refs)
 
+    def test__getitem__(self):
+        mem = _loader.MemObject(1234, 'tuple', 12, [])
+        def get(offset):
+            return mem[offset]
+        self.assertRaises(IndexError, get, 0)
+        self.assertRaises(IndexError, get, 1)
+        self.assertRaises(IndexError, get, -1)
+        mem = _loader.MemObject(1234, 'tuple', 20, [4567, 8901])
+        self.assertEqual(4567, mem[0])
+        self.assertEqual(8901, mem[1])
+
     def test_num_referrers(self):
         mem = _loader.MemObject(1234, 'tuple', 20, [4567, 8901])
         mem.referrers = ()



More information about the bazaar-commits mailing list