[pypy-commit] pypy resource_warning: (florin, antocuni) Add resource warning test for file descriptors

florinpapa pypy.commits at gmail.com
Wed Apr 6 08:24:34 EDT 2016


Author: florinpapa
Branch: resource_warning
Changeset: r83539:d09f1ccc1094
Date: 2016-04-06 15:08 +0300
http://bitbucket.org/pypy/pypy/changeset/d09f1ccc1094/

Log:	(florin, antocuni) Add resource warning test for file descriptors

diff --git a/pypy/interpreter/baseobjspace.py b/pypy/interpreter/baseobjspace.py
--- a/pypy/interpreter/baseobjspace.py
+++ b/pypy/interpreter/baseobjspace.py
@@ -1740,6 +1740,13 @@
             _warnings.warn(msg, warningcls, stacklevel=stacklevel)
         """)
 
+    def resource_warning(self, msg):
+        w_msg = self.wrap(msg)
+        self.appexec([w_msg],
+                     """(msg):
+            import sys
+            print >> sys.stderr, msg
+        """)
 
 class AppExecCache(SpaceCache):
     def build(cache, source):
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
@@ -49,6 +49,10 @@
         # thread that runs __del__, so no race condition should be possible
         self.clear_all_weakrefs()
         if self.stream is not None:
+            if self.space.sys.resource_warning_enabled:
+                w_repr = self.space.repr(self)
+                str_repr = self.space.str_w(w_repr)
+                self.space.resource_warning("WARNING: unclosed file: " + str_repr)
             self.enqueue_for_destruction(self.space, W_File.destructor,
                                          'close() method of ')
 
diff --git a/pypy/module/_file/test/test_file.py b/pypy/module/_file/test/test_file.py
--- a/pypy/module/_file/test/test_file.py
+++ b/pypy/module/_file/test/test_file.py
@@ -254,6 +254,31 @@
         if '__pypy__' in sys.builtin_module_names:
             assert repr(self.temppath) in g.getvalue()
 
+    def test_resource_warning(self):
+        import os, gc, sys, cStringIO
+        if '__pypy__' not in sys.builtin_module_names:
+            skip("pypy specific test")
+        def fn():
+            f = self.file(self.temppath, 'w')
+            g = cStringIO.StringIO()
+            preverr = sys.stderr
+            try:
+                sys.stderr = g
+                del f
+                gc.collect() # force __del__ to be called
+            finally:
+                sys.stderr = preverr
+            return g.getvalue()
+
+        try:
+            sys.pypy_set_resource_warning(False)
+            assert fn() == ""
+            sys.pypy_set_resource_warning(True)
+            msg = fn()
+            assert msg.startswith("WARNING: unclosed file: <open file ")
+        finally:
+            sys.pypy_set_resource_warning(False)
+
     def test_truncate(self):
         f = self.file(self.temppath, "w")
         f.write("foo")
diff --git a/pypy/module/sys/__init__.py b/pypy/module/sys/__init__.py
--- a/pypy/module/sys/__init__.py
+++ b/pypy/module/sys/__init__.py
@@ -19,6 +19,7 @@
         self.defaultencoding = "ascii"
         self.filesystemencoding = None
         self.debug = True
+        self.resource_warning_enabled = False
 
     interpleveldefs = {
         '__name__'              : '(space.wrap("sys"))',
@@ -53,6 +54,7 @@
         '_current_frames'       : 'currentframes._current_frames',
         'setrecursionlimit'     : 'vm.setrecursionlimit',
         'getrecursionlimit'     : 'vm.getrecursionlimit',
+        'pypy_set_resource_warning' : 'vm.set_resource_warning',
         'setcheckinterval'      : 'vm.setcheckinterval',
         'getcheckinterval'      : 'vm.getcheckinterval',
         'exc_info'              : 'vm.exc_info',
diff --git a/pypy/module/sys/vm.py b/pypy/module/sys/vm.py
--- a/pypy/module/sys/vm.py
+++ b/pypy/module/sys/vm.py
@@ -64,6 +64,10 @@
     """
     return space.wrap(space.sys.recursionlimit)
 
+ at unwrap_spec(flag=bool)
+def set_resource_warning(space, flag):
+    space.sys.resource_warning_enabled = flag
+
 @unwrap_spec(interval=int)
 def setcheckinterval(space, interval):
     """Tell the Python interpreter to check for asynchronous events every


More information about the pypy-commit mailing list