Rev 174: Implement MemObjectCollection.tp_traverse. in http://bazaar.launchpad.net/~meliae-dev/meliae/trunk
John Arbash Meinel
john at arbash-meinel.com
Thu Jul 29 22:45:11 BST 2010
At http://bazaar.launchpad.net/~meliae-dev/meliae/trunk
------------------------------------------------------------
revno: 174
revision-id: john at arbash-meinel.com-20100729214449-t6giuurb1ukteb0a
parent: john at arbash-meinel.com-20100729213354-hilj24gphuriqdpx
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: trunk
timestamp: Thu 2010-07-29 16:44:49 -0500
message:
Implement MemObjectCollection.tp_traverse.
Note that this probably won't impact gc, because MemObjectCollection doesn't have
any 'object' members, and thus probably is not a gc object.
However, it does mean that Meliae should be able to get a more accurate representation
of how much total memory is being managed by that object.
-------------- next part --------------
=== modified file 'meliae/_loader.pyx'
--- a/meliae/_loader.pyx 2010-07-29 21:33:54 +0000
+++ b/meliae/_loader.pyx 2010-07-29 21:44:49 +0000
@@ -1126,3 +1126,26 @@
return ret
(<PyTypeObject*>_MemObjectProxy).tp_traverse = <traverseproc>_MemObjectProxy_traverse
+
+
+cdef int MemObjectCollection_traverse(MemObjectCollection self,
+ visitproc visit, void *arg) except -1:
+ """Implement a correct tp_traverse because we use hidden members.
+
+ Cython/Pyrex implement a tp_traverse, but it only handles 'object' members.
+ We use some private pointers to manage things, so we need a custom
+ tp_traverse to let everyone know about it.
+ """
+ cdef int ret
+ cdef int i
+ cdef _MemObject *cur
+
+ ret = 0
+ for i from 0 <= i <= self._table_mask:
+ cur = self._table[i]
+ if cur != NULL and cur != _dummy:
+ ret = _MemObject_traverse(cur, visit, arg)
+ if ret:
+ break
+ return ret
+(<PyTypeObject*>MemObjectCollection).tp_traverse = <traverseproc>MemObjectCollection_traverse
=== modified file 'meliae/tests/test__loader.py'
--- a/meliae/tests/test__loader.py 2010-07-29 21:33:54 +0000
+++ b/meliae/tests/test__loader.py 2010-07-29 21:44:49 +0000
@@ -239,6 +239,24 @@
del moc[1]
self.assertSizeOf(4+1024+8+2+3, moc, extra_size=3*4, has_gc=False)
+ def test_traverse_empty(self):
+ # With nothing present, we return no referents
+ moc = _loader.MemObjectCollection()
+ self.assertEqual([], _scanner.get_referents(moc))
+
+ def test_traverse_simple_item(self):
+ moc = _loader.MemObjectCollection()
+ moc.add(1234, 'foo', 100)
+ self.assertEqual([1234, 'foo', None], _scanner.get_referents(moc))
+
+ def test_traverse_multiple_and_parents_and_children(self):
+ moc = _loader.MemObjectCollection()
+ moc.add(1, 'foo', 100)
+ moc.add(2, 'bar', 200, children=[8, 9], parent_list=[10, 11],
+ value='test val')
+ self.assertEqual([1, 'foo', None, 2, 'bar', 'test val', 8, 9, 10, 11],
+ _scanner.get_referents(moc))
+
class Test_MemObjectProxy(tests.TestCase):
More information about the bazaar-commits
mailing list