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