[pypy-commit] pypy gc-del: Next test.

arigo noreply at buildbot.pypy.org
Mon Mar 25 19:33:17 CET 2013


Author: Armin Rigo <arigo at tunes.org>
Branch: gc-del
Changeset: r62751:5082b68711e3
Date: 2013-03-25 19:33 +0100
http://bitbucket.org/pypy/pypy/changeset/5082b68711e3/

Log:	Next test.

diff --git a/rpython/memory/gc/minimark.py b/rpython/memory/gc/minimark.py
--- a/rpython/memory/gc/minimark.py
+++ b/rpython/memory/gc/minimark.py
@@ -573,10 +573,13 @@
 
 
     def collect(self, gen=1):
-        """Do a minor (gen=0) or major (gen>0) collection."""
-        self.minor_collection()
-        if gen > 0:
-            self.major_collection()
+        """Do a minor (gen=0) or major (gen>0) collection,
+        or merely executes pending finalizers (gen<0).
+        """
+        if gen >= 0:
+            self.minor_collection()
+            if gen > 0:
+                self.major_collection()
         self.execute_finalizers()
 
     def collect_and_reserve(self, totalsize):
diff --git a/rpython/memory/gcwrapper.py b/rpython/memory/gcwrapper.py
--- a/rpython/memory/gcwrapper.py
+++ b/rpython/memory/gcwrapper.py
@@ -245,7 +245,9 @@
         try:
             self.llinterp.eval_graph(finalizer.ptr._obj.graph, [obj],
                                      recursive=True)
-        except llinterp.LLException:
+        except llinterp.LLException, e:
+            if ''.join(e.args[0].name) == 'FinalizeLater\x00':
+                return False
             raise RuntimeError(
                 "a finalizer raised an exception, shouldn't happen")
         return True
diff --git a/rpython/memory/test/test_gc.py b/rpython/memory/test/test_gc.py
--- a/rpython/memory/test/test_gc.py
+++ b/rpython/memory/test/test_gc.py
@@ -262,6 +262,7 @@
                 b.nextid += 1
             def finalizer(self):
                 b.num_finalized += 1
+                debug_print("call to finalizer() number", b.num_finalized)
                 if (b.num_finalized % 3) == 0:
                     raise rgc.FinalizeLater
         def f(x):
@@ -271,6 +272,8 @@
             while i < x:
                 i += 1
                 a = A()
+                rgc.register_finalizer(a.finalizer)
+            a = None
             llop.gc__collect(lltype.Void)
             if b.num_finalized == 0:
                 llop.gc__collect(lltype.Void)
@@ -282,7 +285,6 @@
             rgc.progress_through_finalizer_queue()
             assert b.num_finalized == 8
         res = self.interpret(f, [5])
-        assert res == 606
 
     def test_custom_trace(self):
         from rpython.rtyper.annlowlevel import llhelper
diff --git a/rpython/rlib/rgc.py b/rpython/rlib/rgc.py
--- a/rpython/rlib/rgc.py
+++ b/rpython/rlib/rgc.py
@@ -377,6 +377,18 @@
         return hop.genop('gc_register_finalizer', [v_self, v_llfn],
                          resulttype=lltype.Void)
 
+class ProgressThroughFinalizerQueueEntry(ExtRegistryEntry):
+    _about_ = progress_through_finalizer_queue
+
+    def compute_result_annotation(self):
+        from rpython.annotator import model as annmodel
+        return annmodel.s_None
+
+    def specialize_call(self, hop):
+        hop.exception_cannot_occur()
+        args_v = [hop.inputconst(lltype.Signed, -1)]
+        return hop.genop('gc__collect', args_v, resulttype=hop.r_result)
+
 
 # ____________________________________________________________
 


More information about the pypy-commit mailing list