[Python-checkins] r86408 - in python/branches/pep-3151: Include/pyerrors.h Lib/test/exception_hierarchy.txt Lib/test/test_exceptions.py Lib/test/test_mmap.py Lib/test/test_pep3151.py Modules/_io/_iomodule.h Modules/mmapmodule.c Modules/selectmodule.c Modules/socketmodule.c Objects/exceptions.c Python/errors.c

antoine.pitrou python-checkins at python.org
Thu Nov 11 00:20:54 CET 2010


Author: antoine.pitrou
Date: Thu Nov 11 00:20:53 2010
New Revision: 86408
Log:
socket.error -> IOError
select.error -> IOError
mmap.error -> IOError
WindowsError -> IOError
VMSError -> IOError
OSError -> IOError
EnvironmentError -> IOError
Added:
 python/branches/pep-3151/Lib/test/test_pep3151.py
Modified:
 python/branches/pep-3151/Include/pyerrors.h
 python/branches/pep-3151/Lib/test/exception_hierarchy.txt
 python/branches/pep-3151/Lib/test/test_exceptions.py
 python/branches/pep-3151/Lib/test/test_mmap.py
 python/branches/pep-3151/Modules/_io/_iomodule.h
 python/branches/pep-3151/Modules/mmapmodule.c
 python/branches/pep-3151/Modules/selectmodule.c
 python/branches/pep-3151/Modules/socketmodule.c
 python/branches/pep-3151/Objects/exceptions.c
 python/branches/pep-3151/Python/errors.c
Modified: python/branches/pep-3151/Include/pyerrors.h
==============================================================================
--- python/branches/pep-3151/Include/pyerrors.h	(original)
+++ python/branches/pep-3151/Include/pyerrors.h	Thu Nov 11 00:20:53 2010
@@ -44,16 +44,15 @@
 PyObject *myerrno;
 PyObject *strerror;
 PyObject *filename;
-} PyEnvironmentErrorObject;
-
 #ifdef MS_WINDOWS
-typedef struct {
- PyException_HEAD
- PyObject *myerrno;
- PyObject *strerror;
- PyObject *filename;
 PyObject *winerror;
-} PyWindowsErrorObject;
+#endif
+} PyIOErrorObject;
+
+/* Compatibility typedefs */
+typedef PyIOErrorObject PyEnvironmentErrorObject;
+#ifdef MS_WINDOWS
+typedef PyIOErrorObject PyWindowsErrorObject;
 #endif
 
 /* Error handling definitions */
@@ -119,11 +118,10 @@
 
 PyAPI_DATA(PyObject *) PyExc_AssertionError;
 PyAPI_DATA(PyObject *) PyExc_AttributeError;
+PyAPI_DATA(PyObject *) PyExc_BufferError;
 PyAPI_DATA(PyObject *) PyExc_EOFError;
 PyAPI_DATA(PyObject *) PyExc_FloatingPointError;
-PyAPI_DATA(PyObject *) PyExc_EnvironmentError;
 PyAPI_DATA(PyObject *) PyExc_IOError;
-PyAPI_DATA(PyObject *) PyExc_OSError;
 PyAPI_DATA(PyObject *) PyExc_ImportError;
 PyAPI_DATA(PyObject *) PyExc_IndexError;
 PyAPI_DATA(PyObject *) PyExc_KeyError;
@@ -147,6 +145,10 @@
 PyAPI_DATA(PyObject *) PyExc_UnicodeTranslateError;
 PyAPI_DATA(PyObject *) PyExc_ValueError;
 PyAPI_DATA(PyObject *) PyExc_ZeroDivisionError;
+
+/* Compatibility aliases */
+PyAPI_DATA(PyObject *) PyExc_EnvironmentError;
+PyAPI_DATA(PyObject *) PyExc_OSError;
 #ifdef MS_WINDOWS
 PyAPI_DATA(PyObject *) PyExc_WindowsError;
 #endif
@@ -154,8 +156,6 @@
 PyAPI_DATA(PyObject *) PyExc_VMSError;
 #endif
 
-PyAPI_DATA(PyObject *) PyExc_BufferError;
-
 PyAPI_DATA(PyObject *) PyExc_RecursionErrorInst;
 
 /* Predefined warning categories */
Modified: python/branches/pep-3151/Lib/test/exception_hierarchy.txt
==============================================================================
--- python/branches/pep-3151/Lib/test/exception_hierarchy.txt	(original)
+++ python/branches/pep-3151/Lib/test/exception_hierarchy.txt	Thu Nov 11 00:20:53 2010
@@ -11,13 +11,9 @@
 +-- AssertionError
 +-- AttributeError
 +-- BufferError
- +-- EnvironmentError
- | +-- IOError
- | +-- OSError
- | +-- WindowsError (Windows)
- | +-- VMSError (VMS)
 +-- EOFError
 +-- ImportError
+ +-- IOError
 +-- LookupError
 | +-- IndexError
 | +-- KeyError
Modified: python/branches/pep-3151/Lib/test/test_exceptions.py
==============================================================================
--- python/branches/pep-3151/Lib/test/test_exceptions.py	(original)
+++ python/branches/pep-3151/Lib/test/test_exceptions.py	Thu Nov 11 00:20:53 2010
@@ -191,12 +191,34 @@
 except NameError:
 pass
 else:
