[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