Author: Armin Rigo <[email protected]>
Branch: refactor-wrapped-del
Changeset: r45496:a91ad10bc67e
Date: 2011-07-11 23:03 +0200
http://bitbucket.org/pypy/pypy/changeset/a91ad10bc67e/

Log:    Use enqueue_for_destruction() in case close()ing the file fails. We
        cannot nicely report the error immediately, because we are in an
        RPython-level __del__.

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
@@ -33,6 +33,7 @@
     encoding = None
     errors   = None
     fd       = -1
+    streamerror_upon_closing = None
 
     newlines = 0     # Updated when the stream is closed
 
@@ -46,8 +47,14 @@
         try:
             self.direct_close()
         except StreamErrors, e:
-            operr = wrap_streamerror(self.space, e, self.w_name)
-            operr.write_unraisable(self.space, '__del__ of ', self)
+            self.streamerror_upon_closing = e
+            self.enqueue_for_destruction(self.space, W_File.report_streamerror,
+                                         'close() method of ')
+
+    def report_streamerror(self):
+        operr = wrap_streamerror(self.space, self.streamerror_upon_closing,
+                                 self.w_name)
+        raise operr
 
     def fdopenstream(self, stream, fd, mode, w_name=None):
         self.fd = fd
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to