[pypy-svn] r73722 - in pypy/trunk/pypy/module/_file: . test

fijal at codespeak.net fijal at codespeak.net
Tue Apr 13 22:45:06 CEST 2010


Author: fijal
Date: Tue Apr 13 22:45:04 2010
New Revision: 73722

Modified:
   pypy/trunk/pypy/module/_file/interp_file.py
   pypy/trunk/pypy/module/_file/interp_stream.py
   pypy/trunk/pypy/module/_file/test/test_file.py
Log:
Propagate name to exceptions


Modified: pypy/trunk/pypy/module/_file/interp_file.py
==============================================================================
--- pypy/trunk/pypy/module/_file/interp_file.py	(original)
+++ pypy/trunk/pypy/module/_file/interp_file.py	Tue Apr 13 22:45:04 2010
@@ -82,6 +82,7 @@
 
     def direct___init__(self, w_name, mode='r', buffering=-1):
         name = self.space.str_w(w_name)
+        self.name = name
         self.direct_close()
         self.check_mode_ok(mode)
         stream = streamio.open_file_as_stream(name, mode, buffering)
@@ -239,7 +240,7 @@
         try:
             self.direct_fdopen(fd, mode, buffering)
         except StreamErrors, e:
-            raise wrap_streamerror(self.space, e)
+            raise wrap_streamerror(self.space, e, self.name)
 
     _exposed_method_names = []
 
@@ -275,7 +276,7 @@
                     try:
                         result = self.direct_%(name)s(%(callsig)s)
                     except StreamErrors, e:
-                        raise wrap_streamerror(space, e)
+                        raise wrap_streamerror(space, e, self.name)
                 finally:
                     self.unlock()
                 return %(wrapresult)s

Modified: pypy/trunk/pypy/module/_file/interp_stream.py
==============================================================================
--- pypy/trunk/pypy/module/_file/interp_stream.py	(original)
+++ pypy/trunk/pypy/module/_file/interp_stream.py	Tue Apr 13 22:45:04 2010
@@ -10,16 +10,16 @@
 
 import os
 
-def wrap_streamerror(space, e):
+def wrap_streamerror(space, e, filename):
     if isinstance(e, streamio.StreamError):
         return OperationError(space.w_ValueError,
                               space.wrap(e.message))
     elif isinstance(e, OSError):
-        return wrap_oserror_as_ioerror(space, e)
+        return wrap_oserror_as_ioerror(space, e, filename)
     else:
         return OperationError(space.w_IOError, space.w_None)
 
-def wrap_oserror_as_ioerror(space, e):
+def wrap_oserror_as_ioerror(space, e, filename):
     assert isinstance(e, OSError)
     errno = e.errno
     try:
@@ -28,7 +28,8 @@
         msg = 'error %d' % errno
     w_error = space.call_function(space.w_IOError,
                                   space.wrap(errno),
-                                  space.wrap(msg))
+                                  space.wrap(msg),
+                                  space.wrap(filename))
     return OperationError(space.w_IOError, w_error)
 
 

Modified: pypy/trunk/pypy/module/_file/test/test_file.py
==============================================================================
--- pypy/trunk/pypy/module/_file/test/test_file.py	(original)
+++ pypy/trunk/pypy/module/_file/test/test_file.py	Tue Apr 13 22:45:04 2010
@@ -125,6 +125,13 @@
         assert type(res) is str
         f.close()
 
+    def test_oserror_has_filename(self):
+        try:
+            f = self.file("file that is clearly not there")
+        except IOError, e:
+            assert e.filename == 'file that is clearly not there'
+        else:
+            raise Exception("did not raise")
 
     def test_readline_mixed_with_read(self):
         s = '''From MAILER-DAEMON Wed Jan 14 14:42:30 2009



More information about the Pypy-commit mailing list