[pypy-svn] r47393 - pypy/dist/pypy/rpython/memory

cfbolz at codespeak.net cfbolz at codespeak.net
Thu Oct 11 13:45:28 CEST 2007


Author: cfbolz
Date: Thu Oct 11 13:45:27 2007
New Revision: 47393

Modified:
   pypy/dist/pypy/rpython/memory/gc.py
Log:
refactor SemiSpace.collectinto a bunch of small methods. makes it easier to understand (and easier to profile).


Modified: pypy/dist/pypy/rpython/memory/gc.py
==============================================================================
--- pypy/dist/pypy/rpython/memory/gc.py	(original)
+++ pypy/dist/pypy/rpython/memory/gc.py	Thu Oct 11 13:45:27 2007
@@ -1091,57 +1091,16 @@
         self.fromspace = fromspace
         self.tospace = tospace
         self.top_of_space = tospace + self.space_size
-        roots = self.get_roots()
         scan = self.free = tospace
-        while 1:
-            root = roots.pop()
-            if root == NULL:
-                break
-            root.address[0] = self.copy(root.address[0])
-        free_non_gc_object(roots)
+        self.collect_roots()
         scan = self.scan_copied(scan)
-        # walk over list of objects that contain weakrefs
-        # if the object it references survives then update the weakref
-        # otherwise invalidate the weakref
-        new_with_weakref = self.AddressLinkedList()
-        while self.objects_with_weakrefs.non_empty():
-            obj = self.objects_with_weakrefs.pop()
-            if not self.is_forwarded(obj):
-                continue # weakref itself dies
-            obj = self.get_forwarding_address(obj)
-            offset = self.weakpointer_offset(self.header(obj).typeid)
-            pointing_to = (obj + offset).address[0]
-            if pointing_to:
-                if self.is_forwarded(pointing_to):
-                    (obj + offset).address[0] = self.get_forwarding_address(
-                        pointing_to)
-                    new_with_weakref.append(obj)
-                else:
-                    (obj + offset).address[0] = NULL
-        self.objects_with_weakrefs.delete()
-        self.objects_with_weakrefs = new_with_weakref
+        if self.objects_with_weakrefs.non_empty():
+            self.invalidate_weakrefs()
         if self.run_finalizers.non_empty():
-            # we are in an inner collection, caused by a finalizer
-            # the run_finalizers objects need to be copied
-            new_run_finalizer = self.AddressLinkedList()
-            while self.run_finalizers.non_empty():
-                obj = self.run_finalizers.pop()
-                new_run_finalizer.append(self.copy(obj))
-            self.run_finalizers.delete()
-            self.run_finalizers = new_run_finalizer
-        # walk over list of objects with finalizers
-        # if it is not copied, add it to the list of to-be-called finalizers
-        # and copy it, to me make the finalizer runnable
-        new_with_finalizer = self.AddressLinkedList()
-        while self.objects_with_finalizers.non_empty():
-            obj = self.objects_with_finalizers.pop()
-            if self.is_forwarded(obj):
-                new_with_finalizer.append(self.get_forwarding_address(obj))
-            else:
-                self.run_finalizers.append(self.copy(obj))
+            self.update_run_finalizers()
+        if self.objects_with_finalizers.non_empty():
+            self.deal_with_objects_with_finalizers()
         scan = self.scan_copied(scan)
-        self.objects_with_finalizers.delete()
-        self.objects_with_finalizers = new_with_finalizer
         if not size_changing:
             llarena.arena_reset(fromspace, self.space_size, True)
             self.execute_finalizers()
@@ -1153,6 +1112,15 @@
             scan += self.size_gc_header() + self.get_size(curr)
         return scan
 
+    def collect_roots(self):
+        roots = self.get_roots()
+        while 1:
+            root = roots.pop()
+            if root == NULL:
+                break
+            root.address[0] = self.copy(root.address[0])
+        free_non_gc_object(roots)
+
     def copy(self, obj):
         # Objects not living the GC heap have all been initialized by
         # setting their 'forw' address so that it points to themselves.
@@ -1234,6 +1202,52 @@
         hdr.forw = addr + self.gcheaderbuilder.size_gc_header
         hdr.typeid = typeid
 
+    def deal_with_objects_with_finalizers(self):
+        # walk over list of objects with finalizers
+        # if it is not copied, add it to the list of to-be-called finalizers
+        # and copy it, to me make the finalizer runnable
+        new_with_finalizer = self.AddressLinkedList()
+        while self.objects_with_finalizers.non_empty():
+            obj = self.objects_with_finalizers.pop()
+            if self.is_forwarded(obj):
+                new_with_finalizer.append(self.get_forwarding_address(obj))
+            else:
+                self.run_finalizers.append(self.copy(obj))
+        self.objects_with_finalizers.delete()
+        self.objects_with_finalizers = new_with_finalizer
+
+    def invalidate_weakrefs(self):
+        # walk over list of objects that contain weakrefs
+        # if the object it references survives then update the weakref
+        # otherwise invalidate the weakref
+        new_with_weakref = self.AddressLinkedList()
+        while self.objects_with_weakrefs.non_empty():
+            obj = self.objects_with_weakrefs.pop()
+            if not self.is_forwarded(obj):
+                continue # weakref itself dies
+            obj = self.get_forwarding_address(obj)
+            offset = self.weakpointer_offset(self.header(obj).typeid)
+            pointing_to = (obj + offset).address[0]
+            if pointing_to:
+                if self.is_forwarded(pointing_to):
+                    (obj + offset).address[0] = self.get_forwarding_address(
+                        pointing_to)
+                    new_with_weakref.append(obj)
+                else:
+                    (obj + offset).address[0] = NULL
+        self.objects_with_weakrefs.delete()
+        self.objects_with_weakrefs = new_with_weakref
+
+    def update_run_finalizers(self):
+        # we are in an inner collection, caused by a finalizer
+        # the run_finalizers objects need to be copied
+        new_run_finalizer = self.AddressLinkedList()
+        while self.run_finalizers.non_empty():
+            obj = self.run_finalizers.pop()
+            new_run_finalizer.append(self.copy(obj))
+        self.run_finalizers.delete()
+        self.run_finalizers = new_run_finalizer
+
     def execute_finalizers(self):
         if self.executing_finalizers:
             return    # the outer invocation of execute_finalizers() will do it



More information about the Pypy-commit mailing list