Author: Armin Rigo <[email protected]>
Branch: use-gc-del-3
Changeset: r84221:a594bdb4f9aa
Date: 2016-05-05 17:45 +0200
http://bitbucket.org/pypy/pypy/changeset/a594bdb4f9aa/

Log:    Fix test_typedef, and fix W_File

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
@@ -186,35 +186,20 @@
         class W_Level1(W_Root):
             def __init__(self, space1):
                 assert space1 is space
-            def __del__(self):
+                self.register_finalizer(space)
+            def _finalize_(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):
-                space.call_method(w_seen, 'append', space.wrap(2))
         W_Level1.typedef = typedef.TypeDef(
             'level1',
             __new__ = typedef.generic_new_descr(W_Level1))
-        W_Level2.typedef = typedef.TypeDef(
-            'level2',
-            __new__ = typedef.generic_new_descr(W_Level2))
         #
         w_seen = space.newlist([])
         W_Level1(space)
         gc.collect(); gc.collect()
-        assert space.unwrap(w_seen) == [1]
-        #
-        w_seen = space.newlist([])
-        W_Level2(space)
-        gc.collect(); gc.collect()
         assert space.str_w(space.repr(w_seen)) == "[]"  # not called yet
         ec = space.getexecutioncontext()
         self.space.user_del_action.perform(ec, None)
-        assert space.unwrap(w_seen) == [2]
+        assert space.unwrap(w_seen) == [1]   # called by user_del_action
         #
         w_seen = space.newlist([])
         self.space.appexec([self.space.gettypeobject(W_Level1.typedef)],
@@ -236,29 +221,17 @@
             A4()
         """)
         gc.collect(); gc.collect()
-        assert space.unwrap(w_seen) == [4, 1]
+        assert space.unwrap(w_seen) == [4, 1]    # user __del__, and _finalize_
         #
         w_seen = space.newlist([])
-        self.space.appexec([self.space.gettypeobject(W_Level2.typedef)],
+        self.space.appexec([self.space.gettypeobject(W_Level1.typedef)],
         """(level2):
             class A5(level2):
                 pass
             A5()
         """)
         gc.collect(); gc.collect()
-        assert space.unwrap(w_seen) == [2]
-        #
-        w_seen = space.newlist([])
-        self.space.appexec([self.space.gettypeobject(W_Level2.typedef),
-                            w_seen],
-        """(level2, seen):
-            class A6(level2):
-                def __del__(self):
-                    seen.append(6)
-            A6()
-        """)
-        gc.collect(); gc.collect()
-        assert space.unwrap(w_seen) == [6, 2]
+        assert space.unwrap(w_seen) == [1]     # _finalize_ only
 
     def test_multiple_inheritance(self):
         class W_A(W_Root):
diff --git a/pypy/module/_file/interp_file.py b/pypy/module/_file/interp_file.py
--- a/pypy/module/_file/interp_file.py
+++ b/pypy/module/_file/interp_file.py
@@ -44,21 +44,16 @@
     def __init__(self, space):
         self.space = space
 
-    def __del__(self):
+    def _finalize_(self):
         # assume that the file and stream objects are only visible in the
-        # thread that runs __del__, so no race condition should be possible
-        self.clear_all_weakrefs()
+        # thread that runs _finalize_, so no race condition should be
+        # possible and no locking is done here.
         if self.stream is not None:
-            self.enqueue_for_destruction(self.space, W_File.destructor,
-                                         'close() method of ')
-
-    def destructor(self):
-        assert isinstance(self, W_File)
-        try:
-            self.direct_close()
-        except StreamErrors as e:
-            operr = wrap_streamerror(self.space, e, self.w_name)
-            raise operr
+            try:
+                self.direct_close()
+            except StreamErrors as e:
+                operr = wrap_streamerror(self.space, e, self.w_name)
+                raise operr
 
     def fdopenstream(self, stream, fd, mode, w_name=None):
         self.fd = fd
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to