blob: b994862a2d02c372a58446e769de5f4ecdc78484 [file] [log] [blame]
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001/*
2 * New exceptions.c written in Iceland by Richard Jones and Georg Brandl.
3 *
4 * Thanks go to Tim Peters and Michael Hudson for debugging.
5 */
6
Thomas Wouters477c8d52006-05-27 19:21:47 +00007#define PY_SSIZE_T_CLEAN
8#include <Python.h>
9#include "structmember.h"
10#include "osdefs.h"
11
Thomas Wouters477c8d52006-05-27 19:21:47 +000012
Antoine Pitrou6b4883d2011-10-12 02:54:14 +020013/* Compatibility aliases */
14PyObject *PyExc_EnvironmentError = NULL;
15PyObject *PyExc_IOError = NULL;
16#ifdef MS_WINDOWS
17PyObject *PyExc_WindowsError = NULL;
18#endif
19#ifdef __VMS
20PyObject *PyExc_VMSError = NULL;
21#endif
22
23/* The dict map from errno codes to OSError subclasses */
24static PyObject *errnomap = NULL;
25
26
Thomas Wouters477c8d52006-05-27 19:21:47 +000027/* NOTE: If the exception class hierarchy changes, don't forget to update
28 * Lib/test/exception_hierarchy.txt
29 */
30
Thomas Wouters477c8d52006-05-27 19:21:47 +000031/*
32 * BaseException
33 */
34static PyObject *
35BaseException_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
36{
37 PyBaseExceptionObject *self;
38
39 self = (PyBaseExceptionObject *)type->tp_alloc(type, 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +000040 if (!self)
41 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +000042 /* the dict is created on the fly in PyObject_GenericSetAttr */
Guido van Rossumebe3e162007-05-17 18:20:34 +000043 self->dict = NULL;
Collin Winter1966f1c2007-09-01 20:26:44 +000044 self->traceback = self->cause = self->context = NULL;
Benjamin Petersond5a1c442012-05-14 22:09:31 -070045 self->suppress_context = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +000046
47 self->args = PyTuple_New(0);
48 if (!self->args) {
49 Py_DECREF(self);
50 return NULL;
51 }
52
Thomas Wouters477c8d52006-05-27 19:21:47 +000053 return (PyObject *)self;
54}
55
56static int
57BaseException_init(PyBaseExceptionObject *self, PyObject *args, PyObject *kwds)
58{
Christian Heimes90aa7642007-12-19 02:45:37 +000059 if (!_PyArg_NoKeywords(Py_TYPE(self)->tp_name, kwds))
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000060 return -1;
61
Antoine Pitroue0e27352011-12-15 14:31:28 +010062 Py_XDECREF(self->args);
Thomas Wouters477c8d52006-05-27 19:21:47 +000063 self->args = args;
64 Py_INCREF(self->args);
65
Thomas Wouters477c8d52006-05-27 19:21:47 +000066 return 0;
67}
68
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000069static int
Thomas Wouters477c8d52006-05-27 19:21:47 +000070BaseException_clear(PyBaseExceptionObject *self)
71{
72 Py_CLEAR(self->dict);
73 Py_CLEAR(self->args);
Collin Winter828f04a2007-08-31 00:04:24 +000074 Py_CLEAR(self->traceback);
Collin Winter1966f1c2007-09-01 20:26:44 +000075 Py_CLEAR(self->cause);
76 Py_CLEAR(self->context);
Thomas Wouters477c8d52006-05-27 19:21:47 +000077 return 0;
78}
79
80static void
81BaseException_dealloc(PyBaseExceptionObject *self)
82{
Thomas Wouters89f507f2006-12-13 04:49:30 +000083 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +000084 BaseException_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +000085 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +000086}
87
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000088static int
Thomas Wouters477c8d52006-05-27 19:21:47 +000089BaseException_traverse(PyBaseExceptionObject *self, visitproc visit, void *arg)
90{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000091 Py_VISIT(self->dict);
Thomas Wouters477c8d52006-05-27 19:21:47 +000092 Py_VISIT(self->args);
Collin Winter828f04a2007-08-31 00:04:24 +000093 Py_VISIT(self->traceback);
Collin Winter1966f1c2007-09-01 20:26:44 +000094 Py_VISIT(self->cause);
95 Py_VISIT(self->context);
Thomas Wouters477c8d52006-05-27 19:21:47 +000096 return 0;
97}
98
99static PyObject *
100BaseException_str(PyBaseExceptionObject *self)
101{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000102 switch (PyTuple_GET_SIZE(self->args)) {
Thomas Wouters477c8d52006-05-27 19:21:47 +0000103 case 0:
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +0000104 return PyUnicode_FromString("");
Thomas Wouters477c8d52006-05-27 19:21:47 +0000105 case 1:
Thomas Heller519a0422007-11-15 20:48:54 +0000106 return PyObject_Str(PyTuple_GET_ITEM(self->args, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +0000107 default:
Thomas Heller519a0422007-11-15 20:48:54 +0000108 return PyObject_Str(self->args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000109 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000110}
111
112static PyObject *
113BaseException_repr(PyBaseExceptionObject *self)
114{
Thomas Wouters477c8d52006-05-27 19:21:47 +0000115 char *name;
116 char *dot;
117
Christian Heimes90aa7642007-12-19 02:45:37 +0000118 name = (char *)Py_TYPE(self)->tp_name;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000119 dot = strrchr(name, '.');
120 if (dot != NULL) name = dot+1;
121
Walter Dörwald7569dfe2007-05-19 21:49:49 +0000122 return PyUnicode_FromFormat("%s%R", name, self->args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000123}
124
125/* Pickling support */
126static PyObject *
127BaseException_reduce(PyBaseExceptionObject *self)
128{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000129 if (self->args && self->dict)
Christian Heimes90aa7642007-12-19 02:45:37 +0000130 return PyTuple_Pack(3, Py_TYPE(self), self->args, self->dict);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000131 else
Christian Heimes90aa7642007-12-19 02:45:37 +0000132 return PyTuple_Pack(2, Py_TYPE(self), self->args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000133}
134
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000135/*
136 * Needed for backward compatibility, since exceptions used to store
137 * all their attributes in the __dict__. Code is taken from cPickle's
138 * load_build function.
139 */
140static PyObject *
141BaseException_setstate(PyObject *self, PyObject *state)
142{
143 PyObject *d_key, *d_value;
144 Py_ssize_t i = 0;
145
146 if (state != Py_None) {
147 if (!PyDict_Check(state)) {
148 PyErr_SetString(PyExc_TypeError, "state is not a dictionary");
149 return NULL;
150 }
151 while (PyDict_Next(state, &i, &d_key, &d_value)) {
152 if (PyObject_SetAttr(self, d_key, d_value) < 0)
153 return NULL;
154 }
155 }
156 Py_RETURN_NONE;
157}
Thomas Wouters477c8d52006-05-27 19:21:47 +0000158
Collin Winter828f04a2007-08-31 00:04:24 +0000159static PyObject *
160BaseException_with_traceback(PyObject *self, PyObject *tb) {
161 if (PyException_SetTraceback(self, tb))
162 return NULL;
163
164 Py_INCREF(self);
165 return self;
166}
167
Georg Brandl76941002008-05-05 21:38:47 +0000168PyDoc_STRVAR(with_traceback_doc,
169"Exception.with_traceback(tb) --\n\
170 set self.__traceback__ to tb and return self.");
171
Thomas Wouters477c8d52006-05-27 19:21:47 +0000172
173static PyMethodDef BaseException_methods[] = {
174 {"__reduce__", (PyCFunction)BaseException_reduce, METH_NOARGS },
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000175 {"__setstate__", (PyCFunction)BaseException_setstate, METH_O },
Georg Brandl76941002008-05-05 21:38:47 +0000176 {"with_traceback", (PyCFunction)BaseException_with_traceback, METH_O,
177 with_traceback_doc},
Thomas Wouters477c8d52006-05-27 19:21:47 +0000178 {NULL, NULL, 0, NULL},
179};
180
Thomas Wouters477c8d52006-05-27 19:21:47 +0000181static PyObject *
182BaseException_get_args(PyBaseExceptionObject *self)
183{
184 if (self->args == NULL) {
185 Py_INCREF(Py_None);
186 return Py_None;
187 }
188 Py_INCREF(self->args);
189 return self->args;
190}
191
192static int
193BaseException_set_args(PyBaseExceptionObject *self, PyObject *val)
194{
195 PyObject *seq;
196 if (val == NULL) {
197 PyErr_SetString(PyExc_TypeError, "args may not be deleted");
198 return -1;
199 }
200 seq = PySequence_Tuple(val);
Benjamin Peterson90b13582012-02-03 19:22:31 -0500201 if (!seq)
202 return -1;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000203 Py_CLEAR(self->args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000204 self->args = seq;
205 return 0;
206}
207
Collin Winter828f04a2007-08-31 00:04:24 +0000208static PyObject *
209BaseException_get_tb(PyBaseExceptionObject *self)
210{
211 if (self->traceback == NULL) {
212 Py_INCREF(Py_None);
213 return Py_None;
214 }
215 Py_INCREF(self->traceback);
216 return self->traceback;
217}
218
219static int
220BaseException_set_tb(PyBaseExceptionObject *self, PyObject *tb)
221{
222 if (tb == NULL) {
223 PyErr_SetString(PyExc_TypeError, "__traceback__ may not be deleted");
224 return -1;
225 }
226 else if (!(tb == Py_None || PyTraceBack_Check(tb))) {
227 PyErr_SetString(PyExc_TypeError,
228 "__traceback__ must be a traceback or None");
229 return -1;
230 }
231
232 Py_XINCREF(tb);
233 Py_XDECREF(self->traceback);
234 self->traceback = tb;
235 return 0;
236}
237
Georg Brandlab6f2f62009-03-31 04:16:10 +0000238static PyObject *
239BaseException_get_context(PyObject *self) {
240 PyObject *res = PyException_GetContext(self);
Benjamin Peterson90b13582012-02-03 19:22:31 -0500241 if (res)
242 return res; /* new reference already returned above */
Georg Brandlab6f2f62009-03-31 04:16:10 +0000243 Py_RETURN_NONE;
244}
245
246static int
247BaseException_set_context(PyObject *self, PyObject *arg) {
248 if (arg == NULL) {
249 PyErr_SetString(PyExc_TypeError, "__context__ may not be deleted");
250 return -1;
251 } else if (arg == Py_None) {
252 arg = NULL;
253 } else if (!PyExceptionInstance_Check(arg)) {
254 PyErr_SetString(PyExc_TypeError, "exception context must be None "
255 "or derive from BaseException");
256 return -1;
257 } else {
258 /* PyException_SetContext steals this reference */
259 Py_INCREF(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000260 }
Georg Brandlab6f2f62009-03-31 04:16:10 +0000261 PyException_SetContext(self, arg);
262 return 0;
263}
264
265static PyObject *
266BaseException_get_cause(PyObject *self) {
267 PyObject *res = PyException_GetCause(self);
Benjamin Peterson90b13582012-02-03 19:22:31 -0500268 if (res)
269 return res; /* new reference already returned above */
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700270 Py_RETURN_NONE;
Georg Brandlab6f2f62009-03-31 04:16:10 +0000271}
272
273static int
274BaseException_set_cause(PyObject *self, PyObject *arg) {
275 if (arg == NULL) {
276 PyErr_SetString(PyExc_TypeError, "__cause__ may not be deleted");
277 return -1;
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700278 } else if (arg == Py_None) {
279 arg = NULL;
280 } else if (!PyExceptionInstance_Check(arg)) {
281 PyErr_SetString(PyExc_TypeError, "exception cause must be None "
282 "or derive from BaseException");
283 return -1;
284 } else {
285 /* PyException_SetCause steals this reference */
286 Py_INCREF(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000287 }
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700288 PyException_SetCause(self, arg);
289 return 0;
Georg Brandlab6f2f62009-03-31 04:16:10 +0000290}
291
Guido van Rossum360e4b82007-05-14 22:51:27 +0000292
Thomas Wouters477c8d52006-05-27 19:21:47 +0000293static PyGetSetDef BaseException_getset[] = {
Benjamin Peterson23d7f122012-02-19 20:02:57 -0500294 {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict},
Thomas Wouters477c8d52006-05-27 19:21:47 +0000295 {"args", (getter)BaseException_get_args, (setter)BaseException_set_args},
Collin Winter828f04a2007-08-31 00:04:24 +0000296 {"__traceback__", (getter)BaseException_get_tb, (setter)BaseException_set_tb},
Georg Brandlab6f2f62009-03-31 04:16:10 +0000297 {"__context__", (getter)BaseException_get_context,
298 (setter)BaseException_set_context, PyDoc_STR("exception context")},
299 {"__cause__", (getter)BaseException_get_cause,
300 (setter)BaseException_set_cause, PyDoc_STR("exception cause")},
Thomas Wouters477c8d52006-05-27 19:21:47 +0000301 {NULL},
302};
303
304
Collin Winter828f04a2007-08-31 00:04:24 +0000305PyObject *
306PyException_GetTraceback(PyObject *self) {
307 PyBaseExceptionObject *base_self = (PyBaseExceptionObject *)self;
308 Py_XINCREF(base_self->traceback);
309 return base_self->traceback;
310}
311
312
313int
314PyException_SetTraceback(PyObject *self, PyObject *tb) {
315 return BaseException_set_tb((PyBaseExceptionObject *)self, tb);
316}
317
318PyObject *
319PyException_GetCause(PyObject *self) {
320 PyObject *cause = ((PyBaseExceptionObject *)self)->cause;
321 Py_XINCREF(cause);
322 return cause;
323}
324
325/* Steals a reference to cause */
326void
327PyException_SetCause(PyObject *self, PyObject *cause) {
328 PyObject *old_cause = ((PyBaseExceptionObject *)self)->cause;
329 ((PyBaseExceptionObject *)self)->cause = cause;
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700330 ((PyBaseExceptionObject *)self)->suppress_context = 1;
Collin Winter828f04a2007-08-31 00:04:24 +0000331 Py_XDECREF(old_cause);
332}
333
334PyObject *
335PyException_GetContext(PyObject *self) {
336 PyObject *context = ((PyBaseExceptionObject *)self)->context;
337 Py_XINCREF(context);
338 return context;
339}
340
341/* Steals a reference to context */
342void
343PyException_SetContext(PyObject *self, PyObject *context) {
344 PyObject *old_context = ((PyBaseExceptionObject *)self)->context;
345 ((PyBaseExceptionObject *)self)->context = context;
346 Py_XDECREF(old_context);
347}
348
349
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700350static struct PyMemberDef BaseException_members[] = {
351 {"__suppress_context__", T_BOOL,
352 offsetof(PyBaseExceptionObject, suppress_context)}
353};
354
355
Thomas Wouters477c8d52006-05-27 19:21:47 +0000356static PyTypeObject _PyExc_BaseException = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000357 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +0000358 "BaseException", /*tp_name*/
Thomas Wouters477c8d52006-05-27 19:21:47 +0000359 sizeof(PyBaseExceptionObject), /*tp_basicsize*/
360 0, /*tp_itemsize*/
361 (destructor)BaseException_dealloc, /*tp_dealloc*/
362 0, /*tp_print*/
363 0, /*tp_getattr*/
364 0, /*tp_setattr*/
Mark Dickinsone94c6792009-02-02 20:36:42 +0000365 0, /* tp_reserved; */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000366 (reprfunc)BaseException_repr, /*tp_repr*/
367 0, /*tp_as_number*/
Brett Cannonba7bf492007-02-27 00:15:55 +0000368 0, /*tp_as_sequence*/
Thomas Wouters477c8d52006-05-27 19:21:47 +0000369 0, /*tp_as_mapping*/
370 0, /*tp_hash */
371 0, /*tp_call*/
372 (reprfunc)BaseException_str, /*tp_str*/
373 PyObject_GenericGetAttr, /*tp_getattro*/
374 PyObject_GenericSetAttr, /*tp_setattro*/
375 0, /*tp_as_buffer*/
Thomas Wouters27d517b2007-02-25 20:39:11 +0000376 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC |
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000377 Py_TPFLAGS_BASE_EXC_SUBCLASS, /*tp_flags*/
Thomas Wouters477c8d52006-05-27 19:21:47 +0000378 PyDoc_STR("Common base class for all exceptions"), /* tp_doc */
379 (traverseproc)BaseException_traverse, /* tp_traverse */
380 (inquiry)BaseException_clear, /* tp_clear */
381 0, /* tp_richcompare */
382 0, /* tp_weaklistoffset */
383 0, /* tp_iter */
384 0, /* tp_iternext */
385 BaseException_methods, /* tp_methods */
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700386 BaseException_members, /* tp_members */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000387 BaseException_getset, /* tp_getset */
388 0, /* tp_base */
389 0, /* tp_dict */
390 0, /* tp_descr_get */
391 0, /* tp_descr_set */
392 offsetof(PyBaseExceptionObject, dict), /* tp_dictoffset */
393 (initproc)BaseException_init, /* tp_init */
394 0, /* tp_alloc */
395 BaseException_new, /* tp_new */
396};
397/* the CPython API expects exceptions to be (PyObject *) - both a hold-over
398from the previous implmentation and also allowing Python objects to be used
399in the API */
400PyObject *PyExc_BaseException = (PyObject *)&_PyExc_BaseException;
401
402/* note these macros omit the last semicolon so the macro invocation may
403 * include it and not look strange.
404 */
405#define SimpleExtendsException(EXCBASE, EXCNAME, EXCDOC) \
406static PyTypeObject _PyExc_ ## EXCNAME = { \
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000407 PyVarObject_HEAD_INIT(NULL, 0) \
Neal Norwitz2633c692007-02-26 22:22:47 +0000408 # EXCNAME, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000409 sizeof(PyBaseExceptionObject), \
410 0, (destructor)BaseException_dealloc, 0, 0, 0, 0, 0, 0, 0, \
411 0, 0, 0, 0, 0, 0, 0, \
412 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
413 PyDoc_STR(EXCDOC), (traverseproc)BaseException_traverse, \
414 (inquiry)BaseException_clear, 0, 0, 0, 0, 0, 0, 0, &_ ## EXCBASE, \
415 0, 0, 0, offsetof(PyBaseExceptionObject, dict), \
416 (initproc)BaseException_init, 0, BaseException_new,\
417}; \
418PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
419
420#define MiddlingExtendsException(EXCBASE, EXCNAME, EXCSTORE, EXCDOC) \
421static PyTypeObject _PyExc_ ## EXCNAME = { \
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000422 PyVarObject_HEAD_INIT(NULL, 0) \
Neal Norwitz2633c692007-02-26 22:22:47 +0000423 # EXCNAME, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000424 sizeof(Py ## EXCSTORE ## Object), \
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000425 0, (destructor)EXCSTORE ## _dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000426 0, 0, 0, 0, 0, \
427 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000428 PyDoc_STR(EXCDOC), (traverseproc)EXCSTORE ## _traverse, \
429 (inquiry)EXCSTORE ## _clear, 0, 0, 0, 0, 0, 0, 0, &_ ## EXCBASE, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000430 0, 0, 0, offsetof(Py ## EXCSTORE ## Object, dict), \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200431 (initproc)EXCSTORE ## _init, 0, 0, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000432}; \
433PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
434
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200435#define ComplexExtendsException(EXCBASE, EXCNAME, EXCSTORE, EXCNEW, \
436 EXCMETHODS, EXCMEMBERS, EXCGETSET, \
437 EXCSTR, EXCDOC) \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000438static PyTypeObject _PyExc_ ## EXCNAME = { \
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000439 PyVarObject_HEAD_INIT(NULL, 0) \
Neal Norwitz2633c692007-02-26 22:22:47 +0000440 # EXCNAME, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000441 sizeof(Py ## EXCSTORE ## Object), 0, \
442 (destructor)EXCSTORE ## _dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
443 (reprfunc)EXCSTR, 0, 0, 0, \
444 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
445 PyDoc_STR(EXCDOC), (traverseproc)EXCSTORE ## _traverse, \
446 (inquiry)EXCSTORE ## _clear, 0, 0, 0, 0, EXCMETHODS, \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200447 EXCMEMBERS, EXCGETSET, &_ ## EXCBASE, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000448 0, 0, 0, offsetof(Py ## EXCSTORE ## Object, dict), \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200449 (initproc)EXCSTORE ## _init, 0, EXCNEW,\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000450}; \
451PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
452
453
454/*
455 * Exception extends BaseException
456 */
457SimpleExtendsException(PyExc_BaseException, Exception,
458 "Common base class for all non-exit exceptions.");
459
460
461/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000462 * TypeError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +0000463 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000464SimpleExtendsException(PyExc_Exception, TypeError,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000465 "Inappropriate argument type.");
466
467
468/*
469 * StopIteration extends Exception
470 */
Nick Coghlan1f7ce622012-01-13 21:43:40 +1000471
472static PyMemberDef StopIteration_members[] = {
473 {"value", T_OBJECT, offsetof(PyStopIterationObject, value), 0,
474 PyDoc_STR("generator return value")},
475 {NULL} /* Sentinel */
476};
477
478static int
479StopIteration_init(PyStopIterationObject *self, PyObject *args, PyObject *kwds)
480{
481 Py_ssize_t size = PyTuple_GET_SIZE(args);
482 PyObject *value;
483
484 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
485 return -1;
486 Py_CLEAR(self->value);
487 if (size > 0)
488 value = PyTuple_GET_ITEM(args, 0);
489 else
490 value = Py_None;
491 Py_INCREF(value);
492 self->value = value;
493 return 0;
494}
495
496static int
497StopIteration_clear(PyStopIterationObject *self)
498{
499 Py_CLEAR(self->value);
500 return BaseException_clear((PyBaseExceptionObject *)self);
501}
502
503static void
504StopIteration_dealloc(PyStopIterationObject *self)
505{
506 _PyObject_GC_UNTRACK(self);
507 StopIteration_clear(self);
508 Py_TYPE(self)->tp_free((PyObject *)self);
509}
510
511static int
512StopIteration_traverse(PyStopIterationObject *self, visitproc visit, void *arg)
513{
514 Py_VISIT(self->value);
515 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
516}
517
518PyObject *
519PyStopIteration_Create(PyObject *value)
520{
521 return PyObject_CallFunctionObjArgs(PyExc_StopIteration, value, NULL);
522}
523
524ComplexExtendsException(
525 PyExc_Exception, /* base */
526 StopIteration, /* name */
527 StopIteration, /* prefix for *_init, etc */
528 0, /* new */
529 0, /* methods */
530 StopIteration_members, /* members */
531 0, /* getset */
532 0, /* str */
533 "Signal the end from iterator.__next__()."
534);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000535
536
537/*
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000538 * GeneratorExit extends BaseException
Thomas Wouters477c8d52006-05-27 19:21:47 +0000539 */
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000540SimpleExtendsException(PyExc_BaseException, GeneratorExit,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000541 "Request that a generator exit.");
542
543
544/*
545 * SystemExit extends BaseException
546 */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000547
548static int
549SystemExit_init(PySystemExitObject *self, PyObject *args, PyObject *kwds)
550{
551 Py_ssize_t size = PyTuple_GET_SIZE(args);
552
553 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
554 return -1;
555
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000556 if (size == 0)
557 return 0;
558 Py_CLEAR(self->code);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000559 if (size == 1)
560 self->code = PyTuple_GET_ITEM(args, 0);
Victor Stinner92236e52011-05-26 14:25:54 +0200561 else /* size > 1 */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000562 self->code = args;
563 Py_INCREF(self->code);
564 return 0;
565}
566
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000567static int
Thomas Wouters477c8d52006-05-27 19:21:47 +0000568SystemExit_clear(PySystemExitObject *self)
569{
570 Py_CLEAR(self->code);
571 return BaseException_clear((PyBaseExceptionObject *)self);
572}
573
574static void
575SystemExit_dealloc(PySystemExitObject *self)
576{
Thomas Wouters89f507f2006-12-13 04:49:30 +0000577 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000578 SystemExit_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +0000579 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000580}
581
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000582static int
Thomas Wouters477c8d52006-05-27 19:21:47 +0000583SystemExit_traverse(PySystemExitObject *self, visitproc visit, void *arg)
584{
585 Py_VISIT(self->code);
586 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
587}
588
589static PyMemberDef SystemExit_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +0000590 {"code", T_OBJECT, offsetof(PySystemExitObject, code), 0,
591 PyDoc_STR("exception code")},
592 {NULL} /* Sentinel */
593};
594
595ComplexExtendsException(PyExc_BaseException, SystemExit, SystemExit,
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200596 0, 0, SystemExit_members, 0, 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000597 "Request to exit from the interpreter.");
598
599/*
600 * KeyboardInterrupt extends BaseException
601 */
602SimpleExtendsException(PyExc_BaseException, KeyboardInterrupt,
603 "Program interrupted by user.");
604
605
606/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000607 * ImportError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +0000608 */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000609
Brett Cannon79ec55e2012-04-12 20:24:54 -0400610static int
611ImportError_init(PyImportErrorObject *self, PyObject *args, PyObject *kwds)
612{
613 PyObject *msg = NULL;
614 PyObject *name = NULL;
615 PyObject *path = NULL;
616
617/* Macro replacement doesn't allow ## to start the first line of a macro,
618 so we move the assignment and NULL check into the if-statement. */
619#define GET_KWD(kwd) { \
620 kwd = PyDict_GetItemString(kwds, #kwd); \
621 if (kwd) { \
622 Py_CLEAR(self->kwd); \
623 self->kwd = kwd; \
624 Py_INCREF(self->kwd);\
625 if (PyDict_DelItemString(kwds, #kwd)) \
626 return -1; \
627 } \
628 }
629
630 if (kwds) {
631 GET_KWD(name);
632 GET_KWD(path);
633 }
634
635 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
636 return -1;
637 if (PyTuple_GET_SIZE(args) != 1)
638 return 0;
639 if (!PyArg_UnpackTuple(args, "ImportError", 1, 1, &msg))
640 return -1;
641
642 Py_CLEAR(self->msg); /* replacing */
643 self->msg = msg;
644 Py_INCREF(self->msg);
645
646 return 0;
647}
648
649static int
650ImportError_clear(PyImportErrorObject *self)
651{
652 Py_CLEAR(self->msg);
653 Py_CLEAR(self->name);
654 Py_CLEAR(self->path);
655 return BaseException_clear((PyBaseExceptionObject *)self);
656}
657
658static void
659ImportError_dealloc(PyImportErrorObject *self)
660{
661 _PyObject_GC_UNTRACK(self);
662 ImportError_clear(self);
663 Py_TYPE(self)->tp_free((PyObject *)self);
664}
665
666static int
667ImportError_traverse(PyImportErrorObject *self, visitproc visit, void *arg)
668{
669 Py_VISIT(self->msg);
670 Py_VISIT(self->name);
671 Py_VISIT(self->path);
672 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
673}
674
675static PyObject *
676ImportError_str(PyImportErrorObject *self)
677{
678 if (self->msg) {
679 Py_INCREF(self->msg);
680 return self->msg;
681 }
682 else {
683 return BaseException_str((PyBaseExceptionObject *)self);
684 }
685}
686
687static PyMemberDef ImportError_members[] = {
688 {"msg", T_OBJECT, offsetof(PyImportErrorObject, msg), 0,
689 PyDoc_STR("exception message")},
690 {"name", T_OBJECT, offsetof(PyImportErrorObject, name), 0,
691 PyDoc_STR("module name")},
692 {"path", T_OBJECT, offsetof(PyImportErrorObject, path), 0,
693 PyDoc_STR("module path")},
694 {NULL} /* Sentinel */
695};
696
697static PyMethodDef ImportError_methods[] = {
698 {NULL}
699};
700
701ComplexExtendsException(PyExc_Exception, ImportError,
702 ImportError, 0 /* new */,
703 ImportError_methods, ImportError_members,
704 0 /* getset */, ImportError_str,
705 "Import can't find module, or can't find name in "
706 "module.");
Thomas Wouters477c8d52006-05-27 19:21:47 +0000707
708/*
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200709 * OSError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +0000710 */
711
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200712#ifdef MS_WINDOWS
713#include "errmap.h"
714#endif
715
Thomas Wouters477c8d52006-05-27 19:21:47 +0000716/* Where a function has a single filename, such as open() or some
717 * of the os module functions, PyErr_SetFromErrnoWithFilename() is
718 * called, giving a third argument which is the filename. But, so
719 * that old code using in-place unpacking doesn't break, e.g.:
720 *
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200721 * except OSError, (errno, strerror):
Thomas Wouters477c8d52006-05-27 19:21:47 +0000722 *
723 * we hack args so that it only contains two items. This also
724 * means we need our own __str__() which prints out the filename
725 * when it was supplied.
726 */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200727
Antoine Pitroue0e27352011-12-15 14:31:28 +0100728/* This function doesn't cleanup on error, the caller should */
729static int
730oserror_parse_args(PyObject **p_args,
731 PyObject **myerrno, PyObject **strerror,
732 PyObject **filename
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200733#ifdef MS_WINDOWS
Antoine Pitroue0e27352011-12-15 14:31:28 +0100734 , PyObject **winerror
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200735#endif
Antoine Pitroue0e27352011-12-15 14:31:28 +0100736 )
737{
738 Py_ssize_t nargs;
739 PyObject *args = *p_args;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000740
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200741 nargs = PyTuple_GET_SIZE(args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000742
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200743#ifdef MS_WINDOWS
744 if (nargs >= 2 && nargs <= 4) {
745 if (!PyArg_UnpackTuple(args, "OSError", 2, 4,
Antoine Pitroue0e27352011-12-15 14:31:28 +0100746 myerrno, strerror, filename, winerror))
747 return -1;
748 if (*winerror && PyLong_Check(*winerror)) {
749 long errcode, winerrcode;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200750 PyObject *newargs;
751 Py_ssize_t i;
752
Antoine Pitroue0e27352011-12-15 14:31:28 +0100753 winerrcode = PyLong_AsLong(*winerror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200754 if (winerrcode == -1 && PyErr_Occurred())
Antoine Pitroue0e27352011-12-15 14:31:28 +0100755 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200756 /* Set errno to the corresponding POSIX errno (overriding
757 first argument). Windows Socket error codes (>= 10000)
758 have the same value as their POSIX counterparts.
759 */
760 if (winerrcode < 10000)
761 errcode = winerror_to_errno(winerrcode);
762 else
763 errcode = winerrcode;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100764 *myerrno = PyLong_FromLong(errcode);
765 if (!*myerrno)
766 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200767 newargs = PyTuple_New(nargs);
768 if (!newargs)
Antoine Pitroue0e27352011-12-15 14:31:28 +0100769 return -1;
770 PyTuple_SET_ITEM(newargs, 0, *myerrno);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200771 for (i = 1; i < nargs; i++) {
772 PyObject *val = PyTuple_GET_ITEM(args, i);
773 Py_INCREF(val);
774 PyTuple_SET_ITEM(newargs, i, val);
775 }
776 Py_DECREF(args);
Antoine Pitroue0e27352011-12-15 14:31:28 +0100777 args = *p_args = newargs;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200778 }
779 }
780#else
781 if (nargs >= 2 && nargs <= 3) {
782 if (!PyArg_UnpackTuple(args, "OSError", 2, 3,
Antoine Pitroue0e27352011-12-15 14:31:28 +0100783 myerrno, strerror, filename))
784 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200785 }
786#endif
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000787
Antoine Pitroue0e27352011-12-15 14:31:28 +0100788 return 0;
789}
Thomas Wouters477c8d52006-05-27 19:21:47 +0000790
Antoine Pitroue0e27352011-12-15 14:31:28 +0100791static int
792oserror_init(PyOSErrorObject *self, PyObject **p_args,
793 PyObject *myerrno, PyObject *strerror,
794 PyObject *filename
795#ifdef MS_WINDOWS
796 , PyObject *winerror
797#endif
798 )
799{
800 PyObject *args = *p_args;
801 Py_ssize_t nargs = PyTuple_GET_SIZE(args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000802
803 /* self->filename will remain Py_None otherwise */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200804 if (filename && filename != Py_None) {
Antoine Pitroue0e27352011-12-15 14:31:28 +0100805 if (Py_TYPE(self) == (PyTypeObject *) PyExc_BlockingIOError &&
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200806 PyNumber_Check(filename)) {
807 /* BlockingIOError's 3rd argument can be the number of
808 * characters written.
809 */
810 self->written = PyNumber_AsSsize_t(filename, PyExc_ValueError);
811 if (self->written == -1 && PyErr_Occurred())
Antoine Pitroue0e27352011-12-15 14:31:28 +0100812 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200813 }
814 else {
815 Py_INCREF(filename);
816 self->filename = filename;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000817
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200818 if (nargs >= 2 && nargs <= 3) {
819 /* filename is removed from the args tuple (for compatibility
820 purposes, see test_exceptions.py) */
Antoine Pitroue0e27352011-12-15 14:31:28 +0100821 PyObject *subslice = PyTuple_GetSlice(args, 0, 2);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200822 if (!subslice)
Antoine Pitroue0e27352011-12-15 14:31:28 +0100823 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000824
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200825 Py_DECREF(args); /* replacing args */
Antoine Pitroue0e27352011-12-15 14:31:28 +0100826 *p_args = args = subslice;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200827 }
828 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000829 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200830 Py_XINCREF(myerrno);
831 self->myerrno = myerrno;
832
833 Py_XINCREF(strerror);
834 self->strerror = strerror;
835
836#ifdef MS_WINDOWS
837 Py_XINCREF(winerror);
838 self->winerror = winerror;
839#endif
840
Antoine Pitroue0e27352011-12-15 14:31:28 +0100841 /* Steals the reference to args */
842 self->args = args;
843 args = NULL;
844
845 return 0;
846}
847
848static PyObject *
849OSError_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
850static int
851OSError_init(PyOSErrorObject *self, PyObject *args, PyObject *kwds);
852
853static int
854oserror_use_init(PyTypeObject *type)
855{
856 /* When __init__ is defined in a OSError subclass, we want any
857 extraneous argument to __new__ to be ignored. The only reasonable
858 solution, given __new__ takes a variable number of arguments,
859 is to defer arg parsing and initialization to __init__.
860
861 But when __new__ is overriden as well, it should call our __new__
862 with the right arguments.
863
864 (see http://bugs.python.org/issue12555#msg148829 )
865 */
866 if (type->tp_init != (initproc) OSError_init &&
867 type->tp_new == (newfunc) OSError_new) {
868 assert((PyObject *) type != PyExc_OSError);
869 return 1;
870 }
871 return 0;
872}
873
874static PyObject *
875OSError_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
876{
877 PyOSErrorObject *self = NULL;
878 PyObject *myerrno = NULL, *strerror = NULL, *filename = NULL;
879#ifdef MS_WINDOWS
880 PyObject *winerror = NULL;
881#endif
882
883 if (!oserror_use_init(type)) {
884 if (!_PyArg_NoKeywords(type->tp_name, kwds))
885 return NULL;
886
887 Py_INCREF(args);
888 if (oserror_parse_args(&args, &myerrno, &strerror, &filename
889#ifdef MS_WINDOWS
890 , &winerror
891#endif
892 ))
893 goto error;
894
895 if (myerrno && PyLong_Check(myerrno) &&
896 errnomap && (PyObject *) type == PyExc_OSError) {
897 PyObject *newtype;
898 newtype = PyDict_GetItem(errnomap, myerrno);
899 if (newtype) {
900 assert(PyType_Check(newtype));
901 type = (PyTypeObject *) newtype;
902 }
903 else if (PyErr_Occurred())
904 goto error;
905 }
906 }
907
908 self = (PyOSErrorObject *) type->tp_alloc(type, 0);
909 if (!self)
910 goto error;
911
912 self->dict = NULL;
913 self->traceback = self->cause = self->context = NULL;
914 self->written = -1;
915
916 if (!oserror_use_init(type)) {
917 if (oserror_init(self, &args, myerrno, strerror, filename
918#ifdef MS_WINDOWS
919 , winerror
920#endif
921 ))
922 goto error;
923 }
924
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200925 return (PyObject *) self;
926
927error:
928 Py_XDECREF(args);
929 Py_XDECREF(self);
930 return NULL;
931}
932
933static int
Antoine Pitroue0e27352011-12-15 14:31:28 +0100934OSError_init(PyOSErrorObject *self, PyObject *args, PyObject *kwds)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200935{
Antoine Pitroue0e27352011-12-15 14:31:28 +0100936 PyObject *myerrno = NULL, *strerror = NULL, *filename = NULL;
937#ifdef MS_WINDOWS
938 PyObject *winerror = NULL;
939#endif
940
941 if (!oserror_use_init(Py_TYPE(self)))
942 /* Everything already done in OSError_new */
943 return 0;
944
945 if (!_PyArg_NoKeywords(Py_TYPE(self)->tp_name, kwds))
946 return -1;
947
948 Py_INCREF(args);
949 if (oserror_parse_args(&args, &myerrno, &strerror, &filename
950#ifdef MS_WINDOWS
951 , &winerror
952#endif
953 ))
954 goto error;
955
956 if (oserror_init(self, &args, myerrno, strerror, filename
957#ifdef MS_WINDOWS
958 , winerror
959#endif
960 ))
961 goto error;
962
Thomas Wouters477c8d52006-05-27 19:21:47 +0000963 return 0;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100964
965error:
966 Py_XDECREF(args);
967 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000968}
969
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000970static int
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200971OSError_clear(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000972{
973 Py_CLEAR(self->myerrno);
974 Py_CLEAR(self->strerror);
975 Py_CLEAR(self->filename);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200976#ifdef MS_WINDOWS
977 Py_CLEAR(self->winerror);
978#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000979 return BaseException_clear((PyBaseExceptionObject *)self);
980}
981
982static void
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200983OSError_dealloc(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000984{
Thomas Wouters89f507f2006-12-13 04:49:30 +0000985 _PyObject_GC_UNTRACK(self);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200986 OSError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +0000987 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000988}
989
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000990static int
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200991OSError_traverse(PyOSErrorObject *self, visitproc visit,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000992 void *arg)
993{
994 Py_VISIT(self->myerrno);
995 Py_VISIT(self->strerror);
996 Py_VISIT(self->filename);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200997#ifdef MS_WINDOWS
998 Py_VISIT(self->winerror);
999#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00001000 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1001}
1002
1003static PyObject *
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001004OSError_str(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001005{
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001006#ifdef MS_WINDOWS
1007 /* If available, winerror has the priority over myerrno */
1008 if (self->winerror && self->filename)
1009 return PyUnicode_FromFormat("[Error %S] %S: %R",
1010 self->winerror ? self->winerror: Py_None,
1011 self->strerror ? self->strerror: Py_None,
1012 self->filename);
1013 if (self->winerror && self->strerror)
1014 return PyUnicode_FromFormat("[Error %S] %S",
1015 self->winerror ? self->winerror: Py_None,
1016 self->strerror ? self->strerror: Py_None);
1017#endif
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001018 if (self->filename)
1019 return PyUnicode_FromFormat("[Errno %S] %S: %R",
1020 self->myerrno ? self->myerrno: Py_None,
1021 self->strerror ? self->strerror: Py_None,
1022 self->filename);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001023 if (self->myerrno && self->strerror)
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001024 return PyUnicode_FromFormat("[Errno %S] %S",
1025 self->myerrno ? self->myerrno: Py_None,
1026 self->strerror ? self->strerror: Py_None);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001027 return BaseException_str((PyBaseExceptionObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001028}
1029
Thomas Wouters477c8d52006-05-27 19:21:47 +00001030static PyObject *
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001031OSError_reduce(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001032{
1033 PyObject *args = self->args;
1034 PyObject *res = NULL, *tmp;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001035
Thomas Wouters477c8d52006-05-27 19:21:47 +00001036 /* self->args is only the first two real arguments if there was a
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001037 * file name given to OSError. */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001038 if (PyTuple_GET_SIZE(args) == 2 && self->filename) {
Thomas Wouters477c8d52006-05-27 19:21:47 +00001039 args = PyTuple_New(3);
Benjamin Peterson90b13582012-02-03 19:22:31 -05001040 if (!args)
1041 return NULL;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001042
1043 tmp = PyTuple_GET_ITEM(self->args, 0);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001044 Py_INCREF(tmp);
1045 PyTuple_SET_ITEM(args, 0, tmp);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001046
1047 tmp = PyTuple_GET_ITEM(self->args, 1);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001048 Py_INCREF(tmp);
1049 PyTuple_SET_ITEM(args, 1, tmp);
1050
1051 Py_INCREF(self->filename);
1052 PyTuple_SET_ITEM(args, 2, self->filename);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001053 } else
Thomas Wouters477c8d52006-05-27 19:21:47 +00001054 Py_INCREF(args);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001055
1056 if (self->dict)
Christian Heimes90aa7642007-12-19 02:45:37 +00001057 res = PyTuple_Pack(3, Py_TYPE(self), args, self->dict);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001058 else
Christian Heimes90aa7642007-12-19 02:45:37 +00001059 res = PyTuple_Pack(2, Py_TYPE(self), args);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001060 Py_DECREF(args);
1061 return res;
1062}
1063
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001064static PyObject *
1065OSError_written_get(PyOSErrorObject *self, void *context)
1066{
1067 if (self->written == -1) {
1068 PyErr_SetString(PyExc_AttributeError, "characters_written");
1069 return NULL;
1070 }
1071 return PyLong_FromSsize_t(self->written);
1072}
Thomas Wouters477c8d52006-05-27 19:21:47 +00001073
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001074static int
1075OSError_written_set(PyOSErrorObject *self, PyObject *arg, void *context)
1076{
1077 Py_ssize_t n;
1078 n = PyNumber_AsSsize_t(arg, PyExc_ValueError);
1079 if (n == -1 && PyErr_Occurred())
1080 return -1;
1081 self->written = n;
1082 return 0;
1083}
1084
1085static PyMemberDef OSError_members[] = {
1086 {"errno", T_OBJECT, offsetof(PyOSErrorObject, myerrno), 0,
1087 PyDoc_STR("POSIX exception code")},
1088 {"strerror", T_OBJECT, offsetof(PyOSErrorObject, strerror), 0,
1089 PyDoc_STR("exception strerror")},
1090 {"filename", T_OBJECT, offsetof(PyOSErrorObject, filename), 0,
1091 PyDoc_STR("exception filename")},
1092#ifdef MS_WINDOWS
1093 {"winerror", T_OBJECT, offsetof(PyOSErrorObject, winerror), 0,
1094 PyDoc_STR("Win32 exception code")},
1095#endif
1096 {NULL} /* Sentinel */
1097};
1098
1099static PyMethodDef OSError_methods[] = {
1100 {"__reduce__", (PyCFunction)OSError_reduce, METH_NOARGS},
Thomas Wouters477c8d52006-05-27 19:21:47 +00001101 {NULL}
1102};
1103
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001104static PyGetSetDef OSError_getset[] = {
1105 {"characters_written", (getter) OSError_written_get,
1106 (setter) OSError_written_set, NULL},
1107 {NULL}
1108};
1109
1110
1111ComplexExtendsException(PyExc_Exception, OSError,
1112 OSError, OSError_new,
1113 OSError_methods, OSError_members, OSError_getset,
1114 OSError_str,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001115 "Base class for I/O related errors.");
1116
1117
1118/*
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001119 * Various OSError subclasses
Thomas Wouters477c8d52006-05-27 19:21:47 +00001120 */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001121MiddlingExtendsException(PyExc_OSError, BlockingIOError, OSError,
1122 "I/O operation would block.");
1123MiddlingExtendsException(PyExc_OSError, ConnectionError, OSError,
1124 "Connection error.");
1125MiddlingExtendsException(PyExc_OSError, ChildProcessError, OSError,
1126 "Child process error.");
1127MiddlingExtendsException(PyExc_ConnectionError, BrokenPipeError, OSError,
1128 "Broken pipe.");
1129MiddlingExtendsException(PyExc_ConnectionError, ConnectionAbortedError, OSError,
1130 "Connection aborted.");
1131MiddlingExtendsException(PyExc_ConnectionError, ConnectionRefusedError, OSError,
1132 "Connection refused.");
1133MiddlingExtendsException(PyExc_ConnectionError, ConnectionResetError, OSError,
1134 "Connection reset.");
1135MiddlingExtendsException(PyExc_OSError, FileExistsError, OSError,
1136 "File already exists.");
1137MiddlingExtendsException(PyExc_OSError, FileNotFoundError, OSError,
1138 "File not found.");
1139MiddlingExtendsException(PyExc_OSError, IsADirectoryError, OSError,
1140 "Operation doesn't work on directories.");
1141MiddlingExtendsException(PyExc_OSError, NotADirectoryError, OSError,
1142 "Operation only works on directories.");
1143MiddlingExtendsException(PyExc_OSError, InterruptedError, OSError,
1144 "Interrupted by signal.");
1145MiddlingExtendsException(PyExc_OSError, PermissionError, OSError,
1146 "Not enough permissions.");
1147MiddlingExtendsException(PyExc_OSError, ProcessLookupError, OSError,
1148 "Process not found.");
1149MiddlingExtendsException(PyExc_OSError, TimeoutError, OSError,
1150 "Timeout expired.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001151
1152/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001153 * EOFError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001154 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001155SimpleExtendsException(PyExc_Exception, EOFError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001156 "Read beyond end of file.");
1157
1158
1159/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001160 * RuntimeError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001161 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001162SimpleExtendsException(PyExc_Exception, RuntimeError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001163 "Unspecified run-time error.");
1164
1165
1166/*
1167 * NotImplementedError extends RuntimeError
1168 */
1169SimpleExtendsException(PyExc_RuntimeError, NotImplementedError,
1170 "Method or function hasn't been implemented yet.");
1171
1172/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001173 * NameError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001174 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001175SimpleExtendsException(PyExc_Exception, NameError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001176 "Name not found globally.");
1177
1178/*
1179 * UnboundLocalError extends NameError
1180 */
1181SimpleExtendsException(PyExc_NameError, UnboundLocalError,
1182 "Local name referenced but not bound to a value.");
1183
1184/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001185 * AttributeError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001186 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001187SimpleExtendsException(PyExc_Exception, AttributeError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001188 "Attribute not found.");
1189
1190
1191/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001192 * SyntaxError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001193 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001194
1195static int
1196SyntaxError_init(PySyntaxErrorObject *self, PyObject *args, PyObject *kwds)
1197{
1198 PyObject *info = NULL;
1199 Py_ssize_t lenargs = PyTuple_GET_SIZE(args);
1200
1201 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1202 return -1;
1203
1204 if (lenargs >= 1) {
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001205 Py_CLEAR(self->msg);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001206 self->msg = PyTuple_GET_ITEM(args, 0);
1207 Py_INCREF(self->msg);
1208 }
1209 if (lenargs == 2) {
1210 info = PyTuple_GET_ITEM(args, 1);
1211 info = PySequence_Tuple(info);
Benjamin Peterson90b13582012-02-03 19:22:31 -05001212 if (!info)
1213 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001214
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001215 if (PyTuple_GET_SIZE(info) != 4) {
1216 /* not a very good error message, but it's what Python 2.4 gives */
1217 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
1218 Py_DECREF(info);
1219 return -1;
1220 }
1221
1222 Py_CLEAR(self->filename);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001223 self->filename = PyTuple_GET_ITEM(info, 0);
1224 Py_INCREF(self->filename);
1225
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001226 Py_CLEAR(self->lineno);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001227 self->lineno = PyTuple_GET_ITEM(info, 1);
1228 Py_INCREF(self->lineno);
1229
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001230 Py_CLEAR(self->offset);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001231 self->offset = PyTuple_GET_ITEM(info, 2);
1232 Py_INCREF(self->offset);
1233
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001234 Py_CLEAR(self->text);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001235 self->text = PyTuple_GET_ITEM(info, 3);
1236 Py_INCREF(self->text);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001237
1238 Py_DECREF(info);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001239 }
1240 return 0;
1241}
1242
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001243static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001244SyntaxError_clear(PySyntaxErrorObject *self)
1245{
1246 Py_CLEAR(self->msg);
1247 Py_CLEAR(self->filename);
1248 Py_CLEAR(self->lineno);
1249 Py_CLEAR(self->offset);
1250 Py_CLEAR(self->text);
1251 Py_CLEAR(self->print_file_and_line);
1252 return BaseException_clear((PyBaseExceptionObject *)self);
1253}
1254
1255static void
1256SyntaxError_dealloc(PySyntaxErrorObject *self)
1257{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001258 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001259 SyntaxError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +00001260 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001261}
1262
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001263static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001264SyntaxError_traverse(PySyntaxErrorObject *self, visitproc visit, void *arg)
1265{
1266 Py_VISIT(self->msg);
1267 Py_VISIT(self->filename);
1268 Py_VISIT(self->lineno);
1269 Py_VISIT(self->offset);
1270 Py_VISIT(self->text);
1271 Py_VISIT(self->print_file_and_line);
1272 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1273}
1274
1275/* This is called "my_basename" instead of just "basename" to avoid name
1276 conflicts with glibc; basename is already prototyped if _GNU_SOURCE is
1277 defined, and Python does define that. */
Victor Stinner6237daf2010-04-28 17:26:19 +00001278static PyObject*
1279my_basename(PyObject *name)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001280{
Victor Stinner6237daf2010-04-28 17:26:19 +00001281 Py_ssize_t i, size, offset;
Victor Stinner31392e72011-10-05 20:14:23 +02001282 int kind;
1283 void *data;
1284
1285 if (PyUnicode_READY(name))
1286 return NULL;
1287 kind = PyUnicode_KIND(name);
1288 data = PyUnicode_DATA(name);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001289 size = PyUnicode_GET_LENGTH(name);
Victor Stinner6237daf2010-04-28 17:26:19 +00001290 offset = 0;
1291 for(i=0; i < size; i++) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001292 if (PyUnicode_READ(kind, data, i) == SEP)
Victor Stinner6237daf2010-04-28 17:26:19 +00001293 offset = i + 1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001294 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001295 if (offset != 0)
1296 return PyUnicode_Substring(name, offset, size);
1297 else {
Victor Stinner6237daf2010-04-28 17:26:19 +00001298 Py_INCREF(name);
1299 return name;
1300 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001301}
1302
1303
1304static PyObject *
1305SyntaxError_str(PySyntaxErrorObject *self)
1306{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001307 int have_lineno = 0;
Victor Stinner6237daf2010-04-28 17:26:19 +00001308 PyObject *filename;
1309 PyObject *result;
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001310 /* Below, we always ignore overflow errors, just printing -1.
1311 Still, we cannot allow an OverflowError to be raised, so
1312 we need to call PyLong_AsLongAndOverflow. */
1313 int overflow;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001314
1315 /* XXX -- do all the additional formatting with filename and
1316 lineno here */
1317
Neal Norwitzed2b7392007-08-26 04:51:10 +00001318 if (self->filename && PyUnicode_Check(self->filename)) {
Victor Stinner6237daf2010-04-28 17:26:19 +00001319 filename = my_basename(self->filename);
1320 if (filename == NULL)
1321 return NULL;
1322 } else {
1323 filename = NULL;
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001324 }
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001325 have_lineno = (self->lineno != NULL) && PyLong_CheckExact(self->lineno);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001326
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001327 if (!filename && !have_lineno)
Thomas Heller519a0422007-11-15 20:48:54 +00001328 return PyObject_Str(self->msg ? self->msg : Py_None);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001329
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001330 if (filename && have_lineno)
Victor Stinner6237daf2010-04-28 17:26:19 +00001331 result = PyUnicode_FromFormat("%S (%U, line %ld)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001332 self->msg ? self->msg : Py_None,
Victor Stinner6237daf2010-04-28 17:26:19 +00001333 filename,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001334 PyLong_AsLongAndOverflow(self->lineno, &overflow));
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001335 else if (filename)
Victor Stinner6237daf2010-04-28 17:26:19 +00001336 result = PyUnicode_FromFormat("%S (%U)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001337 self->msg ? self->msg : Py_None,
Victor Stinner6237daf2010-04-28 17:26:19 +00001338 filename);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001339 else /* only have_lineno */
Victor Stinner6237daf2010-04-28 17:26:19 +00001340 result = PyUnicode_FromFormat("%S (line %ld)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001341 self->msg ? self->msg : Py_None,
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001342 PyLong_AsLongAndOverflow(self->lineno, &overflow));
Victor Stinner6237daf2010-04-28 17:26:19 +00001343 Py_XDECREF(filename);
1344 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001345}
1346
1347static PyMemberDef SyntaxError_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +00001348 {"msg", T_OBJECT, offsetof(PySyntaxErrorObject, msg), 0,
1349 PyDoc_STR("exception msg")},
1350 {"filename", T_OBJECT, offsetof(PySyntaxErrorObject, filename), 0,
1351 PyDoc_STR("exception filename")},
1352 {"lineno", T_OBJECT, offsetof(PySyntaxErrorObject, lineno), 0,
1353 PyDoc_STR("exception lineno")},
1354 {"offset", T_OBJECT, offsetof(PySyntaxErrorObject, offset), 0,
1355 PyDoc_STR("exception offset")},
1356 {"text", T_OBJECT, offsetof(PySyntaxErrorObject, text), 0,
1357 PyDoc_STR("exception text")},
1358 {"print_file_and_line", T_OBJECT,
1359 offsetof(PySyntaxErrorObject, print_file_and_line), 0,
1360 PyDoc_STR("exception print_file_and_line")},
1361 {NULL} /* Sentinel */
1362};
1363
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001364ComplexExtendsException(PyExc_Exception, SyntaxError, SyntaxError,
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001365 0, 0, SyntaxError_members, 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001366 SyntaxError_str, "Invalid syntax.");
1367
1368
1369/*
1370 * IndentationError extends SyntaxError
1371 */
1372MiddlingExtendsException(PyExc_SyntaxError, IndentationError, SyntaxError,
1373 "Improper indentation.");
1374
1375
1376/*
1377 * TabError extends IndentationError
1378 */
1379MiddlingExtendsException(PyExc_IndentationError, TabError, SyntaxError,
1380 "Improper mixture of spaces and tabs.");
1381
1382
1383/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001384 * LookupError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001385 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001386SimpleExtendsException(PyExc_Exception, LookupError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001387 "Base class for lookup errors.");
1388
1389
1390/*
1391 * IndexError extends LookupError
1392 */
1393SimpleExtendsException(PyExc_LookupError, IndexError,
1394 "Sequence index out of range.");
1395
1396
1397/*
1398 * KeyError extends LookupError
1399 */
1400static PyObject *
1401KeyError_str(PyBaseExceptionObject *self)
1402{
1403 /* If args is a tuple of exactly one item, apply repr to args[0].
1404 This is done so that e.g. the exception raised by {}[''] prints
1405 KeyError: ''
1406 rather than the confusing
1407 KeyError
1408 alone. The downside is that if KeyError is raised with an explanatory
1409 string, that string will be displayed in quotes. Too bad.
1410 If args is anything else, use the default BaseException__str__().
1411 */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001412 if (PyTuple_GET_SIZE(self->args) == 1) {
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001413 return PyObject_Repr(PyTuple_GET_ITEM(self->args, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001414 }
1415 return BaseException_str(self);
1416}
1417
1418ComplexExtendsException(PyExc_LookupError, KeyError, BaseException,
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001419 0, 0, 0, 0, KeyError_str, "Mapping key not found.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001420
1421
1422/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001423 * ValueError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001424 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001425SimpleExtendsException(PyExc_Exception, ValueError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001426 "Inappropriate argument value (of correct type).");
1427
1428/*
1429 * UnicodeError extends ValueError
1430 */
1431
1432SimpleExtendsException(PyExc_ValueError, UnicodeError,
1433 "Unicode related error.");
1434
Thomas Wouters477c8d52006-05-27 19:21:47 +00001435static PyObject *
Guido van Rossum98297ee2007-11-06 21:34:58 +00001436get_string(PyObject *attr, const char *name)
Walter Dörwald612344f2007-05-04 19:28:21 +00001437{
1438 if (!attr) {
1439 PyErr_Format(PyExc_TypeError, "%.200s attribute not set", name);
1440 return NULL;
1441 }
1442
Christian Heimes72b710a2008-05-26 13:28:38 +00001443 if (!PyBytes_Check(attr)) {
Walter Dörwald612344f2007-05-04 19:28:21 +00001444 PyErr_Format(PyExc_TypeError, "%.200s attribute must be bytes", name);
1445 return NULL;
1446 }
1447 Py_INCREF(attr);
1448 return attr;
1449}
1450
1451static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00001452get_unicode(PyObject *attr, const char *name)
1453{
1454 if (!attr) {
1455 PyErr_Format(PyExc_TypeError, "%.200s attribute not set", name);
1456 return NULL;
1457 }
1458
1459 if (!PyUnicode_Check(attr)) {
1460 PyErr_Format(PyExc_TypeError,
1461 "%.200s attribute must be unicode", name);
1462 return NULL;
1463 }
1464 Py_INCREF(attr);
1465 return attr;
1466}
1467
Walter Dörwaldd2034312007-05-18 16:29:38 +00001468static int
1469set_unicodefromstring(PyObject **attr, const char *value)
1470{
1471 PyObject *obj = PyUnicode_FromString(value);
1472 if (!obj)
1473 return -1;
1474 Py_CLEAR(*attr);
1475 *attr = obj;
1476 return 0;
1477}
1478
Thomas Wouters477c8d52006-05-27 19:21:47 +00001479PyObject *
1480PyUnicodeEncodeError_GetEncoding(PyObject *exc)
1481{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001482 return get_unicode(((PyUnicodeErrorObject *)exc)->encoding, "encoding");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001483}
1484
1485PyObject *
1486PyUnicodeDecodeError_GetEncoding(PyObject *exc)
1487{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001488 return get_unicode(((PyUnicodeErrorObject *)exc)->encoding, "encoding");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001489}
1490
1491PyObject *
1492PyUnicodeEncodeError_GetObject(PyObject *exc)
1493{
1494 return get_unicode(((PyUnicodeErrorObject *)exc)->object, "object");
1495}
1496
1497PyObject *
1498PyUnicodeDecodeError_GetObject(PyObject *exc)
1499{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001500 return get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001501}
1502
1503PyObject *
1504PyUnicodeTranslateError_GetObject(PyObject *exc)
1505{
1506 return get_unicode(((PyUnicodeErrorObject *)exc)->object, "object");
1507}
1508
1509int
1510PyUnicodeEncodeError_GetStart(PyObject *exc, Py_ssize_t *start)
1511{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001512 Py_ssize_t size;
1513 PyObject *obj = get_unicode(((PyUnicodeErrorObject *)exc)->object,
1514 "object");
1515 if (!obj)
1516 return -1;
1517 *start = ((PyUnicodeErrorObject *)exc)->start;
Victor Stinner9e30aa52011-11-21 02:49:52 +01001518 size = PyUnicode_GET_LENGTH(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001519 if (*start<0)
1520 *start = 0; /*XXX check for values <0*/
1521 if (*start>=size)
1522 *start = size-1;
1523 Py_DECREF(obj);
1524 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001525}
1526
1527
1528int
1529PyUnicodeDecodeError_GetStart(PyObject *exc, Py_ssize_t *start)
1530{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001531 Py_ssize_t size;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001532 PyObject *obj = get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001533 if (!obj)
1534 return -1;
Christian Heimes72b710a2008-05-26 13:28:38 +00001535 size = PyBytes_GET_SIZE(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001536 *start = ((PyUnicodeErrorObject *)exc)->start;
1537 if (*start<0)
1538 *start = 0;
1539 if (*start>=size)
1540 *start = size-1;
1541 Py_DECREF(obj);
1542 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001543}
1544
1545
1546int
1547PyUnicodeTranslateError_GetStart(PyObject *exc, Py_ssize_t *start)
1548{
1549 return PyUnicodeEncodeError_GetStart(exc, start);
1550}
1551
1552
1553int
1554PyUnicodeEncodeError_SetStart(PyObject *exc, Py_ssize_t start)
1555{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001556 ((PyUnicodeErrorObject *)exc)->start = start;
1557 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001558}
1559
1560
1561int
1562PyUnicodeDecodeError_SetStart(PyObject *exc, Py_ssize_t start)
1563{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001564 ((PyUnicodeErrorObject *)exc)->start = start;
1565 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001566}
1567
1568
1569int
1570PyUnicodeTranslateError_SetStart(PyObject *exc, Py_ssize_t start)
1571{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001572 ((PyUnicodeErrorObject *)exc)->start = start;
1573 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001574}
1575
1576
1577int
1578PyUnicodeEncodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
1579{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001580 Py_ssize_t size;
1581 PyObject *obj = get_unicode(((PyUnicodeErrorObject *)exc)->object,
1582 "object");
1583 if (!obj)
1584 return -1;
1585 *end = ((PyUnicodeErrorObject *)exc)->end;
Victor Stinner9e30aa52011-11-21 02:49:52 +01001586 size = PyUnicode_GET_LENGTH(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001587 if (*end<1)
1588 *end = 1;
1589 if (*end>size)
1590 *end = size;
1591 Py_DECREF(obj);
1592 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001593}
1594
1595
1596int
1597PyUnicodeDecodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
1598{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001599 Py_ssize_t size;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001600 PyObject *obj = get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001601 if (!obj)
1602 return -1;
Christian Heimes72b710a2008-05-26 13:28:38 +00001603 size = PyBytes_GET_SIZE(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001604 *end = ((PyUnicodeErrorObject *)exc)->end;
1605 if (*end<1)
1606 *end = 1;
1607 if (*end>size)
1608 *end = size;
1609 Py_DECREF(obj);
1610 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001611}
1612
1613
1614int
1615PyUnicodeTranslateError_GetEnd(PyObject *exc, Py_ssize_t *start)
1616{
1617 return PyUnicodeEncodeError_GetEnd(exc, start);
1618}
1619
1620
1621int
1622PyUnicodeEncodeError_SetEnd(PyObject *exc, Py_ssize_t end)
1623{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001624 ((PyUnicodeErrorObject *)exc)->end = end;
1625 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001626}
1627
1628
1629int
1630PyUnicodeDecodeError_SetEnd(PyObject *exc, Py_ssize_t end)
1631{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001632 ((PyUnicodeErrorObject *)exc)->end = end;
1633 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001634}
1635
1636
1637int
1638PyUnicodeTranslateError_SetEnd(PyObject *exc, Py_ssize_t end)
1639{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001640 ((PyUnicodeErrorObject *)exc)->end = end;
1641 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001642}
1643
1644PyObject *
1645PyUnicodeEncodeError_GetReason(PyObject *exc)
1646{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001647 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001648}
1649
1650
1651PyObject *
1652PyUnicodeDecodeError_GetReason(PyObject *exc)
1653{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001654 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001655}
1656
1657
1658PyObject *
1659PyUnicodeTranslateError_GetReason(PyObject *exc)
1660{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001661 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001662}
1663
1664
1665int
1666PyUnicodeEncodeError_SetReason(PyObject *exc, const char *reason)
1667{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001668 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1669 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001670}
1671
1672
1673int
1674PyUnicodeDecodeError_SetReason(PyObject *exc, const char *reason)
1675{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001676 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1677 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001678}
1679
1680
1681int
1682PyUnicodeTranslateError_SetReason(PyObject *exc, const char *reason)
1683{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001684 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1685 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001686}
1687
1688
Thomas Wouters477c8d52006-05-27 19:21:47 +00001689static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001690UnicodeError_clear(PyUnicodeErrorObject *self)
1691{
1692 Py_CLEAR(self->encoding);
1693 Py_CLEAR(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001694 Py_CLEAR(self->reason);
1695 return BaseException_clear((PyBaseExceptionObject *)self);
1696}
1697
1698static void
1699UnicodeError_dealloc(PyUnicodeErrorObject *self)
1700{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001701 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001702 UnicodeError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +00001703 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001704}
1705
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001706static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001707UnicodeError_traverse(PyUnicodeErrorObject *self, visitproc visit, void *arg)
1708{
1709 Py_VISIT(self->encoding);
1710 Py_VISIT(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001711 Py_VISIT(self->reason);
1712 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1713}
1714
1715static PyMemberDef UnicodeError_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +00001716 {"encoding", T_OBJECT, offsetof(PyUnicodeErrorObject, encoding), 0,
1717 PyDoc_STR("exception encoding")},
1718 {"object", T_OBJECT, offsetof(PyUnicodeErrorObject, object), 0,
1719 PyDoc_STR("exception object")},
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001720 {"start", T_PYSSIZET, offsetof(PyUnicodeErrorObject, start), 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001721 PyDoc_STR("exception start")},
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001722 {"end", T_PYSSIZET, offsetof(PyUnicodeErrorObject, end), 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001723 PyDoc_STR("exception end")},
1724 {"reason", T_OBJECT, offsetof(PyUnicodeErrorObject, reason), 0,
1725 PyDoc_STR("exception reason")},
1726 {NULL} /* Sentinel */
1727};
1728
1729
1730/*
1731 * UnicodeEncodeError extends UnicodeError
1732 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001733
1734static int
1735UnicodeEncodeError_init(PyObject *self, PyObject *args, PyObject *kwds)
1736{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001737 PyUnicodeErrorObject *err;
1738
Thomas Wouters477c8d52006-05-27 19:21:47 +00001739 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1740 return -1;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001741
1742 err = (PyUnicodeErrorObject *)self;
1743
1744 Py_CLEAR(err->encoding);
1745 Py_CLEAR(err->object);
1746 Py_CLEAR(err->reason);
1747
1748 if (!PyArg_ParseTuple(args, "O!O!nnO!",
1749 &PyUnicode_Type, &err->encoding,
1750 &PyUnicode_Type, &err->object,
1751 &err->start,
1752 &err->end,
1753 &PyUnicode_Type, &err->reason)) {
1754 err->encoding = err->object = err->reason = NULL;
1755 return -1;
1756 }
1757
Martin v. Löwisb09af032011-11-04 11:16:41 +01001758 if (PyUnicode_READY(err->object) < -1) {
1759 err->encoding = NULL;
1760 return -1;
1761 }
1762
Guido van Rossum98297ee2007-11-06 21:34:58 +00001763 Py_INCREF(err->encoding);
1764 Py_INCREF(err->object);
1765 Py_INCREF(err->reason);
1766
1767 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001768}
1769
1770static PyObject *
1771UnicodeEncodeError_str(PyObject *self)
1772{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001773 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00001774 PyObject *result = NULL;
1775 PyObject *reason_str = NULL;
1776 PyObject *encoding_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001777
Eric Smith0facd772010-02-24 15:42:29 +00001778 /* Get reason and encoding as strings, which they might not be if
1779 they've been modified after we were contructed. */
1780 reason_str = PyObject_Str(uself->reason);
1781 if (reason_str == NULL)
1782 goto done;
1783 encoding_str = PyObject_Str(uself->encoding);
1784 if (encoding_str == NULL)
1785 goto done;
1786
Victor Stinnerda1ddf32011-11-20 22:50:23 +01001787 if (uself->start < PyUnicode_GET_LENGTH(uself->object) && uself->end == uself->start+1) {
1788 Py_UCS4 badchar = PyUnicode_ReadChar(uself->object, uself->start);
Walter Dörwald787b03b2007-06-05 13:29:29 +00001789 const char *fmt;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001790 if (badchar <= 0xff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00001791 fmt = "'%U' codec can't encode character '\\x%02x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001792 else if (badchar <= 0xffff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00001793 fmt = "'%U' codec can't encode character '\\u%04x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001794 else
Walter Dörwald32a4c712007-06-20 09:25:34 +00001795 fmt = "'%U' codec can't encode character '\\U%08x' in position %zd: %U";
Eric Smith0facd772010-02-24 15:42:29 +00001796 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00001797 fmt,
Eric Smith0facd772010-02-24 15:42:29 +00001798 encoding_str,
Victor Stinnerda1ddf32011-11-20 22:50:23 +01001799 (int)badchar,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001800 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00001801 reason_str);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001802 }
Eric Smith0facd772010-02-24 15:42:29 +00001803 else {
1804 result = PyUnicode_FromFormat(
1805 "'%U' codec can't encode characters in position %zd-%zd: %U",
1806 encoding_str,
1807 uself->start,
1808 uself->end-1,
1809 reason_str);
1810 }
1811done:
1812 Py_XDECREF(reason_str);
1813 Py_XDECREF(encoding_str);
1814 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001815}
1816
1817static PyTypeObject _PyExc_UnicodeEncodeError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001818 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00001819 "UnicodeEncodeError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00001820 sizeof(PyUnicodeErrorObject), 0,
1821 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1822 (reprfunc)UnicodeEncodeError_str, 0, 0, 0,
1823 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001824 PyDoc_STR("Unicode encoding error."), (traverseproc)UnicodeError_traverse,
1825 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001826 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001827 (initproc)UnicodeEncodeError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001828};
1829PyObject *PyExc_UnicodeEncodeError = (PyObject *)&_PyExc_UnicodeEncodeError;
1830
1831PyObject *
1832PyUnicodeEncodeError_Create(
1833 const char *encoding, const Py_UNICODE *object, Py_ssize_t length,
1834 Py_ssize_t start, Py_ssize_t end, const char *reason)
1835{
Victor Stinner7eeb5b52010-06-07 19:57:46 +00001836 return PyObject_CallFunction(PyExc_UnicodeEncodeError, "su#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001837 encoding, object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001838}
1839
1840
1841/*
1842 * UnicodeDecodeError extends UnicodeError
1843 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001844
1845static int
1846UnicodeDecodeError_init(PyObject *self, PyObject *args, PyObject *kwds)
1847{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001848 PyUnicodeErrorObject *ude;
1849 const char *data;
1850 Py_ssize_t size;
1851
Thomas Wouters477c8d52006-05-27 19:21:47 +00001852 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1853 return -1;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001854
1855 ude = (PyUnicodeErrorObject *)self;
1856
1857 Py_CLEAR(ude->encoding);
1858 Py_CLEAR(ude->object);
1859 Py_CLEAR(ude->reason);
1860
1861 if (!PyArg_ParseTuple(args, "O!OnnO!",
1862 &PyUnicode_Type, &ude->encoding,
1863 &ude->object,
1864 &ude->start,
1865 &ude->end,
1866 &PyUnicode_Type, &ude->reason)) {
1867 ude->encoding = ude->object = ude->reason = NULL;
1868 return -1;
1869 }
1870
Christian Heimes72b710a2008-05-26 13:28:38 +00001871 if (!PyBytes_Check(ude->object)) {
Guido van Rossum98297ee2007-11-06 21:34:58 +00001872 if (PyObject_AsReadBuffer(ude->object, (const void **)&data, &size)) {
1873 ude->encoding = ude->object = ude->reason = NULL;
1874 return -1;
1875 }
Christian Heimes72b710a2008-05-26 13:28:38 +00001876 ude->object = PyBytes_FromStringAndSize(data, size);
Guido van Rossum98297ee2007-11-06 21:34:58 +00001877 }
1878 else {
1879 Py_INCREF(ude->object);
1880 }
1881
1882 Py_INCREF(ude->encoding);
1883 Py_INCREF(ude->reason);
1884
1885 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001886}
1887
1888static PyObject *
1889UnicodeDecodeError_str(PyObject *self)
1890{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001891 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00001892 PyObject *result = NULL;
1893 PyObject *reason_str = NULL;
1894 PyObject *encoding_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001895
Eric Smith0facd772010-02-24 15:42:29 +00001896 /* Get reason and encoding as strings, which they might not be if
1897 they've been modified after we were contructed. */
1898 reason_str = PyObject_Str(uself->reason);
1899 if (reason_str == NULL)
1900 goto done;
1901 encoding_str = PyObject_Str(uself->encoding);
1902 if (encoding_str == NULL)
1903 goto done;
1904
1905 if (uself->start < PyBytes_GET_SIZE(uself->object) && uself->end == uself->start+1) {
Christian Heimes72b710a2008-05-26 13:28:38 +00001906 int byte = (int)(PyBytes_AS_STRING(((PyUnicodeErrorObject *)self)->object)[uself->start]&0xff);
Eric Smith0facd772010-02-24 15:42:29 +00001907 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00001908 "'%U' codec can't decode byte 0x%02x in position %zd: %U",
Eric Smith0facd772010-02-24 15:42:29 +00001909 encoding_str,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001910 byte,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001911 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00001912 reason_str);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001913 }
Eric Smith0facd772010-02-24 15:42:29 +00001914 else {
1915 result = PyUnicode_FromFormat(
1916 "'%U' codec can't decode bytes in position %zd-%zd: %U",
1917 encoding_str,
1918 uself->start,
1919 uself->end-1,
1920 reason_str
1921 );
1922 }
1923done:
1924 Py_XDECREF(reason_str);
1925 Py_XDECREF(encoding_str);
1926 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001927}
1928
1929static PyTypeObject _PyExc_UnicodeDecodeError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001930 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00001931 "UnicodeDecodeError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00001932 sizeof(PyUnicodeErrorObject), 0,
1933 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1934 (reprfunc)UnicodeDecodeError_str, 0, 0, 0,
1935 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001936 PyDoc_STR("Unicode decoding error."), (traverseproc)UnicodeError_traverse,
1937 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001938 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001939 (initproc)UnicodeDecodeError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001940};
1941PyObject *PyExc_UnicodeDecodeError = (PyObject *)&_PyExc_UnicodeDecodeError;
1942
1943PyObject *
1944PyUnicodeDecodeError_Create(
1945 const char *encoding, const char *object, Py_ssize_t length,
1946 Py_ssize_t start, Py_ssize_t end, const char *reason)
1947{
Victor Stinner7eeb5b52010-06-07 19:57:46 +00001948 return PyObject_CallFunction(PyExc_UnicodeDecodeError, "sy#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001949 encoding, object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001950}
1951
1952
1953/*
1954 * UnicodeTranslateError extends UnicodeError
1955 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001956
1957static int
1958UnicodeTranslateError_init(PyUnicodeErrorObject *self, PyObject *args,
1959 PyObject *kwds)
1960{
1961 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1962 return -1;
1963
1964 Py_CLEAR(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001965 Py_CLEAR(self->reason);
1966
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001967 if (!PyArg_ParseTuple(args, "O!nnO!",
Thomas Wouters477c8d52006-05-27 19:21:47 +00001968 &PyUnicode_Type, &self->object,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001969 &self->start,
1970 &self->end,
Walter Dörwaldd2034312007-05-18 16:29:38 +00001971 &PyUnicode_Type, &self->reason)) {
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001972 self->object = self->reason = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001973 return -1;
1974 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001975
Thomas Wouters477c8d52006-05-27 19:21:47 +00001976 Py_INCREF(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001977 Py_INCREF(self->reason);
1978
1979 return 0;
1980}
1981
1982
1983static PyObject *
1984UnicodeTranslateError_str(PyObject *self)
1985{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001986 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00001987 PyObject *result = NULL;
1988 PyObject *reason_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001989
Eric Smith0facd772010-02-24 15:42:29 +00001990 /* Get reason as a string, which it might not be if it's been
1991 modified after we were contructed. */
1992 reason_str = PyObject_Str(uself->reason);
1993 if (reason_str == NULL)
1994 goto done;
1995
Victor Stinner53b33e72011-11-21 01:17:27 +01001996 if (uself->start < PyUnicode_GET_LENGTH(uself->object) && uself->end == uself->start+1) {
1997 Py_UCS4 badchar = PyUnicode_ReadChar(uself->object, uself->start);
Walter Dörwald787b03b2007-06-05 13:29:29 +00001998 const char *fmt;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001999 if (badchar <= 0xff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00002000 fmt = "can't translate character '\\x%02x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002001 else if (badchar <= 0xffff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00002002 fmt = "can't translate character '\\u%04x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002003 else
Walter Dörwald32a4c712007-06-20 09:25:34 +00002004 fmt = "can't translate character '\\U%08x' in position %zd: %U";
Benjamin Petersonc5f4e1e2010-02-25 01:22:28 +00002005 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00002006 fmt,
Victor Stinner53b33e72011-11-21 01:17:27 +01002007 (int)badchar,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002008 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00002009 reason_str
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002010 );
Eric Smith0facd772010-02-24 15:42:29 +00002011 } else {
2012 result = PyUnicode_FromFormat(
2013 "can't translate characters in position %zd-%zd: %U",
2014 uself->start,
2015 uself->end-1,
2016 reason_str
2017 );
Thomas Wouters477c8d52006-05-27 19:21:47 +00002018 }
Eric Smith0facd772010-02-24 15:42:29 +00002019done:
2020 Py_XDECREF(reason_str);
2021 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002022}
2023
2024static PyTypeObject _PyExc_UnicodeTranslateError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002025 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00002026 "UnicodeTranslateError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00002027 sizeof(PyUnicodeErrorObject), 0,
2028 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2029 (reprfunc)UnicodeTranslateError_str, 0, 0, 0,
2030 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters89f507f2006-12-13 04:49:30 +00002031 PyDoc_STR("Unicode translation error."), (traverseproc)UnicodeError_traverse,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002032 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
2033 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002034 (initproc)UnicodeTranslateError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002035};
2036PyObject *PyExc_UnicodeTranslateError = (PyObject *)&_PyExc_UnicodeTranslateError;
2037
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002038/* Deprecated. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002039PyObject *
2040PyUnicodeTranslateError_Create(
2041 const Py_UNICODE *object, Py_ssize_t length,
2042 Py_ssize_t start, Py_ssize_t end, const char *reason)
2043{
2044 return PyObject_CallFunction(PyExc_UnicodeTranslateError, "u#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002045 object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002046}
Thomas Wouters477c8d52006-05-27 19:21:47 +00002047
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002048PyObject *
2049_PyUnicodeTranslateError_Create(
2050 PyObject *object,
2051 Py_ssize_t start, Py_ssize_t end, const char *reason)
2052{
2053 return PyObject_CallFunction(PyExc_UnicodeTranslateError, "Ons",
2054 object, start, end, reason);
2055}
Thomas Wouters477c8d52006-05-27 19:21:47 +00002056
2057/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002058 * AssertionError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002059 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002060SimpleExtendsException(PyExc_Exception, AssertionError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002061 "Assertion failed.");
2062
2063
2064/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002065 * ArithmeticError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002066 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002067SimpleExtendsException(PyExc_Exception, ArithmeticError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002068 "Base class for arithmetic errors.");
2069
2070
2071/*
2072 * FloatingPointError extends ArithmeticError
2073 */
2074SimpleExtendsException(PyExc_ArithmeticError, FloatingPointError,
2075 "Floating point operation failed.");
2076
2077
2078/*
2079 * OverflowError extends ArithmeticError
2080 */
2081SimpleExtendsException(PyExc_ArithmeticError, OverflowError,
2082 "Result too large to be represented.");
2083
2084
2085/*
2086 * ZeroDivisionError extends ArithmeticError
2087 */
2088SimpleExtendsException(PyExc_ArithmeticError, ZeroDivisionError,
2089 "Second argument to a division or modulo operation was zero.");
2090
2091
2092/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002093 * SystemError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002094 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002095SimpleExtendsException(PyExc_Exception, SystemError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002096 "Internal error in the Python interpreter.\n"
2097 "\n"
2098 "Please report this to the Python maintainer, along with the traceback,\n"
2099 "the Python version, and the hardware/OS platform and version.");
2100
2101
2102/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002103 * ReferenceError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002104 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002105SimpleExtendsException(PyExc_Exception, ReferenceError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002106 "Weak ref proxy used after referent went away.");
2107
2108
2109/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002110 * MemoryError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002111 */
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002112
2113#define MEMERRORS_SAVE 16
2114static PyBaseExceptionObject *memerrors_freelist = NULL;
2115static int memerrors_numfree = 0;
2116
2117static PyObject *
2118MemoryError_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2119{
2120 PyBaseExceptionObject *self;
2121
2122 if (type != (PyTypeObject *) PyExc_MemoryError)
2123 return BaseException_new(type, args, kwds);
2124 if (memerrors_freelist == NULL)
2125 return BaseException_new(type, args, kwds);
2126 /* Fetch object from freelist and revive it */
2127 self = memerrors_freelist;
2128 self->args = PyTuple_New(0);
2129 /* This shouldn't happen since the empty tuple is persistent */
2130 if (self->args == NULL)
2131 return NULL;
2132 memerrors_freelist = (PyBaseExceptionObject *) self->dict;
2133 memerrors_numfree--;
2134 self->dict = NULL;
2135 _Py_NewReference((PyObject *)self);
2136 _PyObject_GC_TRACK(self);
2137 return (PyObject *)self;
2138}
2139
2140static void
2141MemoryError_dealloc(PyBaseExceptionObject *self)
2142{
2143 _PyObject_GC_UNTRACK(self);
2144 BaseException_clear(self);
2145 if (memerrors_numfree >= MEMERRORS_SAVE)
2146 Py_TYPE(self)->tp_free((PyObject *)self);
2147 else {
2148 self->dict = (PyObject *) memerrors_freelist;
2149 memerrors_freelist = self;
2150 memerrors_numfree++;
2151 }
2152}
2153
2154static void
2155preallocate_memerrors(void)
2156{
2157 /* We create enough MemoryErrors and then decref them, which will fill
2158 up the freelist. */
2159 int i;
2160 PyObject *errors[MEMERRORS_SAVE];
2161 for (i = 0; i < MEMERRORS_SAVE; i++) {
2162 errors[i] = MemoryError_new((PyTypeObject *) PyExc_MemoryError,
2163 NULL, NULL);
2164 if (!errors[i])
2165 Py_FatalError("Could not preallocate MemoryError object");
2166 }
2167 for (i = 0; i < MEMERRORS_SAVE; i++) {
2168 Py_DECREF(errors[i]);
2169 }
2170}
2171
2172static void
2173free_preallocated_memerrors(void)
2174{
2175 while (memerrors_freelist != NULL) {
2176 PyObject *self = (PyObject *) memerrors_freelist;
2177 memerrors_freelist = (PyBaseExceptionObject *) memerrors_freelist->dict;
2178 Py_TYPE(self)->tp_free((PyObject *)self);
2179 }
2180}
2181
2182
2183static PyTypeObject _PyExc_MemoryError = {
2184 PyVarObject_HEAD_INIT(NULL, 0)
2185 "MemoryError",
2186 sizeof(PyBaseExceptionObject),
2187 0, (destructor)MemoryError_dealloc, 0, 0, 0, 0, 0, 0, 0,
2188 0, 0, 0, 0, 0, 0, 0,
2189 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
2190 PyDoc_STR("Out of memory."), (traverseproc)BaseException_traverse,
2191 (inquiry)BaseException_clear, 0, 0, 0, 0, 0, 0, 0, &_PyExc_Exception,
2192 0, 0, 0, offsetof(PyBaseExceptionObject, dict),
2193 (initproc)BaseException_init, 0, MemoryError_new
2194};
2195PyObject *PyExc_MemoryError = (PyObject *) &_PyExc_MemoryError;
2196
Thomas Wouters477c8d52006-05-27 19:21:47 +00002197
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002198/*
2199 * BufferError extends Exception
2200 */
2201SimpleExtendsException(PyExc_Exception, BufferError, "Buffer error.");
2202
Thomas Wouters477c8d52006-05-27 19:21:47 +00002203
2204/* Warning category docstrings */
2205
2206/*
2207 * Warning extends Exception
2208 */
2209SimpleExtendsException(PyExc_Exception, Warning,
2210 "Base class for warning categories.");
2211
2212
2213/*
2214 * UserWarning extends Warning
2215 */
2216SimpleExtendsException(PyExc_Warning, UserWarning,
2217 "Base class for warnings generated by user code.");
2218
2219
2220/*
2221 * DeprecationWarning extends Warning
2222 */
2223SimpleExtendsException(PyExc_Warning, DeprecationWarning,
2224 "Base class for warnings about deprecated features.");
2225
2226
2227/*
2228 * PendingDeprecationWarning extends Warning
2229 */
2230SimpleExtendsException(PyExc_Warning, PendingDeprecationWarning,
2231 "Base class for warnings about features which will be deprecated\n"
2232 "in the future.");
2233
2234
2235/*
2236 * SyntaxWarning extends Warning
2237 */
2238SimpleExtendsException(PyExc_Warning, SyntaxWarning,
2239 "Base class for warnings about dubious syntax.");
2240
2241
2242/*
2243 * RuntimeWarning extends Warning
2244 */
2245SimpleExtendsException(PyExc_Warning, RuntimeWarning,
2246 "Base class for warnings about dubious runtime behavior.");
2247
2248
2249/*
2250 * FutureWarning extends Warning
2251 */
2252SimpleExtendsException(PyExc_Warning, FutureWarning,
2253 "Base class for warnings about constructs that will change semantically\n"
2254 "in the future.");
2255
2256
2257/*
2258 * ImportWarning extends Warning
2259 */
2260SimpleExtendsException(PyExc_Warning, ImportWarning,
2261 "Base class for warnings about probable mistakes in module imports");
2262
2263
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002264/*
2265 * UnicodeWarning extends Warning
2266 */
2267SimpleExtendsException(PyExc_Warning, UnicodeWarning,
2268 "Base class for warnings about Unicode related problems, mostly\n"
2269 "related to conversion problems.");
2270
Georg Brandl08be72d2010-10-24 15:11:22 +00002271
Guido van Rossum98297ee2007-11-06 21:34:58 +00002272/*
2273 * BytesWarning extends Warning
2274 */
2275SimpleExtendsException(PyExc_Warning, BytesWarning,
2276 "Base class for warnings about bytes and buffer related problems, mostly\n"
2277 "related to conversion from str or comparing to str.");
2278
2279
Georg Brandl08be72d2010-10-24 15:11:22 +00002280/*
2281 * ResourceWarning extends Warning
2282 */
2283SimpleExtendsException(PyExc_Warning, ResourceWarning,
2284 "Base class for warnings about resource usage.");
2285
2286
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002287
Thomas Wouters89d996e2007-09-08 17:39:28 +00002288/* Pre-computed RuntimeError instance for when recursion depth is reached.
2289 Meant to be used when normalizing the exception for exceeding the recursion
2290 depth will cause its own infinite recursion.
2291*/
2292PyObject *PyExc_RecursionErrorInst = NULL;
2293
Antoine Pitrou55f217f2012-01-18 21:23:13 +01002294#define PRE_INIT(TYPE) \
2295 if (!(_PyExc_ ## TYPE.tp_flags & Py_TPFLAGS_READY)) { \
2296 if (PyType_Ready(&_PyExc_ ## TYPE) < 0) \
2297 Py_FatalError("exceptions bootstrapping error."); \
2298 Py_INCREF(PyExc_ ## TYPE); \
2299 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002300
Antoine Pitrou55f217f2012-01-18 21:23:13 +01002301#define POST_INIT(TYPE) \
Thomas Wouters477c8d52006-05-27 19:21:47 +00002302 if (PyDict_SetItemString(bdict, # TYPE, PyExc_ ## TYPE)) \
2303 Py_FatalError("Module dictionary insertion problem.");
2304
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002305#define INIT_ALIAS(NAME, TYPE) Py_INCREF(PyExc_ ## TYPE); \
Antoine Pitrou8b0a74e2012-01-18 21:29:05 +01002306 Py_XDECREF(PyExc_ ## NAME); \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002307 PyExc_ ## NAME = PyExc_ ## TYPE; \
2308 if (PyDict_SetItemString(bdict, # NAME, PyExc_ ## NAME)) \
2309 Py_FatalError("Module dictionary insertion problem.");
2310
2311#define ADD_ERRNO(TYPE, CODE) { \
2312 PyObject *_code = PyLong_FromLong(CODE); \
2313 assert(_PyObject_RealIsSubclass(PyExc_ ## TYPE, PyExc_OSError)); \
2314 if (!_code || PyDict_SetItem(errnomap, _code, PyExc_ ## TYPE)) \
2315 Py_FatalError("errmap insertion problem."); \
Antoine Pitrou8b0a74e2012-01-18 21:29:05 +01002316 Py_DECREF(_code); \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002317 }
2318
2319#ifdef MS_WINDOWS
2320#include <Winsock2.h>
Brian Curtin401f9f32012-05-13 11:19:23 -05002321/* The following constants were added to errno.h in VS2010 but have
2322 preferred WSA equivalents. */
2323#undef EADDRINUSE
2324#undef EADDRNOTAVAIL
2325#undef EAFNOSUPPORT
2326#undef EALREADY
2327#undef ECONNABORTED
2328#undef ECONNREFUSED
2329#undef ECONNRESET
2330#undef EDESTADDRREQ
2331#undef EHOSTUNREACH
2332#undef EINPROGRESS
2333#undef EISCONN
2334#undef ELOOP
2335#undef EMSGSIZE
2336#undef ENETDOWN
2337#undef ENETRESET
2338#undef ENETUNREACH
2339#undef ENOBUFS
2340#undef ENOPROTOOPT
2341#undef ENOTCONN
2342#undef ENOTSOCK
2343#undef EOPNOTSUPP
2344#undef EPROTONOSUPPORT
2345#undef EPROTOTYPE
2346#undef ETIMEDOUT
2347#undef EWOULDBLOCK
2348
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002349#if defined(WSAEALREADY) && !defined(EALREADY)
2350#define EALREADY WSAEALREADY
2351#endif
2352#if defined(WSAECONNABORTED) && !defined(ECONNABORTED)
2353#define ECONNABORTED WSAECONNABORTED
2354#endif
2355#if defined(WSAECONNREFUSED) && !defined(ECONNREFUSED)
2356#define ECONNREFUSED WSAECONNREFUSED
2357#endif
2358#if defined(WSAECONNRESET) && !defined(ECONNRESET)
2359#define ECONNRESET WSAECONNRESET
2360#endif
2361#if defined(WSAEINPROGRESS) && !defined(EINPROGRESS)
2362#define EINPROGRESS WSAEINPROGRESS
2363#endif
2364#if defined(WSAESHUTDOWN) && !defined(ESHUTDOWN)
2365#define ESHUTDOWN WSAESHUTDOWN
2366#endif
2367#if defined(WSAETIMEDOUT) && !defined(ETIMEDOUT)
2368#define ETIMEDOUT WSAETIMEDOUT
2369#endif
2370#if defined(WSAEWOULDBLOCK) && !defined(EWOULDBLOCK)
2371#define EWOULDBLOCK WSAEWOULDBLOCK
2372#endif
2373#endif /* MS_WINDOWS */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002374
Martin v. Löwis1a214512008-06-11 05:26:20 +00002375void
Brett Cannonfd074152012-04-14 14:10:13 -04002376_PyExc_Init(PyObject *bltinmod)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002377{
Brett Cannonfd074152012-04-14 14:10:13 -04002378 PyObject *bdict;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002379
2380 PRE_INIT(BaseException)
2381 PRE_INIT(Exception)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002382 PRE_INIT(TypeError)
2383 PRE_INIT(StopIteration)
2384 PRE_INIT(GeneratorExit)
2385 PRE_INIT(SystemExit)
2386 PRE_INIT(KeyboardInterrupt)
2387 PRE_INIT(ImportError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002388 PRE_INIT(OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002389 PRE_INIT(EOFError)
2390 PRE_INIT(RuntimeError)
2391 PRE_INIT(NotImplementedError)
2392 PRE_INIT(NameError)
2393 PRE_INIT(UnboundLocalError)
2394 PRE_INIT(AttributeError)
2395 PRE_INIT(SyntaxError)
2396 PRE_INIT(IndentationError)
2397 PRE_INIT(TabError)
2398 PRE_INIT(LookupError)
2399 PRE_INIT(IndexError)
2400 PRE_INIT(KeyError)
2401 PRE_INIT(ValueError)
2402 PRE_INIT(UnicodeError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002403 PRE_INIT(UnicodeEncodeError)
2404 PRE_INIT(UnicodeDecodeError)
2405 PRE_INIT(UnicodeTranslateError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002406 PRE_INIT(AssertionError)
2407 PRE_INIT(ArithmeticError)
2408 PRE_INIT(FloatingPointError)
2409 PRE_INIT(OverflowError)
2410 PRE_INIT(ZeroDivisionError)
2411 PRE_INIT(SystemError)
2412 PRE_INIT(ReferenceError)
Neal Norwitzfaa54a32007-08-19 04:23:20 +00002413 PRE_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002414 PRE_INIT(MemoryError)
Benjamin Peterson2b968d62008-07-05 23:38:30 +00002415 PRE_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002416 PRE_INIT(Warning)
2417 PRE_INIT(UserWarning)
2418 PRE_INIT(DeprecationWarning)
2419 PRE_INIT(PendingDeprecationWarning)
2420 PRE_INIT(SyntaxWarning)
2421 PRE_INIT(RuntimeWarning)
2422 PRE_INIT(FutureWarning)
2423 PRE_INIT(ImportWarning)
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002424 PRE_INIT(UnicodeWarning)
Guido van Rossum98297ee2007-11-06 21:34:58 +00002425 PRE_INIT(BytesWarning)
Georg Brandl08be72d2010-10-24 15:11:22 +00002426 PRE_INIT(ResourceWarning)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002427
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002428 /* OSError subclasses */
2429 PRE_INIT(ConnectionError);
2430
2431 PRE_INIT(BlockingIOError);
2432 PRE_INIT(BrokenPipeError);
2433 PRE_INIT(ChildProcessError);
2434 PRE_INIT(ConnectionAbortedError);
2435 PRE_INIT(ConnectionRefusedError);
2436 PRE_INIT(ConnectionResetError);
2437 PRE_INIT(FileExistsError);
2438 PRE_INIT(FileNotFoundError);
2439 PRE_INIT(IsADirectoryError);
2440 PRE_INIT(NotADirectoryError);
2441 PRE_INIT(InterruptedError);
2442 PRE_INIT(PermissionError);
2443 PRE_INIT(ProcessLookupError);
2444 PRE_INIT(TimeoutError);
2445
Thomas Wouters477c8d52006-05-27 19:21:47 +00002446 bdict = PyModule_GetDict(bltinmod);
2447 if (bdict == NULL)
2448 Py_FatalError("exceptions bootstrapping error.");
2449
2450 POST_INIT(BaseException)
2451 POST_INIT(Exception)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002452 POST_INIT(TypeError)
2453 POST_INIT(StopIteration)
2454 POST_INIT(GeneratorExit)
2455 POST_INIT(SystemExit)
2456 POST_INIT(KeyboardInterrupt)
2457 POST_INIT(ImportError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002458 POST_INIT(OSError)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002459 INIT_ALIAS(EnvironmentError, OSError)
2460 INIT_ALIAS(IOError, OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002461#ifdef MS_WINDOWS
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002462 INIT_ALIAS(WindowsError, OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002463#endif
2464#ifdef __VMS
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002465 INIT_ALIAS(VMSError, OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002466#endif
2467 POST_INIT(EOFError)
2468 POST_INIT(RuntimeError)
2469 POST_INIT(NotImplementedError)
2470 POST_INIT(NameError)
2471 POST_INIT(UnboundLocalError)
2472 POST_INIT(AttributeError)
2473 POST_INIT(SyntaxError)
2474 POST_INIT(IndentationError)
2475 POST_INIT(TabError)
2476 POST_INIT(LookupError)
2477 POST_INIT(IndexError)
2478 POST_INIT(KeyError)
2479 POST_INIT(ValueError)
2480 POST_INIT(UnicodeError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002481 POST_INIT(UnicodeEncodeError)
2482 POST_INIT(UnicodeDecodeError)
2483 POST_INIT(UnicodeTranslateError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002484 POST_INIT(AssertionError)
2485 POST_INIT(ArithmeticError)
2486 POST_INIT(FloatingPointError)
2487 POST_INIT(OverflowError)
2488 POST_INIT(ZeroDivisionError)
2489 POST_INIT(SystemError)
2490 POST_INIT(ReferenceError)
Neal Norwitzfaa54a32007-08-19 04:23:20 +00002491 POST_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002492 POST_INIT(MemoryError)
Benjamin Peterson2b968d62008-07-05 23:38:30 +00002493 POST_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002494 POST_INIT(Warning)
2495 POST_INIT(UserWarning)
2496 POST_INIT(DeprecationWarning)
2497 POST_INIT(PendingDeprecationWarning)
2498 POST_INIT(SyntaxWarning)
2499 POST_INIT(RuntimeWarning)
2500 POST_INIT(FutureWarning)
2501 POST_INIT(ImportWarning)
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002502 POST_INIT(UnicodeWarning)
Guido van Rossum98297ee2007-11-06 21:34:58 +00002503 POST_INIT(BytesWarning)
Georg Brandl08be72d2010-10-24 15:11:22 +00002504 POST_INIT(ResourceWarning)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002505
Antoine Pitrouac456a12012-01-18 21:35:21 +01002506 if (!errnomap) {
2507 errnomap = PyDict_New();
2508 if (!errnomap)
2509 Py_FatalError("Cannot allocate map from errnos to OSError subclasses");
2510 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002511
2512 /* OSError subclasses */
2513 POST_INIT(ConnectionError);
2514
2515 POST_INIT(BlockingIOError);
2516 ADD_ERRNO(BlockingIOError, EAGAIN);
2517 ADD_ERRNO(BlockingIOError, EALREADY);
2518 ADD_ERRNO(BlockingIOError, EINPROGRESS);
2519 ADD_ERRNO(BlockingIOError, EWOULDBLOCK);
2520 POST_INIT(BrokenPipeError);
2521 ADD_ERRNO(BrokenPipeError, EPIPE);
2522 ADD_ERRNO(BrokenPipeError, ESHUTDOWN);
2523 POST_INIT(ChildProcessError);
2524 ADD_ERRNO(ChildProcessError, ECHILD);
2525 POST_INIT(ConnectionAbortedError);
2526 ADD_ERRNO(ConnectionAbortedError, ECONNABORTED);
2527 POST_INIT(ConnectionRefusedError);
2528 ADD_ERRNO(ConnectionRefusedError, ECONNREFUSED);
2529 POST_INIT(ConnectionResetError);
2530 ADD_ERRNO(ConnectionResetError, ECONNRESET);
2531 POST_INIT(FileExistsError);
2532 ADD_ERRNO(FileExistsError, EEXIST);
2533 POST_INIT(FileNotFoundError);
2534 ADD_ERRNO(FileNotFoundError, ENOENT);
2535 POST_INIT(IsADirectoryError);
2536 ADD_ERRNO(IsADirectoryError, EISDIR);
2537 POST_INIT(NotADirectoryError);
2538 ADD_ERRNO(NotADirectoryError, ENOTDIR);
2539 POST_INIT(InterruptedError);
2540 ADD_ERRNO(InterruptedError, EINTR);
2541 POST_INIT(PermissionError);
2542 ADD_ERRNO(PermissionError, EACCES);
2543 ADD_ERRNO(PermissionError, EPERM);
2544 POST_INIT(ProcessLookupError);
2545 ADD_ERRNO(ProcessLookupError, ESRCH);
2546 POST_INIT(TimeoutError);
2547 ADD_ERRNO(TimeoutError, ETIMEDOUT);
2548
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002549 preallocate_memerrors();
Thomas Wouters477c8d52006-05-27 19:21:47 +00002550
Antoine Pitrou1c7ade52012-01-18 16:13:31 +01002551 if (!PyExc_RecursionErrorInst) {
2552 PyExc_RecursionErrorInst = BaseException_new(&_PyExc_RuntimeError, NULL, NULL);
2553 if (!PyExc_RecursionErrorInst)
2554 Py_FatalError("Cannot pre-allocate RuntimeError instance for "
2555 "recursion errors");
2556 else {
2557 PyBaseExceptionObject *err_inst =
2558 (PyBaseExceptionObject *)PyExc_RecursionErrorInst;
2559 PyObject *args_tuple;
2560 PyObject *exc_message;
2561 exc_message = PyUnicode_FromString("maximum recursion depth exceeded");
2562 if (!exc_message)
2563 Py_FatalError("cannot allocate argument for RuntimeError "
2564 "pre-allocation");
2565 args_tuple = PyTuple_Pack(1, exc_message);
2566 if (!args_tuple)
2567 Py_FatalError("cannot allocate tuple for RuntimeError "
2568 "pre-allocation");
2569 Py_DECREF(exc_message);
2570 if (BaseException_init(err_inst, args_tuple, NULL))
2571 Py_FatalError("init of pre-allocated RuntimeError failed");
2572 Py_DECREF(args_tuple);
2573 }
Thomas Wouters89d996e2007-09-08 17:39:28 +00002574 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002575}
2576
2577void
2578_PyExc_Fini(void)
2579{
Benjamin Peterson78565b22009-06-28 19:19:51 +00002580 Py_CLEAR(PyExc_RecursionErrorInst);
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002581 free_preallocated_memerrors();
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002582 Py_CLEAR(errnomap);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002583}