- self.assertEqual(str(WindowsError(1001)),
- "1001")
- self.assertEqual(str(WindowsError(1001, "message")),
- "[Error 1001] message")
- self.assertEqual(WindowsError(1001, "message").errno, 22)
- self.assertEqual(WindowsError(1001, "message").winerror, 1001)
+ self.assertIs(WindowsError, IOError)
+ self.assertEqual(str(IOError(1001)), "1001")
+ self.assertEqual(str(IOError(1001, "message")),
+ "[Errno 1001] message")
+ # POSIX errno (9 aka EBADF) is untranslated
+ w = IOError(9, 'foo', 'bar')
+ self.assertEqual(w.errno, 9)
+ self.assertEqual(w.winerror, None)
+ self.assertEqual("[Errno 9] foo: 'bar'", str(w))
+ # ERROR_PATH_NOT_FOUND (win error 3) becomes ENOENT (2)
+ w = IOError(0, 'foo', 'bar', 3)
+ self.assertEqual(w.errno, 2)
+ self.assertEqual(w.winerror, 3)
+ self.assertEqual(w.strerror, 'foo')
+ self.assertEqual(w.filename, 'bar')
+ # Unknown win error becomes EINVAL (22)
+ w = IOError(0, 'foo', None, 1001)
+ self.assertEqual(w.errno, 22)
+ self.assertEqual(w.winerror, 1001)
+ self.assertEqual(w.strerror, 'foo')
+ self.assertEqual(w.filename, None)
+ self.assertEqual("[Error 1001] foo", str(w))
+ # Non-numeric "errno"
+ w = IOError('bar', 'foo')
+ self.assertEqual(w.errno, 'bar')
+ self.assertEqual(w.winerror, None)
+ self.assertEqual(w.strerror, 'foo')
+ self.assertEqual(w.filename, None)
 
 def testAttributes(self):
 # test that exception attributes are happy
@@ -274,11 +296,12 @@
 'start' : 0, 'end' : 1}),
 ]
 try:
+ # More tests are in test_WindowsError
 exceptionList.append(
 (WindowsError, (1, 'strErrorStr', 'filenameStr'),
 {'args' : (1, 'strErrorStr'),
- 'strerror' : 'strErrorStr', 'winerror' : 1,
- 'errno' : 22, 'filename' : 'filenameStr'})
+ 'strerror' : 'strErrorStr', 'winerror' : None,
+ 'errno' : 1, 'filename' : 'filenameStr'})
 )
 except NameError:
 pass
Modified: python/branches/pep-3151/Lib/test/test_mmap.py
==============================================================================
--- python/branches/pep-3151/Lib/test/test_mmap.py	(original)
+++ python/branches/pep-3151/Lib/test/test_mmap.py	Thu Nov 11 00:20:53 2010
@@ -498,8 +498,7 @@
 f.close()
 
 def test_error(self):
- self.assertTrue(issubclass(mmap.error, EnvironmentError))
- self.assertIn("mmap.error", str(mmap.error))
+ self.assertIs(mmap.error, IOError)
 
 def test_io_methods(self):
 data = b"0123456789"
Added: python/branches/pep-3151/Lib/test/test_pep3151.py
==============================================================================
--- (empty file)
+++ python/branches/pep-3151/Lib/test/test_pep3151.py	Thu Nov 11 00:20:53 2010
@@ -0,0 +1,41 @@
+import errno
+import os
+import select
+import socket
+import sys
+import unittest
+
+from test import support
+
+class HierarchyTest(unittest.TestCase):
+
+ def test_builtin_errors(self):
+ self.assertEqual(IOError.__name__, 'IOError')
+ self.assertIs(OSError, IOError)
+ self.assertIs(EnvironmentError, IOError)
+
+ def test_socket_errors(self):
+ self.assertIs(socket.error, IOError)
+ self.assertIs(socket.gaierror.__base__, IOError)
+ self.assertIs(socket.herror.__base__, IOError)
+ self.assertIs(socket.timeout.__base__, IOError)
+
+ def test_select_error(self):
+ self.assertIs(select.error, IOError)
+
+ # mmap.error is tested in test_mmap
+
+ def test_windows_error(self):
+ if os.name == "nt":
+ self.assertIn('winerror', dir(IOError))
+ else:
+ self.assertNotIn('winerror', dir(IOError))
+
+ # XXX VMSError not tested
+
+
+def test_main():
+ support.run_unittest(__name__)
+
+if __name__=="__main__":
+ test_main()
Modified: python/branches/pep-3151/Modules/_io/_iomodule.h
==============================================================================
--- python/branches/pep-3151/Modules/_io/_iomodule.h	(original)
+++ python/branches/pep-3151/Modules/_io/_iomodule.h	Thu Nov 11 00:20:53 2010
@@ -65,6 +65,7 @@
 PyObject *myerrno;
 PyObject *strerror;
 PyObject *filename; /* Not used, but part of the IOError object */
+ PyObject *winerror; /* Same, only under Windows */
 Py_ssize_t written;
 } PyBlockingIOErrorObject;
 PyAPI_DATA(PyObject *) PyExc_BlockingIOError;
Modified: python/branches/pep-3151/Modules/mmapmodule.c
==============================================================================
--- python/branches/pep-3151/Modules/mmapmodule.c	(original)
+++ python/branches/pep-3151/Modules/mmapmodule.c	Thu Nov 11 00:20:53 2010
@@ -75,8 +75,6 @@
 # define MAP_ANONYMOUS MAP_ANON
 #endif
 
