Rev 138: Implement MemoryObjectCollection.keys(), and MemObject.__len__ in http://bazaar.launchpad.net/~jameinel/meliae/mem-object-collection

John Arbash Meinel john at arbash-meinel.com
Mon Dec 28 05:19:24 GMT 2009


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

------------------------------------------------------------
revno: 138
revision-id: john at arbash-meinel.com-20091228051909-8ddq8xvm6r2eemx4
parent: john at arbash-meinel.com-20091228051505-rrc9gc603b7ijhpy
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: mem-object-collection
timestamp: Sun 2009-12-27 23:19:09 -0600
message:
  Implement MemoryObjectCollection.keys(), and MemObject.__len__
-------------- next part --------------
=== modified file 'meliae/_loader.pyx'
--- a/meliae/_loader.pyx	2009-12-28 05:15:05 +0000
+++ b/meliae/_loader.pyx	2009-12-28 05:19:09 +0000
@@ -577,6 +577,9 @@
         return self.iterkeys()
 
     def iterkeys(self):
+        return iter(self.keys())
+
+    def keys(self):
         cdef long i
         cdef _MemObject *cur
         cdef _MemObjectProxy proxy
@@ -589,7 +592,7 @@
             else:
                 address = <object>cur.address
                 values.append(address)
-        return iter(values)
+        return values
 
     def items(self):
         return self.iteritems()
@@ -705,6 +708,11 @@
                 return 0
             return self._ref_list.size
 
+    def __len__(self):
+        if self._ref_list == NULL:
+            return 0
+        return self._ref_list.size
+
     property referrers:
         """The list of objects that reference this object.
 

=== modified file 'meliae/loader.py'
--- a/meliae/loader.py	2009-12-28 05:06:17 +0000
+++ b/meliae/loader.py	2009-12-28 05:19:09 +0000
@@ -342,7 +342,7 @@
     def get_all(self, type_str):
         """Return all objects that match a given type."""
         all = [o for o in self.objs.itervalues() if o.type_str == type_str]
-        all.sort(key=lambda x:(x.size, x.num_refs, x.num_referrers),
+        all.sort(key=lambda x:(x.size, len(x), x.num_referrers),
                  reverse=True)
         return all
 
@@ -377,11 +377,11 @@
             if self.show_progress and item_idx & 0x5ff:
                 sys.stderr.write('checked %8d / %8d collapsed %8d    \r'
                                  % (item_idx, total, collapsed))
-            if obj.type_str == 'module' and obj.num_refs == 1:
+            if obj.type_str == 'module' and len(obj) == 1:
                 (dict_ref,) = obj.ref_list
                 extra_refs = []
             else:
-                if obj.num_refs != 2:
+                if len(obj) != 2:
                     continue
                 (dict_ref, type_ref) = obj.ref_list
                 type_obj = self.objs[type_ref]

=== modified file 'meliae/tests/test__loader.py'
--- a/meliae/tests/test__loader.py	2009-12-28 05:15:05 +0000
+++ b/meliae/tests/test__loader.py	2009-12-28 05:19:09 +0000
@@ -254,6 +254,17 @@
         self.assertEqual([(1024, 1024), (512, 512)],
                          [(k, v.address) for k,v in moc.iteritems()])
 
+    def test_keys(self):
+        moc = _loader.MemObjectCollection()
+        moc.add(0, 'bar', 100)
+        moc.add(1024, 'baz', 102)
+        moc.add(512, 'bing', 103)
+        keys = moc.keys()
+        self.assertTrue(isinstance(keys, list))
+        self.assertEqual([0, 1024, 512], keys)
+        del moc[0]
+        self.assertEqual([1024, 512], moc.keys())
+
     def test__iter__(self):
         moc = _loader.MemObjectCollection()
         moc.add(0, 'bar', 100)
@@ -261,6 +272,9 @@
         moc.add(512, 'bing', 103)
         self.assertEqual([0, 1024, 512], list(moc))
         self.assertEqual([0, 1024, 512], list(moc.iterkeys()))
+        del moc[0]
+        self.assertEqual([1024, 512], list(moc))
+        self.assertEqual([1024, 512], list(moc.iterkeys()))
 
 
 class Test_MemObjectProxy(tests.TestCase):



More information about the bazaar-commits mailing list