[pypy-svn] pypy default: * improve wrap_oserror() and add tests.

arigo commits-noreply at bitbucket.org
Mon Jan 31 11:51:47 CET 2011


Author: Armin Rigo <arigo at tunes.org>
Branch: 
Changeset: r41494:3235b5694920
Date: 2011-01-31 11:51 +0100
http://bitbucket.org/pypy/pypy/changeset/3235b5694920/

Log:	* improve wrap_oserror() and add tests.

	* make mmap.error a subclass of EnvironmentError, instead of equal
	to EnvironmentError.

diff --git a/pypy/interpreter/error.py b/pypy/interpreter/error.py
--- a/pypy/interpreter/error.py
+++ b/pypy/interpreter/error.py
@@ -375,7 +375,10 @@
         msg = os.strerror(errno)
     except ValueError:
         msg = 'error %d' % errno
-    exc = getattr(space, exception_name)
+    if isinstance(exception_name, str):
+        exc = getattr(space, exception_name)
+    else:
+        exc = exception_name
     if w_filename is not None:
         w_error = space.call_function(exc, space.wrap(errno),
                                       space.wrap(msg), w_filename)

diff --git a/pypy/module/mmap/interp_mmap.py b/pypy/module/mmap/interp_mmap.py
--- a/pypy/module/mmap/interp_mmap.py
+++ b/pypy/module/mmap/interp_mmap.py
@@ -57,8 +57,7 @@
         try:
             return self.space.wrap(self.mmap.file_size())
         except OSError, e:
-            raise wrap_oserror(self.space, e,
-                               exception_name='w_EnvironmentError')
+            raise mmap_error(self.space, e)
     descr_size.unwrap_spec = ['self']
     
     def write(self, data):
@@ -88,8 +87,7 @@
             raise OperationError(self.space.w_ValueError,
                                  self.space.wrap(v.message))
         except OSError, e:
-            raise wrap_oserror(self.space, e,
-                               exception_name='w_EnvironmentError')
+            raise mmap_error(self.space, e)
     flush.unwrap_spec = ['self', int, int]
     
     def move(self, dest, src, count):
@@ -106,8 +104,7 @@
         try:
             self.mmap.resize(newsize)
         except OSError, e:
-            raise wrap_oserror(self.space, e,
-                               exception_name='w_EnvironmentError')
+            raise mmap_error(self.space, e)
     resize.unwrap_spec = ['self', int]
     
     def __len__(self):
@@ -194,7 +191,7 @@
             W_MMap.__init__(self, space,
                             rmmap.mmap(fileno, length, flags, prot, access))
         except OSError, e:
-            raise wrap_oserror(space, e, exception_name='w_EnvironmentError')
+            raise mmap_error(space, e)
         except RValueError, e:
             raise OperationError(space.w_ValueError, space.wrap(e.message))
         except RTypeError, e:
@@ -211,7 +208,7 @@
             W_MMap.__init__(self, space,
                             rmmap.mmap(fileno, length, tagname, access))
         except OSError, e:
-            raise wrap_oserror(space, e, exception_name='w_EnvironmentError')
+            raise mmap_error(space, e)
         except RValueError, e:
             raise OperationError(space.w_ValueError, space.wrap(e.message))
         except RTypeError, e:
@@ -245,3 +242,8 @@
 constants = rmmap.constants
 PAGESIZE = rmmap.PAGESIZE
 ALLOCATIONGRANULARITY = rmmap.ALLOCATIONGRANULARITY
+
+def mmap_error(space, e):
+    w_module = space.getbuiltinmodule('mmap')
+    w_error = space.getattr(w_module, space.wrap('error'))
+    return wrap_oserror(space, e, exception_name=w_error)

diff --git a/pypy/module/mmap/test/test_mmap.py b/pypy/module/mmap/test/test_mmap.py
--- a/pypy/module/mmap/test/test_mmap.py
+++ b/pypy/module/mmap/test/test_mmap.py
@@ -30,9 +30,11 @@
             assert isinstance(mmap.PROT_EXEC, int)
             assert isinstance(mmap.PROT_READ, int)
             assert isinstance(mmap.PROT_WRITE, int)
-        
-        assert mmap.error is EnvironmentError
-            
+
+        assert 'mmap.error' in str(mmap.error)
+        assert mmap.error is not EnvironmentError
+        assert issubclass(mmap.error, EnvironmentError)
+
     def test_args(self):
         from mmap import mmap
         import os

diff --git a/pypy/interpreter/test/test_error.py b/pypy/interpreter/test/test_error.py
--- a/pypy/interpreter/test/test_error.py
+++ b/pypy/interpreter/test/test_error.py
@@ -1,6 +1,7 @@
-import py
+import py, os, errno
 from pypy.interpreter.error import OperationError, operationerrfmt
 from pypy.interpreter.error import decompose_valuefmt, get_operrcls2
+from pypy.interpreter.error import wrap_oserror
 
 
 def test_decompose_valuefmt():
@@ -39,3 +40,37 @@
     operr = OperationError(space.w_ValueError, space.wrap("message"))
     assert operr.errorstr(space) == "ValueError: message"
     assert operr.errorstr(space, use_repr=True) == "ValueError: 'message'"
+
+def test_wrap_oserror():
+    class FakeSpace:
+        w_OSError = [OSError]
+        w_EnvironmentError = [EnvironmentError]
+        def wrap(self, obj):
+            return [obj]
+        def call_function(self, exc, w_errno, w_msg, w_filename=None):
+            return (exc, w_errno, w_msg, w_filename)
+    space = FakeSpace()
+    #
+    e = wrap_oserror(space, OSError(errno.EBADF, "foobar"))
+    assert isinstance(e, OperationError)
+    assert e.w_type == [OSError]
+    assert e.get_w_value(space) == ([OSError], [errno.EBADF],
+                                    [os.strerror(errno.EBADF)], None)
+    #
+    e = wrap_oserror(space, OSError(errno.EBADF, "foobar"),
+                     filename = "test.py",
+                     exception_name = "w_EnvironmentError")
+    assert isinstance(e, OperationError)
+    assert e.w_type == [EnvironmentError]
+    assert e.get_w_value(space) == ([EnvironmentError], [errno.EBADF],
+                                    [os.strerror(errno.EBADF)],
+                                    ["test.py"])
+    #
+    e = wrap_oserror(space, OSError(errno.EBADF, "foobar"),
+                     filename = "test.py",
+                     exception_name = [SystemError])
+    assert isinstance(e, OperationError)
+    assert e.w_type == [SystemError]
+    assert e.get_w_value(space) == ([SystemError], [errno.EBADF],
+                                    [os.strerror(errno.EBADF)],
+                                    ["test.py"])

diff --git a/pypy/module/mmap/app_mmap.py b/pypy/module/mmap/app_mmap.py
--- a/pypy/module/mmap/app_mmap.py
+++ b/pypy/module/mmap/app_mmap.py
@@ -2,4 +2,5 @@
 ACCESS_WRITE = 2
 ACCESS_COPY = 3
 
-error = EnvironmentError
+class error(EnvironmentError):
+    pass


More information about the Pypy-commit mailing list