-static PyObject *mmap_module_error;
-
 typedef enum
 {
 ACCESS_DEFAULT,
@@ -430,7 +428,7 @@
 {
 struct stat buf;
 if (-1 == fstat(self->fd, &buf)) {
- PyErr_SetFromErrno(mmap_module_error);
+ PyErr_SetFromErrno(PyExc_IOError);
 return NULL;
 }
 return PyLong_FromSsize_t(buf.st_size);
@@ -523,7 +521,7 @@
 void *newmap;
 
 if (ftruncate(self->fd, self->offset + new_size) == -1) {
- PyErr_SetFromErrno(mmap_module_error);
+ PyErr_SetFromErrno(PyExc_IOError);
 return NULL;
 }
 
@@ -538,7 +536,7 @@
 #endif
 if (newmap == (void *)-1)
 {
- PyErr_SetFromErrno(mmap_module_error);
+ PyErr_SetFromErrno(PyExc_IOError);
 return NULL;
 }
 self->data = newmap;
@@ -579,7 +577,7 @@
 /* XXX semantics of return value? */
 /* XXX flags for msync? */
 if (-1 == msync(self->data + offset, size, MS_SYNC)) {
- PyErr_SetFromErrno(mmap_module_error);
+ PyErr_SetFromErrno(PyExc_IOError);
 return NULL;
 }
 return PyLong_FromLong(0);
@@ -1145,7 +1143,7 @@
 fd = devzero = open("/dev/zero", O_RDWR);
 if (devzero == -1) {
 Py_DECREF(m_obj);
- PyErr_SetFromErrno(mmap_module_error);
+ PyErr_SetFromErrno(PyExc_IOError);
 return NULL;
 }
 #endif
@@ -1153,7 +1151,7 @@
 m_obj->fd = dup(fd);
 if (m_obj->fd == -1) {
 Py_DECREF(m_obj);
- PyErr_SetFromErrno(mmap_module_error);
+ PyErr_SetFromErrno(PyExc_IOError);
 return NULL;
 }
 }
@@ -1169,7 +1167,7 @@
 if (m_obj->data == (char *)-1) {
 m_obj->data = NULL;
 Py_DECREF(m_obj);
- PyErr_SetFromErrno(mmap_module_error);
+ PyErr_SetFromErrno(PyExc_IOError);
 return NULL;
 }
 m_obj->access = (access_mode)access;
@@ -1241,12 +1239,12 @@
 if (fileno != -1 && fileno != 0) {
 /* Ensure that fileno is within the CRT's valid range */
 if (_PyVerify_fd(fileno) == 0) {
- PyErr_SetFromErrno(mmap_module_error);
+ PyErr_SetFromErrno(PyExc_IOError);
 return NULL;
 }
 fh = (HANDLE)_get_osfhandle(fileno);
 if (fh==(HANDLE)-1) {
- PyErr_SetFromErrno(mmap_module_error);
+ PyErr_SetFromErrno(PyExc_IOError);
 return NULL;
 }
 /* Win9x appears to need us seeked to zero */
@@ -1407,11 +1405,7 @@
 dict = PyModule_GetDict(module);
 if (!dict)
 return NULL;
- mmap_module_error = PyErr_NewException("mmap.error",
- PyExc_EnvironmentError , NULL);
- if (mmap_module_error == NULL)
- return NULL;
- PyDict_SetItemString(dict, "error", mmap_module_error);
+ PyDict_SetItemString(dict, "error", PyExc_IOError);
 PyDict_SetItemString(dict, "mmap", (PyObject*) &mmap_object_type);
 #ifdef PROT_EXEC
 setint(dict, "PROT_EXEC", PROT_EXEC);
Modified: python/branches/pep-3151/Modules/selectmodule.c
==============================================================================
--- python/branches/pep-3151/Modules/selectmodule.c	(original)
+++ python/branches/pep-3151/Modules/selectmodule.c	Thu Nov 11 00:20:53 2010
@@ -54,8 +54,6 @@
 # endif
 #endif
 
-static PyObject *SelectError;
-
 /* list of Python objects and their file descriptor */
 typedef struct {
 PyObject *obj; /* owned reference */
@@ -277,11 +275,11 @@
 
 #ifdef MS_WINDOWS
 if (n == SOCKET_ERROR) {
- PyErr_SetExcFromWindowsErr(SelectError, WSAGetLastError());
+ PyErr_SetExcFromWindowsErr(PyExc_IOError, WSAGetLastError());
 }
 #else
 if (n < 0) {
- PyErr_SetFromErrno(SelectError);
+ PyErr_SetFromErrno(PyExc_IOError);
 }
 #endif
 else {
@@ -527,7 +525,7 @@
 Py_END_ALLOW_THREADS
 
 if (poll_result < 0) {
- PyErr_SetFromErrno(SelectError);
+ PyErr_SetFromErrno(PyExc_IOError);
 return NULL;
 }
 
@@ -1781,9 +1779,8 @@
 if (m == NULL)
 return NULL;
 
- SelectError = PyErr_NewException("select.error", NULL, NULL);
- Py_INCREF(SelectError);
- PyModule_AddObject(m, "error", SelectError);
+ Py_INCREF(PyExc_IOError);
+ PyModule_AddObject(m, "error", PyExc_IOError);
 
 #ifdef PIPE_BUF
 #ifdef HAVE_BROKEN_PIPE_BUF
Modified: python/branches/pep-3151/Modules/socketmodule.c
==============================================================================
--- python/branches/pep-3151/Modules/socketmodule.c	(original)
+++ python/branches/pep-3151/Modules/socketmodule.c	Thu Nov 11 00:20:53 2010
@@ -438,7 +438,6 @@
 
 /* Global variable holding the exception type for errors detected
 by this module (but not argument type or memory errors, etc.). */
-static PyObject *socket_error;
 static PyObject *socket_herror;
 static PyObject *socket_gaierror;
 static PyObject *socket_timeout;
@@ -472,7 +471,7 @@
 static PyObject*
 select_error(void)
 {
- PyErr_SetString(socket_error, "unable to select on socket");
+ PyErr_SetString(PyExc_IOError, "unable to select on socket");
 return NULL;
 }
 
@@ -499,7 +498,7 @@
 recognizes the error codes used by both GetLastError() and
 WSAGetLastError */
 if (err_no)
- return PyErr_SetExcFromWindowsErr(socket_error, err_no);
+ return PyErr_SetExcFromWindowsErr(PyExc_IOError, err_no);
 #endif
 
 #if defined(PYOS_OS2) && !defined(PYCC_GCC)
@@ -530,7 +529,7 @@
 }
 v = Py_BuildValue("(is)", myerrorcode, outbuf);
 if (v != NULL) {
- PyErr_SetObject(socket_error, v);
+ PyErr_SetObject(PyExc_IOError, v);
 Py_DECREF(v);
 }
 return NULL;
@@ -538,7 +537,7 @@
 }
 #endif
 
- return PyErr_SetFromErrno(socket_error);
+ return PyErr_SetFromErrno(PyExc_IOError);
 }
 
 
@@ -857,13 +856,13 @@
 #endif
 default:
 freeaddrinfo(res);
- PyErr_SetString(socket_error,
+ PyErr_SetString(PyExc_IOError,
 "unsupported address family");
 return -1;
 }
 if (res->ai_next) {
 freeaddrinfo(res);
- PyErr_SetString(socket_error,
+ PyErr_SetString(PyExc_IOError,
 "wildcard resolved to multiple address");
 return -1;
 }
@@ -876,7 +875,7 @@
 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
 struct sockaddr_in *sin;
 if (af != AF_INET && af != AF_UNSPEC) {
- PyErr_SetString(socket_error,
+ PyErr_SetString(PyExc_IOError,
 "address family mismatched");
 return -1;
 }
@@ -934,7 +933,7 @@
 return 16;
 #endif
 default:
- PyErr_SetString(socket_error, "unknown address family");
+ PyErr_SetString(PyExc_IOError, "unknown address family");
 return -1;
 }
 }
@@ -983,7 +982,7 @@
 bdaddr->b[5] = b5;
 return 6;
 } else {
- PyErr_SetString(socket_error, "bad bluetooth address");
+ PyErr_SetString(PyExc_IOError, "bad bluetooth address");
 return -1;
 }
 }
