Author: Armin Rigo <ar...@tunes.org>
Branch: gc-del
Changeset: r62762:559f98495630
Date: 2013-03-25 22:04 +0100
http://bitbucket.org/pypy/pypy/changeset/559f98495630/

Log:    Hack until test_newgc compiles.

diff --git a/rpython/rlib/clibffi.py b/rpython/rlib/clibffi.py
--- a/rpython/rlib/clibffi.py
+++ b/rpython/rlib/clibffi.py
@@ -646,8 +646,7 @@
 
     def __del__(self):
         if self.ll_args:
-            argnum = len(self.argtypes)
-            for i in range(argnum):
+            for i in range(self.argnum):
                 if self.ll_args[i]:
                     lltype.free(self.ll_args[i], flavor='raw')
             lltype.free(self.ll_args, flavor='raw')
diff --git a/rpython/translator/c/test/test_newgc.py 
b/rpython/translator/c/test/test_newgc.py
--- a/rpython/translator/c/test/test_newgc.py
+++ b/rpython/translator/c/test/test_newgc.py
@@ -44,7 +44,8 @@
         t = Translation(main, gc=cls.gcpolicy,
                         taggedpointers=cls.taggedpointers,
                         gcremovetypeptr=cls.removetypeptr)
-        t.disable(['backendopt'])
+        #t.disable(['backendopt']) -- XXX temporary maybe? needed for __del__
+        #                          --     that calls external C functions
         t.set_backend_extra_options(c_debug_defines=True)
         t.rtype()
         if option.view:
@@ -371,7 +372,7 @@
         res = self.run('framework_opaque')
         assert res == -70
 
-    def define_framework_finalizer(cls):
+    def define_framework_destructor(cls):
         class B(object):
             pass
         b = B()
@@ -384,11 +385,41 @@
             def __del__(self):
                 b.num_deleted += 1
         def f():
-            a = A()
+            A()
             i = 0
             while i < 5:
                 i += 1
-                a = A()
+                A()
+            llop.gc__collect(lltype.Void)
+            llop.gc__collect(lltype.Void)
+            return b.num_deleted
+        return f
+
+    def test_framework_destructor(self):
+        res = self.run('framework_destructor')
+        assert res == 6
+
+    def define_framework_finalizer(cls):
+        class B(object):
+            pass
+        b = B()
+        b.nextid = 0
+        b.num_deleted = 0
+        class A(object):
+            def __init__(self):
+                self.id = b.nextid
+                b.nextid += 1
+                rgc.register_finalizer(self.finalizer)
+            def finalizer(self):
+                b.num_deleted += 1
+                if b.num_deleted == 3:
+                    raise rgc.FinalizeLater
+        def f():
+            A()
+            i = 0
+            while i < 5:
+                i += 1
+                A()
             llop.gc__collect(lltype.Void)
             llop.gc__collect(lltype.Void)
             return b.num_deleted
@@ -441,6 +472,21 @@
     def test_del_raises(self):
         self.run('del_raises') # does not raise
 
+    def define_finalizer_raises(cls):
+        class B(object):
+            def finalizer(self):
+                raise TypeError
+        def func():
+            b = B()
+            rgc.register_finalizer(b.finalizer)
+            b = None
+            rgc.collect()
+            return 0
+        return func
+
+    def test_finalizer_raises(self):
+        self.run('finalizer_raises') # does not raise
+
     def define_custom_trace(cls):
         from rpython.rtyper.annlowlevel import llhelper
         #
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to