[pypy-svn] r58562 - pypy/branch/gc-experiments/pypy/rpython/memory/gc

fijal at codespeak.net fijal at codespeak.net
Thu Oct 2 12:36:12 CEST 2008


Author: fijal
Date: Thu Oct  2 12:36:12 2008
New Revision: 58562

Modified:
   pypy/branch/gc-experiments/pypy/rpython/memory/gc/markcompact.py
Log:
Bugfixes


Modified: pypy/branch/gc-experiments/pypy/rpython/memory/gc/markcompact.py
==============================================================================
--- pypy/branch/gc-experiments/pypy/rpython/memory/gc/markcompact.py	(original)
+++ pypy/branch/gc-experiments/pypy/rpython/memory/gc/markcompact.py	Thu Oct  2 12:36:12 2008
@@ -160,16 +160,19 @@
         self.markcompactcollect()
 
     def markcompactcollect(self, resizing=False):
+        llop.debug_print(lltype.Void, "Collecting")
         self.debug_check_consistency()
         if resizing:
             toaddr = self.tospace
         else:
             toaddr = llarena.arena_new_view(self.space)
         self.to_see = self.AddressStack()
+        self.mark_roots_recursively()
         if (self.objects_with_finalizers.non_empty() or
             self.run_finalizers.non_empty()):
             self.mark_objects_with_finalizers()
-        self.mark_roots_recursively()
+            self._trace_and_mark()
+        self.to_see.delete()
         finaladdr = self.update_forward_pointers(toaddr)
         if self.run_finalizers.non_empty():
             self.update_run_finalizers()
@@ -191,7 +194,14 @@
         while self.run_finalizers.non_empty():
             obj = self.run_finalizers.popleft()
             run_finalizers.append(self.get_forwarding_address(obj))
+        self.run_finalizers.delete()
         self.run_finalizers = run_finalizers
+        objects_with_finalizers = self.AddressDeque()
+        while self.objects_with_finalizers.non_empty():
+            obj = self.objects_with_finalizers.popleft()
+            objects_with_finalizers.append(self.get_forwarding_address(obj))
+        self.objects_with_finalizers.delete()
+        self.objects_with_finalizers = objects_with_finalizers
 
     def get_type_id(self, addr):
         return self.header(addr).tid & TYPEID_MASK
@@ -201,10 +211,12 @@
             MarkCompactGC._mark_root_recursively,  # stack roots
             MarkCompactGC._mark_root_recursively,  # static in prebuilt non-gc structures
             MarkCompactGC._mark_root_recursively)  # static in prebuilt gc objects
+        self._trace_and_mark()
+
+    def _trace_and_mark(self):
         while self.to_see.non_empty():
             obj = self.to_see.pop()
             self.trace(obj, self._mark_obj, None)
-        self.to_see.delete()
 
     def _mark_obj(self, pointer, ignored):
         obj = pointer.address[0]



More information about the Pypy-commit mailing list