[pypy-commit] pypy gc-del: Fix

arigo noreply at buildbot.pypy.org
Fri Apr 26 14:24:14 CEST 2013


Author: Armin Rigo <arigo at tunes.org>
Branch: gc-del
Changeset: r63638:00e1300152fb
Date: 2013-04-26 14:22 +0200
http://bitbucket.org/pypy/pypy/changeset/00e1300152fb/

Log:	Fix

diff --git a/pypy/interpreter/test/test_typedef.py b/pypy/interpreter/test/test_typedef.py
--- a/pypy/interpreter/test/test_typedef.py
+++ b/pypy/interpreter/test/test_typedef.py
@@ -177,15 +177,17 @@
         class W_Level1(W_Root):
             def __init__(self, space1):
                 assert space1 is space
-            def __del__(self):
+                self.register_finalizer()
+            def invoke_finalizer(self):
                 space.call_method(w_seen, 'append', space.wrap(1))
         class W_Level2(W_Root):
             def __init__(self, space1):
                 assert space1 is space
-            def __del__(self):
-                self.enqueue_for_destruction(space, W_Level2.destructormeth,
-                                             'FOO ')
-            def destructormeth(self):
+                self.register_finalizer()
+            def invoke_finalizer(self):
+                self.finalizer_perform(space, 'FOO', self.destructormeth, 42)
+            def destructormeth(self, forty_two):
+                assert forty_two == 42
                 space.call_method(w_seen, 'append', space.wrap(2))
         W_Level1.typedef = typedef.TypeDef(
             'level1',
diff --git a/pypy/interpreter/typedef.py b/pypy/interpreter/typedef.py
--- a/pypy/interpreter/typedef.py
+++ b/pypy/interpreter/typedef.py
@@ -223,6 +223,10 @@
 
     if "user" in features:     # generic feature needed by all subcls
 
+        super_invoke_finalizer = supercls.invoke_finalizer.im_func
+        if super_invoke_finalizer == W_Root.invoke_finalizer.im_func:
+            super_invoke_finalizer = lambda self: None
+
         class Proto(object):
             user_overridden_class = True
 
@@ -243,11 +247,11 @@
             def invoke_finalizer(self):
                 space = self.space
                 w_descr = space.lookup(self, '__del__')
-                if w_descr is None:
-                    return
-                self.finalizer_perform(self.space, "__del__ method of ",
-                                       space.get_and_call_function,
-                                       w_descr, self)
+                if w_descr is not None:
+                    self.finalizer_perform(self.space, "__del__ method of ",
+                                           space.get_and_call_function,
+                                           w_descr, self)
+                super_invoke_finalizer(self)
 
             def user_setup_slots(self, nslots):
                 assert nslots == 0


More information about the pypy-commit mailing list