@@ -1233,7 +1232,7 @@
 if (len > 0 && path[0] == 0) {
 /* Linux abstract namespace extension */
 if (len > sizeof addr->sun_path) {
- PyErr_SetString(socket_error,
+ PyErr_SetString(PyExc_IOError,
 "AF_UNIX path too long");
 return 0;
 }
@@ -1243,7 +1242,7 @@
 {
 /* regular NULL-terminated string */
 if (len >= sizeof addr->sun_path) {
- PyErr_SetString(socket_error,
+ PyErr_SetString(PyExc_IOError,
 "AF_UNIX path too long");
 return 0;
 }
@@ -1373,7 +1372,7 @@
 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
 if (!PyArg_ParseTuple(args, "si", &straddr,
 &_BT_L2_MEMB(addr, psm))) {
- PyErr_SetString(socket_error, "getsockaddrarg: "
+ PyErr_SetString(PyExc_IOError, "getsockaddrarg: "
 "wrong format");
 return 0;
 }
@@ -1392,7 +1391,7 @@
 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
 if (!PyArg_ParseTuple(args, "si", &straddr,
 &_BT_RC_MEMB(addr, channel))) {
- PyErr_SetString(socket_error, "getsockaddrarg: "
+ PyErr_SetString(PyExc_IOError, "getsockaddrarg: "
 "wrong format");
 return 0;
 }
@@ -1410,7 +1409,7 @@
 
 			_BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
 if (straddr == NULL) {
- PyErr_SetString(socket_error, "getsockaddrarg: "
+ PyErr_SetString(PyExc_IOError, "getsockaddrarg: "
 "wrong format");
 return 0;
 }
@@ -1419,7 +1418,7 @@
 #else
 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
- PyErr_SetString(socket_error, "getsockaddrarg: "
+ PyErr_SetString(PyExc_IOError, "getsockaddrarg: "
 "wrong format");
 return 0;
 }
@@ -1436,7 +1435,7 @@
 addr = (struct sockaddr_sco *)addr_ret;
 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
 if (!PyBytes_Check(args)) {
- PyErr_SetString(socket_error, "getsockaddrarg: "
+ PyErr_SetString(PyExc_IOError, "getsockaddrarg: "
 "wrong format");
 return 0;
 }
@@ -1449,7 +1448,7 @@
 }
 #endif
 default:
- PyErr_SetString(socket_error, "getsockaddrarg: unknown Bluetooth protocol");
+ PyErr_SetString(PyExc_IOError, "getsockaddrarg: unknown Bluetooth protocol");
 return 0;
 }
 }
@@ -1564,7 +1563,7 @@
 /* More cases here... */
 
 default:
- PyErr_SetString(socket_error, "getsockaddrarg: bad family");
+ PyErr_SetString(PyExc_IOError, "getsockaddrarg: bad family");
 return 0;
 
 }
@@ -1630,7 +1629,7 @@
 return 1;
 #endif
 default:
- PyErr_SetString(socket_error, "getsockaddrlen: "
+ PyErr_SetString(PyExc_IOError, "getsockaddrlen: "
 "unknown BT protocol");
 return 0;
 
@@ -1657,7 +1656,7 @@
 /* More cases here... */
 
 default:
- PyErr_SetString(socket_error, "getsockaddrlen: bad family");
+ PyErr_SetString(PyExc_IOError, "getsockaddrlen: bad family");
 return 0;
 
 }
@@ -1886,7 +1885,7 @@
 #else
 if (buflen <= 0 || buflen > 1024) {
 #endif
- PyErr_SetString(socket_error,
+ PyErr_SetString(PyExc_IOError,
 "getsockopt buflen out of range");
 return NULL;
 }
@@ -3181,7 +3180,7 @@
 
 if (h->h_addrtype != af) {
 /* Let's get real error message to return */
- PyErr_SetString(socket_error,
+ PyErr_SetString(PyExc_IOError,
 (char *)strerror(EAFNOSUPPORT));
 
 return NULL;
@@ -3266,7 +3265,7 @@
 #endif
 
 default: /* can't happen */
- PyErr_SetString(socket_error,
+ PyErr_SetString(PyExc_IOError,
 "unsupported address family");
 return NULL;
 }
@@ -3420,7 +3419,7 @@
 break;
 #endif
 default:
- PyErr_SetString(socket_error, "unsupported address family");
+ PyErr_SetString(PyExc_IOError, "unsupported address family");
 goto finally;
 }
 Py_BEGIN_ALLOW_THREADS
@@ -3476,7 +3475,7 @@
 sp = getservbyname(name, proto);
 Py_END_ALLOW_THREADS
 if (sp == NULL) {
- PyErr_SetString(socket_error, "service/proto not found");
+ PyErr_SetString(PyExc_IOError, "service/proto not found");
 return NULL;
 }
 return PyLong_FromLong((long) ntohs(sp->s_port));
@@ -3513,7 +3512,7 @@
 sp = getservbyport(htons((short)port), proto);
 Py_END_ALLOW_THREADS
 if (sp == NULL) {
- PyErr_SetString(socket_error, "port/proto not found");
+ PyErr_SetString(PyExc_IOError, "port/proto not found");
 return NULL;
 }
 return PyUnicode_FromString(sp->s_name);
@@ -3542,7 +3541,7 @@
 sp = getprotobyname(name);
 Py_END_ALLOW_THREADS
 if (sp == NULL) {
- PyErr_SetString(socket_error, "protocol not found");
+ PyErr_SetString(PyExc_IOError, "protocol not found");
 return NULL;
 }
 return PyLong_FromLong((long) sp->p_proto);
@@ -3797,7 +3796,7 @@
 return PyBytes_FromStringAndSize((char *)(&buf),
 sizeof(buf));
 
- PyErr_SetString(socket_error,
+ PyErr_SetString(PyExc_IOError,
 "illegal IP address string passed to inet_aton");
 return NULL;
 
@@ -3818,7 +3817,7 @@
 packed_addr = inet_addr(ip_addr);
 
 if (packed_addr == INADDR_NONE) { /* invalid address */
- PyErr_SetString(socket_error,
+ PyErr_SetString(PyExc_IOError,
 "illegal IP address string passed to inet_aton");
 return NULL;
 }
@@ -3850,7 +3849,7 @@
 }
 
 if (addr_len != sizeof(packed_addr)) {
- PyErr_SetString(socket_error,
+ PyErr_SetString(PyExc_IOError,
 "packed IP wrong length for inet_ntoa");
 return NULL;
 }
@@ -3885,7 +3884,7 @@
 
 #if !defined(ENABLE_IPV6) && defined(AF_INET6)
 if(af == AF_INET6) {
- PyErr_SetString(socket_error,
+ PyErr_SetString(PyExc_IOError,
 "can't use AF_INET6, IPv6 is disabled");
 return NULL;
 }
@@ -3893,10 +3892,10 @@
 
 retval = inet_pton(af, ip, packed);
 if (retval < 0) {
- PyErr_SetFromErrno(socket_error);
+ PyErr_SetFromErrno(PyExc_IOError);
 return NULL;
 } else if (retval == 0) {
- PyErr_SetString(socket_error,
+ PyErr_SetString(PyExc_IOError,
 "illegal IP address string passed to inet_pton");
 return NULL;
 } else if (af == AF_INET) {
@@ -3908,7 +3907,7 @@
 sizeof(struct in6_addr));
 #endif
 } else {
- PyErr_SetString(socket_error, "unknown address family");
+ PyErr_SetString(PyExc_IOError, "unknown address family");
 return NULL;
 }
 }
@@ -3960,7 +3959,7 @@
 
 retval = inet_ntop(af, packed, ip, sizeof(ip));
 if (!retval) {
- PyErr_SetFromErrno(socket_error);
+ PyErr_SetFromErrno(PyExc_IOError);
 return NULL;
 } else {
 return PyUnicode_FromString(retval);
@@ -4027,7 +4026,7 @@
 } else if (pobj == Py_None) {
 pptr = (char *)NULL;
 } else {
- PyErr_SetString(socket_error, "Int or String expected");
+ PyErr_SetString(PyExc_IOError, "Int or String expected");
 goto err;
 }
 memset(&hints, 0, sizeof(hints));
@@ -4124,7 +4123,7 @@
 goto fail;
 }
 if (res->ai_next) {
- PyErr_SetString(socket_error,
+ PyErr_SetString(PyExc_IOError,
 "sockaddr resolved to multiple addresses");
 goto fail;
 }
@@ -4132,7 +4131,7 @@
 case AF_INET:
 {
 if (PyTuple_GET_SIZE(sa) != 2) {
- PyErr_SetString(socket_error,
+ PyErr_SetString(PyExc_IOError,
 "IPv4 sockaddr must be 2 tuple");
 goto fail;
 }
@@ -4402,27 +4401,24 @@
 if (m == NULL)
 return NULL;
 
- socket_error = PyErr_NewException("socket.error",
- PyExc_IOError, NULL);
- if (socket_error == NULL)
- return NULL;
- PySocketModuleAPI.error = socket_error;
- Py_INCREF(socket_error);
- PyModule_AddObject(m, "error", socket_error);
+ Py_INCREF(PyExc_IOError);
+ PySocketModuleAPI.error = PyExc_IOError;
+ Py_INCREF(PyExc_IOError);
+ PyModule_AddObject(m, "error", PyExc_IOError);
 socket_herror = PyErr_NewException("socket.herror",
- socket_error, NULL);
+ PyExc_IOError, NULL);
 if (socket_herror == NULL)
 return NULL;
 Py_INCREF(socket_herror);
 PyModule_AddObject(m, "herror", socket_herror);
- socket_gaierror = PyErr_NewException("socket.gaierror", socket_error,
+ socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_IOError,
 NULL);
 if (socket_gaierror == NULL)
 return NULL;
 Py_INCREF(socket_gaierror);
 PyModule_AddObject(m, "gaierror", socket_gaierror);
 socket_timeout = PyErr_NewException("socket.timeout",
- socket_error, NULL);
+ PyExc_IOError, NULL);
 if (socket_timeout == NULL)
 return NULL;
 Py_INCREF(socket_timeout);
Modified: python/branches/pep-3151/Objects/exceptions.c
==============================================================================
--- python/branches/pep-3151/Objects/exceptions.c	(original)
+++ python/branches/pep-3151/Objects/exceptions.c	Thu Nov 11 00:20:53 2010
@@ -10,6 +10,16 @@
 #include "osdefs.h"
 
 
+/* Compatibility aliases */
+PyObject *PyExc_EnvironmentError = NULL;
+PyObject *PyExc_OSError = NULL;
+#ifdef MS_WINDOWS
+PyObject *PyExc_WindowsError = NULL;
+#endif
+#ifdef __VMS
+PyObject *PyExc_VMSError = NULL;
+#endif
+
 /* NOTE: If the exception class hierarchy changes, don't forget to update
 * Lib/test/exception_hierarchy.txt
 */
@@ -552,9 +562,13 @@
 
 
 /*
- * EnvironmentError extends Exception
+ * IOError extends Exception
 */
 
+#ifdef MS_WINDOWS
+#include "errmap.h"
+#endif
+
 /* Where a function has a single filename, such as open() or some
 * of the os module functions, PyErr_SetFromErrnoWithFilename() is
 * called, giving a third argument which is the filename. But, so
@@ -567,23 +581,38 @@
 * when it was supplied.
 */
 static int
-EnvironmentError_init(PyEnvironmentErrorObject *self, PyObject *args,
+IOError_init(PyIOErrorObject *self, PyObject *args,
 PyObject *kwds)
 {
 PyObject *myerrno = NULL, *strerror = NULL, *filename = NULL;
 PyObject *subslice = NULL;
+#ifdef MS_WINDOWS
+ PyObject *winerror = NULL;
+#endif
 
 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
 return -1;
 
+#ifdef MS_WINDOWS
+ if (PyTuple_GET_SIZE(args) <= 1 || PyTuple_GET_SIZE(args) > 4) {
+ return 0;
+ }
+ if (!PyArg_UnpackTuple(args, "IOError", 2, 4,
+ &myerrno, &strerror, &filename, &winerror)) {
+ return -1;
+ }
+ /* 4-args form with non-int 4th arg; just store the args tuple */
+ if (winerror && !PyLong_Check(winerror))
+ return 0;
+#else
 if (PyTuple_GET_SIZE(args) <= 1 || PyTuple_GET_SIZE(args) > 3) {
 return 0;
 }
-
- if (!PyArg_UnpackTuple(args, "EnvironmentError", 2, 3,
+ if (!PyArg_UnpackTuple(args, "IOError", 2, 3,
 &myerrno, &strerror, &filename)) {
 return -1;
 }
+#endif
 Py_CLEAR(self->myerrno); /* replacing */
 self->myerrno = myerrno;
 Py_INCREF(self->myerrno);
@@ -592,8 +621,41 @@
 self->strerror = strerror;
 Py_INCREF(self->strerror);
 
+#ifdef MS_WINDOWS
+ /* NOTE: when calling the WindowsError constructor explicitly, behaviour
+ is changed compared to previous versions:
+ - previous signature:
+ WindowsError(winerror[, strerror[, filename]])
+ - new signature:
+ WindowsError(posix_errno[, strerror[, filename, [winerror]]])
+ */
+ Py_XINCREF(winerror);
+ Py_CLEAR(self->winerror);
+ self->winerror = winerror;
+ /* If the optional "winerror" is passed, set errno to the corresponding
+ POSIX errno. */
+ if (self->winerror != NULL) {
+ PyObject *o_errcode = NULL;
+ long errcode;
+ long posix_errno;
+
+ errcode = PyLong_AsLong(self->winerror);
+ if (errcode == -1 && PyErr_Occurred())
+ PyErr_Clear();
+ else {
+ posix_errno = winerror_to_errno(errcode);
+
+ o_errcode = PyLong_FromLong(posix_errno);
+ if (!o_errcode)
+ return -1;
+ Py_CLEAR(self->myerrno);
+ self->myerrno = o_errcode;
+ }
+ }
+#endif
+
 /* self->filename will remain Py_None otherwise */
- if (filename != NULL) {
+ if (filename != NULL && filename != Py_None) {
 Py_CLEAR(self->filename); /* replacing */
 self->filename = filename;
 Py_INCREF(self->filename);
@@ -609,67 +671,87 @@
 }
 
 static int
-EnvironmentError_clear(PyEnvironmentErrorObject *self)
+IOError_clear(PyIOErrorObject *self)
 {
 Py_CLEAR(self->myerrno);
 Py_CLEAR(self->strerror);
 Py_CLEAR(self->filename);
+#ifdef MS_WINDOWS
+ Py_CLEAR(self->winerror);
+#endif
 return BaseException_clear((PyBaseExceptionObject *)self);
 }
 
 static void
-EnvironmentError_dealloc(PyEnvironmentErrorObject *self)
+IOError_dealloc(PyIOErrorObject *self)
 {
 _PyObject_GC_UNTRACK(self);
- EnvironmentError_clear(self);
+ IOError_clear(self);
 Py_TYPE(self)->tp_free((PyObject *)self);
 }
 
 static int
-EnvironmentError_traverse(PyEnvironmentErrorObject *self, visitproc visit,
+IOError_traverse(PyIOErrorObject *self, visitproc visit,
 void *arg)
 {
 Py_VISIT(self->myerrno);
 Py_VISIT(self->strerror);
 Py_VISIT(self->filename);
+#ifdef MS_WINDOWS
+ Py_VISIT(self->winerror);
+#endif
 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
 }
 
 static PyObject *
-EnvironmentError_str(PyEnvironmentErrorObject *self)
+IOError_str(PyIOErrorObject *self)
 {
+#ifdef MS_WINDOWS
+ /* If available, winerror has the priority over myerrno */
+ if (self->winerror && self->filename)
+ return PyUnicode_FromFormat("[Error %S] %S: %R",
+ self->winerror ? self->winerror: Py_None,
+ self->strerror ? self->strerror: Py_None,
+ self->filename);
+ if (self->winerror && self->strerror)
+ return PyUnicode_FromFormat("[Error %S] %S",
+ self->winerror ? self->winerror: Py_None,
+ self->strerror ? self->strerror: Py_None);
+#endif
 if (self->filename)
 return PyUnicode_FromFormat("[Errno %S] %S: %R",
 self->myerrno ? self->myerrno: Py_None,
 self->strerror ? self->strerror: Py_None,
 self->filename);
- else if (self->myerrno && self->strerror)
+ if (self->myerrno && self->strerror)
 return PyUnicode_FromFormat("[Errno %S] %S",
 self->myerrno ? self->myerrno: Py_None,
 self->strerror ? self->strerror: Py_None);
- else
- return BaseException_str((PyBaseExceptionObject *)self);
+ return BaseException_str((PyBaseExceptionObject *)self);
 }
 
-static PyMemberDef EnvironmentError_members[] = {
- {"errno", T_OBJECT, offsetof(PyEnvironmentErrorObject, myerrno), 0,
- PyDoc_STR("exception errno")},
- {"strerror", T_OBJECT, offsetof(PyEnvironmentErrorObject, strerror), 0,
+static PyMemberDef IOError_members[] = {
+ {"errno", T_OBJECT, offsetof(PyIOErrorObject, myerrno), 0,
+ PyDoc_STR("POSIX exception code")},
+ {"strerror", T_OBJECT, offsetof(PyIOErrorObject, strerror), 0,
 PyDoc_STR("exception strerror")},
- {"filename", T_OBJECT, offsetof(PyEnvironmentErrorObject, filename), 0,
+ {"filename", T_OBJECT, offsetof(PyIOErrorObject, filename), 0,
 PyDoc_STR("exception filename")},
+#ifdef MS_WINDOWS
+ {"winerror", T_OBJECT, offsetof(PyIOErrorObject, winerror), 0,
+ PyDoc_STR("Win32 exception code")},
+#endif
 {NULL} /* Sentinel */
 };
 
-
 static PyObject *
-EnvironmentError_reduce(PyEnvironmentErrorObject *self)
+IOError_reduce(PyIOErrorObject *self)
 {
 PyObject *args = self->args;
 PyObject *res = NULL, *tmp;
 
 /* self->args is only the first two real arguments if there was a
- * file name given to EnvironmentError. */
+ * file name given to IOError. */
 if (PyTuple_GET_SIZE(args) == 2 && self->filename) {
 args = PyTuple_New(3);
 if (!args) return NULL;
@@ -696,145 +778,19 @@
 }
 
 
-static PyMethodDef EnvironmentError_methods[] = {
- {"__reduce__", (PyCFunction)EnvironmentError_reduce, METH_NOARGS},
+static PyMethodDef IOError_methods[] = {
+ {"__reduce__", (PyCFunction)IOError_reduce, METH_NOARGS},
 {NULL}
 };
 
-ComplexExtendsException(PyExc_Exception, EnvironmentError,
- EnvironmentError, EnvironmentError_dealloc,
- EnvironmentError_methods, EnvironmentError_members,
- EnvironmentError_str,
+ComplexExtendsException(PyExc_Exception, IOError,
+ IOError, IOError_dealloc,
+ IOError_methods, IOError_members,
+ IOError_str,
 "Base class for I/O related errors.");
 
 
 /*
- * IOError extends EnvironmentError
- */
-MiddlingExtendsException(PyExc_EnvironmentError, IOError,
- EnvironmentError, "I/O operation failed.");
-
-
-/*
- * OSError extends EnvironmentError
- */
-MiddlingExtendsException(PyExc_EnvironmentError, OSError,
- EnvironmentError, "OS system call failed.");
-
-
-/*
- * WindowsError extends OSError
- */
-#ifdef MS_WINDOWS
-#include "errmap.h"
-
-static int
-WindowsError_clear(PyWindowsErrorObject *self)
-{
- Py_CLEAR(self->myerrno);
- Py_CLEAR(self->strerror);
- Py_CLEAR(self->filename);
- Py_CLEAR(self->winerror);
- return BaseException_clear((PyBaseExceptionObject *)self);
-}
-
-static void
-WindowsError_dealloc(PyWindowsErrorObject *self)
-{
- _PyObject_GC_UNTRACK(self);
- WindowsError_clear(self);
- Py_TYPE(self)->tp_free((PyObject *)self);
-}
-
-static int
-WindowsError_traverse(PyWindowsErrorObject *self, visitproc visit, void *arg)
-{
- Py_VISIT(self->myerrno);
- Py_VISIT(self->strerror);
- Py_VISIT(self->filename);
- Py_VISIT(self->winerror);
- return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
-}
-
-static int
-WindowsError_init(PyWindowsErrorObject *self, PyObject *args, PyObject *kwds)
-{
- PyObject *o_errcode = NULL;
- long errcode;
- long posix_errno;
-
- if (EnvironmentError_init((PyEnvironmentErrorObject *)self, args, kwds)
- == -1)
- return -1;
-
- if (self->myerrno == NULL)
- return 0;
-
- /* Set errno to the POSIX errno, and winerror to the Win32
- error code. */
- errcode = PyLong_AsLong(self->myerrno);
- if (errcode == -1 && PyErr_Occurred())
- return -1;
- posix_errno = winerror_to_errno(errcode);
-
- Py_CLEAR(self->winerror);
- self->winerror = self->myerrno;
-
- o_errcode = PyLong_FromLong(posix_errno);
- if (!o_errcode)
- return -1;
-
- self->myerrno = o_errcode;
-
- return 0;
-}
-
-
-static PyObject *
-WindowsError_str(PyWindowsErrorObject *self)
-{
- if (self->filename)
- return PyUnicode_FromFormat("[Error %S] %S: %R",
- self->winerror ? self->winerror: Py_None,
- self->strerror ? self->strerror: Py_None,
- self->filename);
- else if (self->winerror && self->strerror)
- return PyUnicode_FromFormat("[Error %S] %S",
- self->winerror ? self->winerror: Py_None,
- self->strerror ? self->strerror: Py_None);
- else
- return EnvironmentError_str((PyEnvironmentErrorObject *)self);
-}
-
-static PyMemberDef WindowsError_members[] = {
- {"errno", T_OBJECT, offsetof(PyWindowsErrorObject, myerrno), 0,
- PyDoc_STR("POSIX exception code")},
- {"strerror", T_OBJECT, offsetof(PyWindowsErrorObject, strerror), 0,
- PyDoc_STR("exception strerror")},
- {"filename", T_OBJECT, offsetof(PyWindowsErrorObject, filename), 0,
- PyDoc_STR("exception filename")},
- {"winerror", T_OBJECT, offsetof(PyWindowsErrorObject, winerror), 0,
- PyDoc_STR("Win32 exception code")},
- {NULL} /* Sentinel */
-};
-
-ComplexExtendsException(PyExc_OSError, WindowsError, WindowsError,
- WindowsError_dealloc, 0, WindowsError_members,
- WindowsError_str, "MS-Windows OS system call failed.");
-
-#endif /* MS_WINDOWS */
-
-
-/*
- * VMSError extends OSError (I think)
- */
-#ifdef __VMS
-MiddlingExtendsException(PyExc_OSError, VMSError, EnvironmentError,
- "OpenVMS OS system call failed.");
-#endif
-
-
-/*
 * EOFError extends Exception
 */
 SimpleExtendsException(PyExc_Exception, EOFError,
@@ -1966,6 +1922,11 @@
 if (PyDict_SetItemString(bdict, # TYPE, PyExc_ ## TYPE)) \
 Py_FatalError("Module dictionary insertion problem.");
 
+#define INIT_ALIAS(NAME, TYPE) Py_INCREF(PyExc_ ## TYPE); \
+ PyExc_ ## NAME = PyExc_ ## TYPE; \
+ if (PyDict_SetItemString(bdict, # NAME, PyExc_ ## NAME)) \
+ Py_FatalError("Module dictionary insertion problem.");
+
 
 void
 _PyExc_Init(void)
@@ -1980,15 +1941,7 @@
 PRE_INIT(SystemExit)
 PRE_INIT(KeyboardInterrupt)
 PRE_INIT(ImportError)
- PRE_INIT(EnvironmentError)
 PRE_INIT(IOError)
- PRE_INIT(OSError)
-#ifdef MS_WINDOWS
- PRE_INIT(WindowsError)
-#endif
-#ifdef __VMS
- PRE_INIT(VMSError)
-#endif
 PRE_INIT(EOFError)
 PRE_INIT(RuntimeError)
 PRE_INIT(NotImplementedError)
@@ -2043,14 +1996,14 @@
 POST_INIT(SystemExit)
 POST_INIT(KeyboardInterrupt)
 POST_INIT(ImportError)
- POST_INIT(EnvironmentError)
 POST_INIT(IOError)
- POST_INIT(OSError)
+ INIT_ALIAS(EnvironmentError, IOError)
+ INIT_ALIAS(OSError, IOError)
 #ifdef MS_WINDOWS
- POST_INIT(WindowsError)
+ INIT_ALIAS(WindowsError, IOError)
 #endif
 #ifdef __VMS
- POST_INIT(VMSError)
+ INIT_ALIAS(VMSError, IOError)
 #endif
 POST_INIT(EOFError)
 POST_INIT(RuntimeError)
Modified: python/branches/pep-3151/Python/errors.c
==============================================================================
--- python/branches/pep-3151/Python/errors.c	(original)
+++ python/branches/pep-3151/Python/errors.c	Thu Nov 11 00:20:53 2010
@@ -496,10 +496,15 @@
 return NULL;
 }
 
- if (filenameObject != NULL)
- v = Py_BuildValue("(iOO)", err, message, filenameObject);
+ if (filenameObject == NULL)
+ filenameObject = Py_None;
+ /* errcodes >= 10000 correspond to socket error codes; no need to convert
+ them to a POSIX errno since they are natively recognized by Python
+ (also, trying to convert would end up with EINVAL) */
+ if (err < 10000)
+ v = Py_BuildValue("(iOOi)", err, message, filenameObject, err);
 else
- v = Py_BuildValue("(iO)", err, message);
+ v = Py_BuildValue("(iOO)", err, message, filenameObject);
 Py_DECREF(message);
 
 if (v != NULL) {


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /