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