blob: bc4379982ea22dd4797601632dde45c5309a70d5 [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;
Thomas Wouters477c8d52006-05-27 19:21:47 +000045
46 self->args = PyTuple_New(0);
47 if (!self->args) {
48 Py_DECREF(self);
49 return NULL;
50 }
51
Thomas Wouters477c8d52006-05-27 19:21:47 +000052 return (PyObject *)self;
53}
54
55static int
56BaseException_init(PyBaseExceptionObject *self, PyObject *args, PyObject *kwds)
57{
Christian Heimes90aa7642007-12-19 02:45:37 +000058 if (!_PyArg_NoKeywords(Py_TYPE(self)->tp_name, kwds))
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000059 return -1;
60
Antoine Pitroue0e27352011-12-15 14:31:28 +010061 Py_XDECREF(self->args);
Thomas Wouters477c8d52006-05-27 19:21:47 +000062 self->args = args;
63 Py_INCREF(self->args);
64
Thomas Wouters477c8d52006-05-27 19:21:47 +000065 return 0;
66}
67
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000068static int
Thomas Wouters477c8d52006-05-27 19:21:47 +000069BaseException_clear(PyBaseExceptionObject *self)
70{
71 Py_CLEAR(self->dict);
72 Py_CLEAR(self->args);
Collin Winter828f04a2007-08-31 00:04:24 +000073 Py_CLEAR(self->traceback);
Collin Winter1966f1c2007-09-01 20:26:44 +000074 Py_CLEAR(self->cause);
75 Py_CLEAR(self->context);
Thomas Wouters477c8d52006-05-27 19:21:47 +000076 return 0;
77}
78
79static void
80BaseException_dealloc(PyBaseExceptionObject *self)
81{
Thomas Wouters89f507f2006-12-13 04:49:30 +000082 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +000083 BaseException_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +000084 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +000085}
86
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000087static int
Thomas Wouters477c8d52006-05-27 19:21:47 +000088BaseException_traverse(PyBaseExceptionObject *self, visitproc visit, void *arg)
89{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000090 Py_VISIT(self->dict);
Thomas Wouters477c8d52006-05-27 19:21:47 +000091 Py_VISIT(self->args);
Collin Winter828f04a2007-08-31 00:04:24 +000092 Py_VISIT(self->traceback);
Collin Winter1966f1c2007-09-01 20:26:44 +000093 Py_VISIT(self->cause);
94 Py_VISIT(self->context);
Thomas Wouters477c8d52006-05-27 19:21:47 +000095 return 0;
96}
97
98static PyObject *
99BaseException_str(PyBaseExceptionObject *self)
100{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000101 switch (PyTuple_GET_SIZE(self->args)) {
Thomas Wouters477c8d52006-05-27 19:21:47 +0000102 case 0:
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +0000103 return PyUnicode_FromString("");
Thomas Wouters477c8d52006-05-27 19:21:47 +0000104 case 1:
Thomas Heller519a0422007-11-15 20:48:54 +0000105 return PyObject_Str(PyTuple_GET_ITEM(self->args, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +0000106 default:
Thomas Heller519a0422007-11-15 20:48:54 +0000107 return PyObject_Str(self->args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000108 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000109}
110
111static PyObject *
112BaseException_repr(PyBaseExceptionObject *self)
113{
Thomas Wouters477c8d52006-05-27 19:21:47 +0000114 char *name;
115 char *dot;
116
Christian Heimes90aa7642007-12-19 02:45:37 +0000117 name = (char *)Py_TYPE(self)->tp_name;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000118 dot = strrchr(name, '.');
119 if (dot != NULL) name = dot+1;
120
Walter Dörwald7569dfe2007-05-19 21:49:49 +0000121 return PyUnicode_FromFormat("%s%R", name, self->args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000122}
123
124/* Pickling support */
125static PyObject *
126BaseException_reduce(PyBaseExceptionObject *self)
127{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000128 if (self->args && self->dict)
Christian Heimes90aa7642007-12-19 02:45:37 +0000129 return PyTuple_Pack(3, Py_TYPE(self), self->args, self->dict);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000130 else
Christian Heimes90aa7642007-12-19 02:45:37 +0000131 return PyTuple_Pack(2, Py_TYPE(self), self->args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000132}
133
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000134/*
135 * Needed for backward compatibility, since exceptions used to store
136 * all their attributes in the __dict__. Code is taken from cPickle's
137 * load_build function.
138 */
139static PyObject *
140BaseException_setstate(PyObject *self, PyObject *state)
141{
142 PyObject *d_key, *d_value;
143 Py_ssize_t i = 0;
144
145 if (state != Py_None) {
146 if (!PyDict_Check(state)) {
147 PyErr_SetString(PyExc_TypeError, "state is not a dictionary");
148 return NULL;
149 }
150 while (PyDict_Next(state, &i, &d_key, &d_value)) {
151 if (PyObject_SetAttr(self, d_key, d_value) < 0)
152 return NULL;
153 }
154 }
155 Py_RETURN_NONE;
156}
Thomas Wouters477c8d52006-05-27 19:21:47 +0000157
Collin Winter828f04a2007-08-31 00:04:24 +0000158static PyObject *
159BaseException_with_traceback(PyObject *self, PyObject *tb) {
160 if (PyException_SetTraceback(self, tb))
161 return NULL;
162
163 Py_INCREF(self);
164 return self;
165}
166
Georg Brandl76941002008-05-05 21:38:47 +0000167PyDoc_STRVAR(with_traceback_doc,
168"Exception.with_traceback(tb) --\n\
169 set self.__traceback__ to tb and return self.");
170
Thomas Wouters477c8d52006-05-27 19:21:47 +0000171
172static PyMethodDef BaseException_methods[] = {
173 {"__reduce__", (PyCFunction)BaseException_reduce, METH_NOARGS },
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000174 {"__setstate__", (PyCFunction)BaseException_setstate, METH_O },
Georg Brandl76941002008-05-05 21:38:47 +0000175 {"with_traceback", (PyCFunction)BaseException_with_traceback, METH_O,
176 with_traceback_doc},
Thomas Wouters477c8d52006-05-27 19:21:47 +0000177 {NULL, NULL, 0, NULL},
178};
179
Thomas Wouters477c8d52006-05-27 19:21:47 +0000180static PyObject *
181BaseException_get_args(PyBaseExceptionObject *self)
182{
183 if (self->args == NULL) {
184 Py_INCREF(Py_None);
185 return Py_None;
186 }
187 Py_INCREF(self->args);
188 return self->args;
189}
190
191static int
192BaseException_set_args(PyBaseExceptionObject *self, PyObject *val)
193{
194 PyObject *seq;
195 if (val == NULL) {
196 PyErr_SetString(PyExc_TypeError, "args may not be deleted");
197 return -1;
198 }
199 seq = PySequence_Tuple(val);
Benjamin Peterson90b13582012-02-03 19:22:31 -0500200 if (!seq)
201 return -1;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000202 Py_CLEAR(self->args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000203 self->args = seq;
204 return 0;
205}
206
Collin Winter828f04a2007-08-31 00:04:24 +0000207static PyObject *
208BaseException_get_tb(PyBaseExceptionObject *self)
209{
210 if (self->traceback == NULL) {
211 Py_INCREF(Py_None);
212 return Py_None;
213 }
214 Py_INCREF(self->traceback);
215 return self->traceback;
216}
217
218static int
219BaseException_set_tb(PyBaseExceptionObject *self, PyObject *tb)
220{
221 if (tb == NULL) {
222 PyErr_SetString(PyExc_TypeError, "__traceback__ may not be deleted");
223 return -1;
224 }
225 else if (!(tb == Py_None || PyTraceBack_Check(tb))) {
226 PyErr_SetString(PyExc_TypeError,
227 "__traceback__ must be a traceback or None");
228 return -1;
229 }
230
231 Py_XINCREF(tb);
232 Py_XDECREF(self->traceback);
233 self->traceback = tb;
234 return 0;
235}
236
Georg Brandlab6f2f62009-03-31 04:16:10 +0000237static PyObject *
238BaseException_get_context(PyObject *self) {
239 PyObject *res = PyException_GetContext(self);
Benjamin Peterson90b13582012-02-03 19:22:31 -0500240 if (res)
241 return res; /* new reference already returned above */
Georg Brandlab6f2f62009-03-31 04:16:10 +0000242 Py_RETURN_NONE;
243}
244
245static int
246BaseException_set_context(PyObject *self, PyObject *arg) {
247 if (arg == NULL) {
248 PyErr_SetString(PyExc_TypeError, "__context__ may not be deleted");
249 return -1;
250 } else if (arg == Py_None) {
251 arg = NULL;
252 } else if (!PyExceptionInstance_Check(arg)) {
253 PyErr_SetString(PyExc_TypeError, "exception context must be None "
254 "or derive from BaseException");
255 return -1;
256 } else {
257 /* PyException_SetContext steals this reference */
258 Py_INCREF(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000259 }
Georg Brandlab6f2f62009-03-31 04:16:10 +0000260 PyException_SetContext(self, arg);
261 return 0;
262}
263
264static PyObject *
265BaseException_get_cause(PyObject *self) {
266 PyObject *res = PyException_GetCause(self);
Benjamin Peterson90b13582012-02-03 19:22:31 -0500267 if (res)
268 return res; /* new reference already returned above */
Nick Coghlanab7bf212012-02-26 17:49:52 +1000269 Py_INCREF(Py_Ellipsis);
270 return Py_Ellipsis;
271}
272
273int
274_PyException_SetCauseChecked(PyObject *self, PyObject *arg) {
275 if (arg == Py_Ellipsis) {
276 arg = NULL;
277 } else if (arg != Py_None && !PyExceptionInstance_Check(arg)) {
278 PyErr_SetString(PyExc_TypeError, "exception cause must be None, "
279 "Ellipsis or derive from BaseException");
280 return -1;
281 } else {
282 /* PyException_SetCause steals a reference */
283 Py_INCREF(arg);
284 }
285 PyException_SetCause(self, arg);
286 return 0;
Georg Brandlab6f2f62009-03-31 04:16:10 +0000287}
288
289static int
290BaseException_set_cause(PyObject *self, PyObject *arg) {
291 if (arg == NULL) {
292 PyErr_SetString(PyExc_TypeError, "__cause__ may not be deleted");
293 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000294 }
Nick Coghlanab7bf212012-02-26 17:49:52 +1000295 return _PyException_SetCauseChecked(self, arg);
Georg Brandlab6f2f62009-03-31 04:16:10 +0000296}
297
Guido van Rossum360e4b82007-05-14 22:51:27 +0000298
Thomas Wouters477c8d52006-05-27 19:21:47 +0000299static PyGetSetDef BaseException_getset[] = {
Benjamin Peterson23d7f122012-02-19 20:02:57 -0500300 {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict},
Thomas Wouters477c8d52006-05-27 19:21:47 +0000301 {"args", (getter)BaseException_get_args, (setter)BaseException_set_args},
Collin Winter828f04a2007-08-31 00:04:24 +0000302 {"__traceback__", (getter)BaseException_get_tb, (setter)BaseException_set_tb},
Georg Brandlab6f2f62009-03-31 04:16:10 +0000303 {"__context__", (getter)BaseException_get_context,
304 (setter)BaseException_set_context, PyDoc_STR("exception context")},
305 {"__cause__", (getter)BaseException_get_cause,
306 (setter)BaseException_set_cause, PyDoc_STR("exception cause")},
Thomas Wouters477c8d52006-05-27 19:21:47 +0000307 {NULL},
308};
309
310
Collin Winter828f04a2007-08-31 00:04:24 +0000311PyObject *
312PyException_GetTraceback(PyObject *self) {
313 PyBaseExceptionObject *base_self = (PyBaseExceptionObject *)self;
314 Py_XINCREF(base_self->traceback);
315 return base_self->traceback;
316}
317
318
319int
320PyException_SetTraceback(PyObject *self, PyObject *tb) {
321 return BaseException_set_tb((PyBaseExceptionObject *)self, tb);
322}
323
324PyObject *
325PyException_GetCause(PyObject *self) {
326 PyObject *cause = ((PyBaseExceptionObject *)self)->cause;
327 Py_XINCREF(cause);
328 return cause;
329}
330
331/* Steals a reference to cause */
332void
333PyException_SetCause(PyObject *self, PyObject *cause) {
334 PyObject *old_cause = ((PyBaseExceptionObject *)self)->cause;
335 ((PyBaseExceptionObject *)self)->cause = cause;
336 Py_XDECREF(old_cause);
337}
338
339PyObject *
340PyException_GetContext(PyObject *self) {
341 PyObject *context = ((PyBaseExceptionObject *)self)->context;
342 Py_XINCREF(context);
343 return context;
344}
345
346/* Steals a reference to context */
347void
348PyException_SetContext(PyObject *self, PyObject *context) {
349 PyObject *old_context = ((PyBaseExceptionObject *)self)->context;
350 ((PyBaseExceptionObject *)self)->context = context;
351 Py_XDECREF(old_context);
352}
353
354
Thomas Wouters477c8d52006-05-27 19:21:47 +0000355static PyTypeObject _PyExc_BaseException = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000356 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +0000357 "BaseException", /*tp_name*/
Thomas Wouters477c8d52006-05-27 19:21:47 +0000358 sizeof(PyBaseExceptionObject), /*tp_basicsize*/
359 0, /*tp_itemsize*/
360 (destructor)BaseException_dealloc, /*tp_dealloc*/
361 0, /*tp_print*/
362 0, /*tp_getattr*/
363 0, /*tp_setattr*/
Mark Dickinsone94c6792009-02-02 20:36:42 +0000364 0, /* tp_reserved; */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000365 (reprfunc)BaseException_repr, /*tp_repr*/
366 0, /*tp_as_number*/
Brett Cannonba7bf492007-02-27 00:15:55 +0000367 0, /*tp_as_sequence*/
Thomas Wouters477c8d52006-05-27 19:21:47 +0000368 0, /*tp_as_mapping*/
369 0, /*tp_hash */
370 0, /*tp_call*/
371 (reprfunc)BaseException_str, /*tp_str*/
372 PyObject_GenericGetAttr, /*tp_getattro*/
373 PyObject_GenericSetAttr, /*tp_setattro*/
374 0, /*tp_as_buffer*/
Thomas Wouters27d517b2007-02-25 20:39:11 +0000375 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC |
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000376 Py_TPFLAGS_BASE_EXC_SUBCLASS, /*tp_flags*/
Thomas Wouters477c8d52006-05-27 19:21:47 +0000377 PyDoc_STR("Common base class for all exceptions"), /* tp_doc */
378 (traverseproc)BaseException_traverse, /* tp_traverse */
379 (inquiry)BaseException_clear, /* tp_clear */
380 0, /* tp_richcompare */
381 0, /* tp_weaklistoffset */
382 0, /* tp_iter */
383 0, /* tp_iternext */
384 BaseException_methods, /* tp_methods */
Georg Brandlab6f2f62009-03-31 04:16:10 +0000385 0, /* tp_members */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000386 BaseException_getset, /* tp_getset */
387 0, /* tp_base */
388 0, /* tp_dict */
389 0, /* tp_descr_get */
390 0, /* tp_descr_set */
391 offsetof(PyBaseExceptionObject, dict), /* tp_dictoffset */
392 (initproc)BaseException_init, /* tp_init */
393 0, /* tp_alloc */
394 BaseException_new, /* tp_new */
395};
396/* the CPython API expects exceptions to be (PyObject *) - both a hold-over
397from the previous implmentation and also allowing Python objects to be used
398in the API */
399PyObject *PyExc_BaseException = (PyObject *)&_PyExc_BaseException;
400
401/* note these macros omit the last semicolon so the macro invocation may
402 * include it and not look strange.
403 */
404#define SimpleExtendsException(EXCBASE, EXCNAME, EXCDOC) \
405static PyTypeObject _PyExc_ ## EXCNAME = { \
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000406 PyVarObject_HEAD_INIT(NULL, 0) \
Neal Norwitz2633c692007-02-26 22:22:47 +0000407 # EXCNAME, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000408 sizeof(PyBaseExceptionObject), \
409 0, (destructor)BaseException_dealloc, 0, 0, 0, 0, 0, 0, 0, \
410 0, 0, 0, 0, 0, 0, 0, \
411 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
412 PyDoc_STR(EXCDOC), (traverseproc)BaseException_traverse, \
413 (inquiry)BaseException_clear, 0, 0, 0, 0, 0, 0, 0, &_ ## EXCBASE, \
414 0, 0, 0, offsetof(PyBaseExceptionObject, dict), \
415 (initproc)BaseException_init, 0, BaseException_new,\
416}; \
417PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
418
419#define MiddlingExtendsException(EXCBASE, EXCNAME, EXCSTORE, EXCDOC) \
420static PyTypeObject _PyExc_ ## EXCNAME = { \
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000421 PyVarObject_HEAD_INIT(NULL, 0) \
Neal Norwitz2633c692007-02-26 22:22:47 +0000422 # EXCNAME, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000423 sizeof(Py ## EXCSTORE ## Object), \
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000424 0, (destructor)EXCSTORE ## _dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000425 0, 0, 0, 0, 0, \
426 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000427 PyDoc_STR(EXCDOC), (traverseproc)EXCSTORE ## _traverse, \
428 (inquiry)EXCSTORE ## _clear, 0, 0, 0, 0, 0, 0, 0, &_ ## EXCBASE, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000429 0, 0, 0, offsetof(Py ## EXCSTORE ## Object, dict), \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200430 (initproc)EXCSTORE ## _init, 0, 0, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000431}; \
432PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
433
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200434#define ComplexExtendsException(EXCBASE, EXCNAME, EXCSTORE, EXCNEW, \
435 EXCMETHODS, EXCMEMBERS, EXCGETSET, \
436 EXCSTR, EXCDOC) \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000437static PyTypeObject _PyExc_ ## EXCNAME = { \
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000438 PyVarObject_HEAD_INIT(NULL, 0) \
Neal Norwitz2633c692007-02-26 22:22:47 +0000439 # EXCNAME, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000440 sizeof(Py ## EXCSTORE ## Object), 0, \
441 (destructor)EXCSTORE ## _dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
442 (reprfunc)EXCSTR, 0, 0, 0, \
443 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
444 PyDoc_STR(EXCDOC), (traverseproc)EXCSTORE ## _traverse, \
445 (inquiry)EXCSTORE ## _clear, 0, 0, 0, 0, EXCMETHODS, \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200446 EXCMEMBERS, EXCGETSET, &_ ## EXCBASE, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000447 0, 0, 0, offsetof(Py ## EXCSTORE ## Object, dict), \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200448 (initproc)EXCSTORE ## _init, 0, EXCNEW,\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000449}; \
450PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
451
452
453/*
454 * Exception extends BaseException
455 */
456SimpleExtendsException(PyExc_BaseException, Exception,
457 "Common base class for all non-exit exceptions.");
458
459
460/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000461 * TypeError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +0000462 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000463SimpleExtendsException(PyExc_Exception, TypeError,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000464 "Inappropriate argument type.");
465
466
467/*
468 * StopIteration extends Exception
469 */
Nick Coghlan1f7ce622012-01-13 21:43:40 +1000470
471static PyMemberDef StopIteration_members[] = {
472 {"value", T_OBJECT, offsetof(PyStopIterationObject, value), 0,
473 PyDoc_STR("generator return value")},
474 {NULL} /* Sentinel */
475};
476
477static int
478StopIteration_init(PyStopIterationObject *self, PyObject *args, PyObject *kwds)
479{
480 Py_ssize_t size = PyTuple_GET_SIZE(args);
481 PyObject *value;
482
483 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
484 return -1;
485 Py_CLEAR(self->value);
486 if (size > 0)
487 value = PyTuple_GET_ITEM(args, 0);
488 else
489 value = Py_None;
490 Py_INCREF(value);
491 self->value = value;
492 return 0;
493}
494
495static int
496StopIteration_clear(PyStopIterationObject *self)
497{
498 Py_CLEAR(self->value);
499 return BaseException_clear((PyBaseExceptionObject *)self);
500}
501
502static void
503StopIteration_dealloc(PyStopIterationObject *self)
504{
505 _PyObject_GC_UNTRACK(self);
506 StopIteration_clear(self);
507 Py_TYPE(self)->tp_free((PyObject *)self);
508}
509
510static int
511StopIteration_traverse(PyStopIterationObject *self, visitproc visit, void *arg)
512{
513 Py_VISIT(self->value);
514 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
515}
516
517PyObject *
518PyStopIteration_Create(PyObject *value)
519{
520 return PyObject_CallFunctionObjArgs(PyExc_StopIteration, value, NULL);
521}
522
523ComplexExtendsException(
524 PyExc_Exception, /* base */
525 StopIteration, /* name */
526 StopIteration, /* prefix for *_init, etc */
527 0, /* new */
528 0, /* methods */
529 StopIteration_members, /* members */
530 0, /* getset */
531 0, /* str */
532 "Signal the end from iterator.__next__()."
533);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000534
535
536/*
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000537 * GeneratorExit extends BaseException
Thomas Wouters477c8d52006-05-27 19:21:47 +0000538 */
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000539SimpleExtendsException(PyExc_BaseException, GeneratorExit,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000540 "Request that a generator exit.");
541
542
543/*
544 * SystemExit extends BaseException
545 */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000546
547static int
548SystemExit_init(PySystemExitObject *self, PyObject *args, PyObject *kwds)
549{
550 Py_ssize_t size = PyTuple_GET_SIZE(args);
551
552 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
553 return -1;
554
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000555 if (size == 0)
556 return 0;
557 Py_CLEAR(self->code);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000558 if (size == 1)
559 self->code = PyTuple_GET_ITEM(args, 0);
Victor Stinner92236e52011-05-26 14:25:54 +0200560 else /* size > 1 */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000561 self->code = args;
562 Py_INCREF(self->code);
563 return 0;
564}
565
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000566static int
Thomas Wouters477c8d52006-05-27 19:21:47 +0000567SystemExit_clear(PySystemExitObject *self)
568{
569 Py_CLEAR(self->code);
570 return BaseException_clear((PyBaseExceptionObject *)self);
571}
572
573static void
574SystemExit_dealloc(PySystemExitObject *self)
575{
Thomas Wouters89f507f2006-12-13 04:49:30 +0000576 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000577 SystemExit_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +0000578 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000579}
580
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000581static int
Thomas Wouters477c8d52006-05-27 19:21:47 +0000582SystemExit_traverse(PySystemExitObject *self, visitproc visit, void *arg)
583{
584 Py_VISIT(self->code);
585 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
586}
587
588static PyMemberDef SystemExit_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +0000589 {"code", T_OBJECT, offsetof(PySystemExitObject, code), 0,
590 PyDoc_STR("exception code")},
591 {NULL} /* Sentinel */
592};
593
594ComplexExtendsException(PyExc_BaseException, SystemExit, SystemExit,
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200595 0, 0, SystemExit_members, 0, 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000596 "Request to exit from the interpreter.");
597
598/*
599 * KeyboardInterrupt extends BaseException
600 */
601SimpleExtendsException(PyExc_BaseException, KeyboardInterrupt,
602 "Program interrupted by user.");
603
604
605/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000606 * ImportError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +0000607 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000608SimpleExtendsException(PyExc_Exception, ImportError,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000609 "Import can't find module, or can't find name in module.");
610
611
612/*
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200613 * OSError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +0000614 */
615
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200616#ifdef MS_WINDOWS
617#include "errmap.h"
618#endif
619
Thomas Wouters477c8d52006-05-27 19:21:47 +0000620/* Where a function has a single filename, such as open() or some
621 * of the os module functions, PyErr_SetFromErrnoWithFilename() is
622 * called, giving a third argument which is the filename. But, so
623 * that old code using in-place unpacking doesn't break, e.g.:
624 *
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200625 * except OSError, (errno, strerror):
Thomas Wouters477c8d52006-05-27 19:21:47 +0000626 *
627 * we hack args so that it only contains two items. This also
628 * means we need our own __str__() which prints out the filename
629 * when it was supplied.
630 */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200631
Antoine Pitroue0e27352011-12-15 14:31:28 +0100632/* This function doesn't cleanup on error, the caller should */
633static int
634oserror_parse_args(PyObject **p_args,
635 PyObject **myerrno, PyObject **strerror,
636 PyObject **filename
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200637#ifdef MS_WINDOWS
Antoine Pitroue0e27352011-12-15 14:31:28 +0100638 , PyObject **winerror
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200639#endif
Antoine Pitroue0e27352011-12-15 14:31:28 +0100640 )
641{
642 Py_ssize_t nargs;
643 PyObject *args = *p_args;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000644
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200645 nargs = PyTuple_GET_SIZE(args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000646
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200647#ifdef MS_WINDOWS
648 if (nargs >= 2 && nargs <= 4) {
649 if (!PyArg_UnpackTuple(args, "OSError", 2, 4,
Antoine Pitroue0e27352011-12-15 14:31:28 +0100650 myerrno, strerror, filename, winerror))
651 return -1;
652 if (*winerror && PyLong_Check(*winerror)) {
653 long errcode, winerrcode;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200654 PyObject *newargs;
655 Py_ssize_t i;
656
Antoine Pitroue0e27352011-12-15 14:31:28 +0100657 winerrcode = PyLong_AsLong(*winerror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200658 if (winerrcode == -1 && PyErr_Occurred())
Antoine Pitroue0e27352011-12-15 14:31:28 +0100659 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200660 /* Set errno to the corresponding POSIX errno (overriding
661 first argument). Windows Socket error codes (>= 10000)
662 have the same value as their POSIX counterparts.
663 */
664 if (winerrcode < 10000)
665 errcode = winerror_to_errno(winerrcode);
666 else
667 errcode = winerrcode;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100668 *myerrno = PyLong_FromLong(errcode);
669 if (!*myerrno)
670 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200671 newargs = PyTuple_New(nargs);
672 if (!newargs)
Antoine Pitroue0e27352011-12-15 14:31:28 +0100673 return -1;
674 PyTuple_SET_ITEM(newargs, 0, *myerrno);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200675 for (i = 1; i < nargs; i++) {
676 PyObject *val = PyTuple_GET_ITEM(args, i);
677 Py_INCREF(val);
678 PyTuple_SET_ITEM(newargs, i, val);
679 }
680 Py_DECREF(args);
Antoine Pitroue0e27352011-12-15 14:31:28 +0100681 args = *p_args = newargs;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200682 }
683 }
684#else
685 if (nargs >= 2 && nargs <= 3) {
686 if (!PyArg_UnpackTuple(args, "OSError", 2, 3,
Antoine Pitroue0e27352011-12-15 14:31:28 +0100687 myerrno, strerror, filename))
688 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200689 }
690#endif
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000691
Antoine Pitroue0e27352011-12-15 14:31:28 +0100692 return 0;
693}
Thomas Wouters477c8d52006-05-27 19:21:47 +0000694
Antoine Pitroue0e27352011-12-15 14:31:28 +0100695static int
696oserror_init(PyOSErrorObject *self, PyObject **p_args,
697 PyObject *myerrno, PyObject *strerror,
698 PyObject *filename
699#ifdef MS_WINDOWS
700 , PyObject *winerror
701#endif
702 )
703{
704 PyObject *args = *p_args;
705 Py_ssize_t nargs = PyTuple_GET_SIZE(args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000706
707 /* self->filename will remain Py_None otherwise */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200708 if (filename && filename != Py_None) {
Antoine Pitroue0e27352011-12-15 14:31:28 +0100709 if (Py_TYPE(self) == (PyTypeObject *) PyExc_BlockingIOError &&
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200710 PyNumber_Check(filename)) {
711 /* BlockingIOError's 3rd argument can be the number of
712 * characters written.
713 */
714 self->written = PyNumber_AsSsize_t(filename, PyExc_ValueError);
715 if (self->written == -1 && PyErr_Occurred())
Antoine Pitroue0e27352011-12-15 14:31:28 +0100716 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200717 }
718 else {
719 Py_INCREF(filename);
720 self->filename = filename;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000721
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200722 if (nargs >= 2 && nargs <= 3) {
723 /* filename is removed from the args tuple (for compatibility
724 purposes, see test_exceptions.py) */
Antoine Pitroue0e27352011-12-15 14:31:28 +0100725 PyObject *subslice = PyTuple_GetSlice(args, 0, 2);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200726 if (!subslice)
Antoine Pitroue0e27352011-12-15 14:31:28 +0100727 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000728
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200729 Py_DECREF(args); /* replacing args */
Antoine Pitroue0e27352011-12-15 14:31:28 +0100730 *p_args = args = subslice;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200731 }
732 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000733 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200734 Py_XINCREF(myerrno);
735 self->myerrno = myerrno;
736
737 Py_XINCREF(strerror);
738 self->strerror = strerror;
739
740#ifdef MS_WINDOWS
741 Py_XINCREF(winerror);
742 self->winerror = winerror;
743#endif
744
Antoine Pitroue0e27352011-12-15 14:31:28 +0100745 /* Steals the reference to args */
746 self->args = args;
747 args = NULL;
748
749 return 0;
750}
751
752static PyObject *
753OSError_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
754static int
755OSError_init(PyOSErrorObject *self, PyObject *args, PyObject *kwds);
756
757static int
758oserror_use_init(PyTypeObject *type)
759{
760 /* When __init__ is defined in a OSError subclass, we want any
761 extraneous argument to __new__ to be ignored. The only reasonable
762 solution, given __new__ takes a variable number of arguments,
763 is to defer arg parsing and initialization to __init__.
764
765 But when __new__ is overriden as well, it should call our __new__
766 with the right arguments.
767
768 (see http://bugs.python.org/issue12555#msg148829 )
769 */
770 if (type->tp_init != (initproc) OSError_init &&
771 type->tp_new == (newfunc) OSError_new) {
772 assert((PyObject *) type != PyExc_OSError);
773 return 1;
774 }
775 return 0;
776}
777
778static PyObject *
779OSError_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
780{
781 PyOSErrorObject *self = NULL;
782 PyObject *myerrno = NULL, *strerror = NULL, *filename = NULL;
783#ifdef MS_WINDOWS
784 PyObject *winerror = NULL;
785#endif
786
787 if (!oserror_use_init(type)) {
788 if (!_PyArg_NoKeywords(type->tp_name, kwds))
789 return NULL;
790
791 Py_INCREF(args);
792 if (oserror_parse_args(&args, &myerrno, &strerror, &filename
793#ifdef MS_WINDOWS
794 , &winerror
795#endif
796 ))
797 goto error;
798
799 if (myerrno && PyLong_Check(myerrno) &&
800 errnomap && (PyObject *) type == PyExc_OSError) {
801 PyObject *newtype;
802 newtype = PyDict_GetItem(errnomap, myerrno);
803 if (newtype) {
804 assert(PyType_Check(newtype));
805 type = (PyTypeObject *) newtype;
806 }
807 else if (PyErr_Occurred())
808 goto error;
809 }
810 }
811
812 self = (PyOSErrorObject *) type->tp_alloc(type, 0);
813 if (!self)
814 goto error;
815
816 self->dict = NULL;
817 self->traceback = self->cause = self->context = NULL;
818 self->written = -1;
819
820 if (!oserror_use_init(type)) {
821 if (oserror_init(self, &args, myerrno, strerror, filename
822#ifdef MS_WINDOWS
823 , winerror
824#endif
825 ))
826 goto error;
827 }
828
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200829 return (PyObject *) self;
830
831error:
832 Py_XDECREF(args);
833 Py_XDECREF(self);
834 return NULL;
835}
836
837static int
Antoine Pitroue0e27352011-12-15 14:31:28 +0100838OSError_init(PyOSErrorObject *self, PyObject *args, PyObject *kwds)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200839{
Antoine Pitroue0e27352011-12-15 14:31:28 +0100840 PyObject *myerrno = NULL, *strerror = NULL, *filename = NULL;
841#ifdef MS_WINDOWS
842 PyObject *winerror = NULL;
843#endif
844
845 if (!oserror_use_init(Py_TYPE(self)))
846 /* Everything already done in OSError_new */
847 return 0;
848
849 if (!_PyArg_NoKeywords(Py_TYPE(self)->tp_name, kwds))
850 return -1;
851
852 Py_INCREF(args);
853 if (oserror_parse_args(&args, &myerrno, &strerror, &filename
854#ifdef MS_WINDOWS
855 , &winerror
856#endif
857 ))
858 goto error;
859
860 if (oserror_init(self, &args, myerrno, strerror, filename
861#ifdef MS_WINDOWS
862 , winerror
863#endif
864 ))
865 goto error;
866
Thomas Wouters477c8d52006-05-27 19:21:47 +0000867 return 0;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100868
869error:
870 Py_XDECREF(args);
871 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000872}
873
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000874static int
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200875OSError_clear(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000876{
877 Py_CLEAR(self->myerrno);
878 Py_CLEAR(self->strerror);
879 Py_CLEAR(self->filename);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200880#ifdef MS_WINDOWS
881 Py_CLEAR(self->winerror);
882#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000883 return BaseException_clear((PyBaseExceptionObject *)self);
884}
885
886static void
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200887OSError_dealloc(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000888{
Thomas Wouters89f507f2006-12-13 04:49:30 +0000889 _PyObject_GC_UNTRACK(self);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200890 OSError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +0000891 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000892}
893
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000894static int
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200895OSError_traverse(PyOSErrorObject *self, visitproc visit,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000896 void *arg)
897{
898 Py_VISIT(self->myerrno);
899 Py_VISIT(self->strerror);
900 Py_VISIT(self->filename);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200901#ifdef MS_WINDOWS
902 Py_VISIT(self->winerror);
903#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000904 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
905}
906
907static PyObject *
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200908OSError_str(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000909{
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200910#ifdef MS_WINDOWS
911 /* If available, winerror has the priority over myerrno */
912 if (self->winerror && self->filename)
913 return PyUnicode_FromFormat("[Error %S] %S: %R",
914 self->winerror ? self->winerror: Py_None,
915 self->strerror ? self->strerror: Py_None,
916 self->filename);
917 if (self->winerror && self->strerror)
918 return PyUnicode_FromFormat("[Error %S] %S",
919 self->winerror ? self->winerror: Py_None,
920 self->strerror ? self->strerror: Py_None);
921#endif
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +0000922 if (self->filename)
923 return PyUnicode_FromFormat("[Errno %S] %S: %R",
924 self->myerrno ? self->myerrno: Py_None,
925 self->strerror ? self->strerror: Py_None,
926 self->filename);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200927 if (self->myerrno && self->strerror)
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +0000928 return PyUnicode_FromFormat("[Errno %S] %S",
929 self->myerrno ? self->myerrno: Py_None,
930 self->strerror ? self->strerror: Py_None);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200931 return BaseException_str((PyBaseExceptionObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000932}
933
Thomas Wouters477c8d52006-05-27 19:21:47 +0000934static PyObject *
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200935OSError_reduce(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000936{
937 PyObject *args = self->args;
938 PyObject *res = NULL, *tmp;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000939
Thomas Wouters477c8d52006-05-27 19:21:47 +0000940 /* self->args is only the first two real arguments if there was a
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200941 * file name given to OSError. */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000942 if (PyTuple_GET_SIZE(args) == 2 && self->filename) {
Thomas Wouters477c8d52006-05-27 19:21:47 +0000943 args = PyTuple_New(3);
Benjamin Peterson90b13582012-02-03 19:22:31 -0500944 if (!args)
945 return NULL;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000946
947 tmp = PyTuple_GET_ITEM(self->args, 0);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000948 Py_INCREF(tmp);
949 PyTuple_SET_ITEM(args, 0, tmp);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000950
951 tmp = PyTuple_GET_ITEM(self->args, 1);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000952 Py_INCREF(tmp);
953 PyTuple_SET_ITEM(args, 1, tmp);
954
955 Py_INCREF(self->filename);
956 PyTuple_SET_ITEM(args, 2, self->filename);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000957 } else
Thomas Wouters477c8d52006-05-27 19:21:47 +0000958 Py_INCREF(args);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000959
960 if (self->dict)
Christian Heimes90aa7642007-12-19 02:45:37 +0000961 res = PyTuple_Pack(3, Py_TYPE(self), args, self->dict);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000962 else
Christian Heimes90aa7642007-12-19 02:45:37 +0000963 res = PyTuple_Pack(2, Py_TYPE(self), args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000964 Py_DECREF(args);
965 return res;
966}
967
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200968static PyObject *
969OSError_written_get(PyOSErrorObject *self, void *context)
970{
971 if (self->written == -1) {
972 PyErr_SetString(PyExc_AttributeError, "characters_written");
973 return NULL;
974 }
975 return PyLong_FromSsize_t(self->written);
976}
Thomas Wouters477c8d52006-05-27 19:21:47 +0000977
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200978static int
979OSError_written_set(PyOSErrorObject *self, PyObject *arg, void *context)
980{
981 Py_ssize_t n;
982 n = PyNumber_AsSsize_t(arg, PyExc_ValueError);
983 if (n == -1 && PyErr_Occurred())
984 return -1;
985 self->written = n;
986 return 0;
987}
988
989static PyMemberDef OSError_members[] = {
990 {"errno", T_OBJECT, offsetof(PyOSErrorObject, myerrno), 0,
991 PyDoc_STR("POSIX exception code")},
992 {"strerror", T_OBJECT, offsetof(PyOSErrorObject, strerror), 0,
993 PyDoc_STR("exception strerror")},
994 {"filename", T_OBJECT, offsetof(PyOSErrorObject, filename), 0,
995 PyDoc_STR("exception filename")},
996#ifdef MS_WINDOWS
997 {"winerror", T_OBJECT, offsetof(PyOSErrorObject, winerror), 0,
998 PyDoc_STR("Win32 exception code")},
999#endif
1000 {NULL} /* Sentinel */
1001};
1002
1003static PyMethodDef OSError_methods[] = {
1004 {"__reduce__", (PyCFunction)OSError_reduce, METH_NOARGS},
Thomas Wouters477c8d52006-05-27 19:21:47 +00001005 {NULL}
1006};
1007
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001008static PyGetSetDef OSError_getset[] = {
1009 {"characters_written", (getter) OSError_written_get,
1010 (setter) OSError_written_set, NULL},
1011 {NULL}
1012};
1013
1014
1015ComplexExtendsException(PyExc_Exception, OSError,
1016 OSError, OSError_new,
1017 OSError_methods, OSError_members, OSError_getset,
1018 OSError_str,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001019 "Base class for I/O related errors.");
1020
1021
1022/*
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001023 * Various OSError subclasses
Thomas Wouters477c8d52006-05-27 19:21:47 +00001024 */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001025MiddlingExtendsException(PyExc_OSError, BlockingIOError, OSError,
1026 "I/O operation would block.");
1027MiddlingExtendsException(PyExc_OSError, ConnectionError, OSError,
1028 "Connection error.");
1029MiddlingExtendsException(PyExc_OSError, ChildProcessError, OSError,
1030 "Child process error.");
1031MiddlingExtendsException(PyExc_ConnectionError, BrokenPipeError, OSError,
1032 "Broken pipe.");
1033MiddlingExtendsException(PyExc_ConnectionError, ConnectionAbortedError, OSError,
1034 "Connection aborted.");
1035MiddlingExtendsException(PyExc_ConnectionError, ConnectionRefusedError, OSError,
1036 "Connection refused.");
1037MiddlingExtendsException(PyExc_ConnectionError, ConnectionResetError, OSError,
1038 "Connection reset.");
1039MiddlingExtendsException(PyExc_OSError, FileExistsError, OSError,
1040 "File already exists.");
1041MiddlingExtendsException(PyExc_OSError, FileNotFoundError, OSError,
1042 "File not found.");
1043MiddlingExtendsException(PyExc_OSError, IsADirectoryError, OSError,
1044 "Operation doesn't work on directories.");
1045MiddlingExtendsException(PyExc_OSError, NotADirectoryError, OSError,
1046 "Operation only works on directories.");
1047MiddlingExtendsException(PyExc_OSError, InterruptedError, OSError,
1048 "Interrupted by signal.");
1049MiddlingExtendsException(PyExc_OSError, PermissionError, OSError,
1050 "Not enough permissions.");
1051MiddlingExtendsException(PyExc_OSError, ProcessLookupError, OSError,
1052 "Process not found.");
1053MiddlingExtendsException(PyExc_OSError, TimeoutError, OSError,
1054 "Timeout expired.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001055
1056/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001057 * EOFError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001058 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001059SimpleExtendsException(PyExc_Exception, EOFError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001060 "Read beyond end of file.");
1061
1062
1063/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001064 * RuntimeError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001065 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001066SimpleExtendsException(PyExc_Exception, RuntimeError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001067 "Unspecified run-time error.");
1068
1069
1070/*
1071 * NotImplementedError extends RuntimeError
1072 */
1073SimpleExtendsException(PyExc_RuntimeError, NotImplementedError,
1074 "Method or function hasn't been implemented yet.");
1075
1076/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001077 * NameError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001078 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001079SimpleExtendsException(PyExc_Exception, NameError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001080 "Name not found globally.");
1081
1082/*
1083 * UnboundLocalError extends NameError
1084 */
1085SimpleExtendsException(PyExc_NameError, UnboundLocalError,
1086 "Local name referenced but not bound to a value.");
1087
1088/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001089 * AttributeError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001090 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001091SimpleExtendsException(PyExc_Exception, AttributeError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001092 "Attribute not found.");
1093
1094
1095/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001096 * SyntaxError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001097 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001098
1099static int
1100SyntaxError_init(PySyntaxErrorObject *self, PyObject *args, PyObject *kwds)
1101{
1102 PyObject *info = NULL;
1103 Py_ssize_t lenargs = PyTuple_GET_SIZE(args);
1104
1105 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1106 return -1;
1107
1108 if (lenargs >= 1) {
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001109 Py_CLEAR(self->msg);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001110 self->msg = PyTuple_GET_ITEM(args, 0);
1111 Py_INCREF(self->msg);
1112 }
1113 if (lenargs == 2) {
1114 info = PyTuple_GET_ITEM(args, 1);
1115 info = PySequence_Tuple(info);
Benjamin Peterson90b13582012-02-03 19:22:31 -05001116 if (!info)
1117 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001118
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001119 if (PyTuple_GET_SIZE(info) != 4) {
1120 /* not a very good error message, but it's what Python 2.4 gives */
1121 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
1122 Py_DECREF(info);
1123 return -1;
1124 }
1125
1126 Py_CLEAR(self->filename);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001127 self->filename = PyTuple_GET_ITEM(info, 0);
1128 Py_INCREF(self->filename);
1129
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001130 Py_CLEAR(self->lineno);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001131 self->lineno = PyTuple_GET_ITEM(info, 1);
1132 Py_INCREF(self->lineno);
1133
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001134 Py_CLEAR(self->offset);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001135 self->offset = PyTuple_GET_ITEM(info, 2);
1136 Py_INCREF(self->offset);
1137
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001138 Py_CLEAR(self->text);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001139 self->text = PyTuple_GET_ITEM(info, 3);
1140 Py_INCREF(self->text);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001141
1142 Py_DECREF(info);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001143 }
1144 return 0;
1145}
1146
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001147static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001148SyntaxError_clear(PySyntaxErrorObject *self)
1149{
1150 Py_CLEAR(self->msg);
1151 Py_CLEAR(self->filename);
1152 Py_CLEAR(self->lineno);
1153 Py_CLEAR(self->offset);
1154 Py_CLEAR(self->text);
1155 Py_CLEAR(self->print_file_and_line);
1156 return BaseException_clear((PyBaseExceptionObject *)self);
1157}
1158
1159static void
1160SyntaxError_dealloc(PySyntaxErrorObject *self)
1161{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001162 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001163 SyntaxError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +00001164 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001165}
1166
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001167static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001168SyntaxError_traverse(PySyntaxErrorObject *self, visitproc visit, void *arg)
1169{
1170 Py_VISIT(self->msg);
1171 Py_VISIT(self->filename);
1172 Py_VISIT(self->lineno);
1173 Py_VISIT(self->offset);
1174 Py_VISIT(self->text);
1175 Py_VISIT(self->print_file_and_line);
1176 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1177}
1178
1179/* This is called "my_basename" instead of just "basename" to avoid name
1180 conflicts with glibc; basename is already prototyped if _GNU_SOURCE is
1181 defined, and Python does define that. */
Victor Stinner6237daf2010-04-28 17:26:19 +00001182static PyObject*
1183my_basename(PyObject *name)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001184{
Victor Stinner6237daf2010-04-28 17:26:19 +00001185 Py_ssize_t i, size, offset;
Victor Stinner31392e72011-10-05 20:14:23 +02001186 int kind;
1187 void *data;
1188
1189 if (PyUnicode_READY(name))
1190 return NULL;
1191 kind = PyUnicode_KIND(name);
1192 data = PyUnicode_DATA(name);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001193 size = PyUnicode_GET_LENGTH(name);
Victor Stinner6237daf2010-04-28 17:26:19 +00001194 offset = 0;
1195 for(i=0; i < size; i++) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001196 if (PyUnicode_READ(kind, data, i) == SEP)
Victor Stinner6237daf2010-04-28 17:26:19 +00001197 offset = i + 1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001198 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001199 if (offset != 0)
1200 return PyUnicode_Substring(name, offset, size);
1201 else {
Victor Stinner6237daf2010-04-28 17:26:19 +00001202 Py_INCREF(name);
1203 return name;
1204 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001205}
1206
1207
1208static PyObject *
1209SyntaxError_str(PySyntaxErrorObject *self)
1210{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001211 int have_lineno = 0;
Victor Stinner6237daf2010-04-28 17:26:19 +00001212 PyObject *filename;
1213 PyObject *result;
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001214 /* Below, we always ignore overflow errors, just printing -1.
1215 Still, we cannot allow an OverflowError to be raised, so
1216 we need to call PyLong_AsLongAndOverflow. */
1217 int overflow;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001218
1219 /* XXX -- do all the additional formatting with filename and
1220 lineno here */
1221
Neal Norwitzed2b7392007-08-26 04:51:10 +00001222 if (self->filename && PyUnicode_Check(self->filename)) {
Victor Stinner6237daf2010-04-28 17:26:19 +00001223 filename = my_basename(self->filename);
1224 if (filename == NULL)
1225 return NULL;
1226 } else {
1227 filename = NULL;
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001228 }
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001229 have_lineno = (self->lineno != NULL) && PyLong_CheckExact(self->lineno);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001230
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001231 if (!filename && !have_lineno)
Thomas Heller519a0422007-11-15 20:48:54 +00001232 return PyObject_Str(self->msg ? self->msg : Py_None);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001233
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001234 if (filename && have_lineno)
Victor Stinner6237daf2010-04-28 17:26:19 +00001235 result = PyUnicode_FromFormat("%S (%U, line %ld)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001236 self->msg ? self->msg : Py_None,
Victor Stinner6237daf2010-04-28 17:26:19 +00001237 filename,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001238 PyLong_AsLongAndOverflow(self->lineno, &overflow));
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001239 else if (filename)
Victor Stinner6237daf2010-04-28 17:26:19 +00001240 result = PyUnicode_FromFormat("%S (%U)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001241 self->msg ? self->msg : Py_None,
Victor Stinner6237daf2010-04-28 17:26:19 +00001242 filename);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001243 else /* only have_lineno */
Victor Stinner6237daf2010-04-28 17:26:19 +00001244 result = PyUnicode_FromFormat("%S (line %ld)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001245 self->msg ? self->msg : Py_None,
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001246 PyLong_AsLongAndOverflow(self->lineno, &overflow));
Victor Stinner6237daf2010-04-28 17:26:19 +00001247 Py_XDECREF(filename);
1248 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001249}
1250
1251static PyMemberDef SyntaxError_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +00001252 {"msg", T_OBJECT, offsetof(PySyntaxErrorObject, msg), 0,
1253 PyDoc_STR("exception msg")},
1254 {"filename", T_OBJECT, offsetof(PySyntaxErrorObject, filename), 0,
1255 PyDoc_STR("exception filename")},
1256 {"lineno", T_OBJECT, offsetof(PySyntaxErrorObject, lineno), 0,
1257 PyDoc_STR("exception lineno")},
1258 {"offset", T_OBJECT, offsetof(PySyntaxErrorObject, offset), 0,
1259 PyDoc_STR("exception offset")},
1260 {"text", T_OBJECT, offsetof(PySyntaxErrorObject, text), 0,
1261 PyDoc_STR("exception text")},
1262 {"print_file_and_line", T_OBJECT,
1263 offsetof(PySyntaxErrorObject, print_file_and_line), 0,
1264 PyDoc_STR("exception print_file_and_line")},
1265 {NULL} /* Sentinel */
1266};
1267
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001268ComplexExtendsException(PyExc_Exception, SyntaxError, SyntaxError,
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001269 0, 0, SyntaxError_members, 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001270 SyntaxError_str, "Invalid syntax.");
1271
1272
1273/*
1274 * IndentationError extends SyntaxError
1275 */
1276MiddlingExtendsException(PyExc_SyntaxError, IndentationError, SyntaxError,
1277 "Improper indentation.");
1278
1279
1280/*
1281 * TabError extends IndentationError
1282 */
1283MiddlingExtendsException(PyExc_IndentationError, TabError, SyntaxError,
1284 "Improper mixture of spaces and tabs.");
1285
1286
1287/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001288 * LookupError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001289 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001290SimpleExtendsException(PyExc_Exception, LookupError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001291 "Base class for lookup errors.");
1292
1293
1294/*
1295 * IndexError extends LookupError
1296 */
1297SimpleExtendsException(PyExc_LookupError, IndexError,
1298 "Sequence index out of range.");
1299
1300
1301/*
1302 * KeyError extends LookupError
1303 */
1304static PyObject *
1305KeyError_str(PyBaseExceptionObject *self)
1306{
1307 /* If args is a tuple of exactly one item, apply repr to args[0].
1308 This is done so that e.g. the exception raised by {}[''] prints
1309 KeyError: ''
1310 rather than the confusing
1311 KeyError
1312 alone. The downside is that if KeyError is raised with an explanatory
1313 string, that string will be displayed in quotes. Too bad.
1314 If args is anything else, use the default BaseException__str__().
1315 */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001316 if (PyTuple_GET_SIZE(self->args) == 1) {
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001317 return PyObject_Repr(PyTuple_GET_ITEM(self->args, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001318 }
1319 return BaseException_str(self);
1320}
1321
1322ComplexExtendsException(PyExc_LookupError, KeyError, BaseException,
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001323 0, 0, 0, 0, KeyError_str, "Mapping key not found.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001324
1325
1326/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001327 * ValueError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001328 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001329SimpleExtendsException(PyExc_Exception, ValueError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001330 "Inappropriate argument value (of correct type).");
1331
1332/*
1333 * UnicodeError extends ValueError
1334 */
1335
1336SimpleExtendsException(PyExc_ValueError, UnicodeError,
1337 "Unicode related error.");
1338
Thomas Wouters477c8d52006-05-27 19:21:47 +00001339static PyObject *
Guido van Rossum98297ee2007-11-06 21:34:58 +00001340get_string(PyObject *attr, const char *name)
Walter Dörwald612344f2007-05-04 19:28:21 +00001341{
1342 if (!attr) {
1343 PyErr_Format(PyExc_TypeError, "%.200s attribute not set", name);
1344 return NULL;
1345 }
1346
Christian Heimes72b710a2008-05-26 13:28:38 +00001347 if (!PyBytes_Check(attr)) {
Walter Dörwald612344f2007-05-04 19:28:21 +00001348 PyErr_Format(PyExc_TypeError, "%.200s attribute must be bytes", name);
1349 return NULL;
1350 }
1351 Py_INCREF(attr);
1352 return attr;
1353}
1354
1355static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00001356get_unicode(PyObject *attr, const char *name)
1357{
1358 if (!attr) {
1359 PyErr_Format(PyExc_TypeError, "%.200s attribute not set", name);
1360 return NULL;
1361 }
1362
1363 if (!PyUnicode_Check(attr)) {
1364 PyErr_Format(PyExc_TypeError,
1365 "%.200s attribute must be unicode", name);
1366 return NULL;
1367 }
1368 Py_INCREF(attr);
1369 return attr;
1370}
1371
Walter Dörwaldd2034312007-05-18 16:29:38 +00001372static int
1373set_unicodefromstring(PyObject **attr, const char *value)
1374{
1375 PyObject *obj = PyUnicode_FromString(value);
1376 if (!obj)
1377 return -1;
1378 Py_CLEAR(*attr);
1379 *attr = obj;
1380 return 0;
1381}
1382
Thomas Wouters477c8d52006-05-27 19:21:47 +00001383PyObject *
1384PyUnicodeEncodeError_GetEncoding(PyObject *exc)
1385{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001386 return get_unicode(((PyUnicodeErrorObject *)exc)->encoding, "encoding");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001387}
1388
1389PyObject *
1390PyUnicodeDecodeError_GetEncoding(PyObject *exc)
1391{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001392 return get_unicode(((PyUnicodeErrorObject *)exc)->encoding, "encoding");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001393}
1394
1395PyObject *
1396PyUnicodeEncodeError_GetObject(PyObject *exc)
1397{
1398 return get_unicode(((PyUnicodeErrorObject *)exc)->object, "object");
1399}
1400
1401PyObject *
1402PyUnicodeDecodeError_GetObject(PyObject *exc)
1403{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001404 return get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001405}
1406
1407PyObject *
1408PyUnicodeTranslateError_GetObject(PyObject *exc)
1409{
1410 return get_unicode(((PyUnicodeErrorObject *)exc)->object, "object");
1411}
1412
1413int
1414PyUnicodeEncodeError_GetStart(PyObject *exc, Py_ssize_t *start)
1415{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001416 Py_ssize_t size;
1417 PyObject *obj = get_unicode(((PyUnicodeErrorObject *)exc)->object,
1418 "object");
1419 if (!obj)
1420 return -1;
1421 *start = ((PyUnicodeErrorObject *)exc)->start;
Victor Stinner9e30aa52011-11-21 02:49:52 +01001422 size = PyUnicode_GET_LENGTH(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001423 if (*start<0)
1424 *start = 0; /*XXX check for values <0*/
1425 if (*start>=size)
1426 *start = size-1;
1427 Py_DECREF(obj);
1428 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001429}
1430
1431
1432int
1433PyUnicodeDecodeError_GetStart(PyObject *exc, Py_ssize_t *start)
1434{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001435 Py_ssize_t size;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001436 PyObject *obj = get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001437 if (!obj)
1438 return -1;
Christian Heimes72b710a2008-05-26 13:28:38 +00001439 size = PyBytes_GET_SIZE(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001440 *start = ((PyUnicodeErrorObject *)exc)->start;
1441 if (*start<0)
1442 *start = 0;
1443 if (*start>=size)
1444 *start = size-1;
1445 Py_DECREF(obj);
1446 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001447}
1448
1449
1450int
1451PyUnicodeTranslateError_GetStart(PyObject *exc, Py_ssize_t *start)
1452{
1453 return PyUnicodeEncodeError_GetStart(exc, start);
1454}
1455
1456
1457int
1458PyUnicodeEncodeError_SetStart(PyObject *exc, Py_ssize_t start)
1459{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001460 ((PyUnicodeErrorObject *)exc)->start = start;
1461 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001462}
1463
1464
1465int
1466PyUnicodeDecodeError_SetStart(PyObject *exc, Py_ssize_t start)
1467{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001468 ((PyUnicodeErrorObject *)exc)->start = start;
1469 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001470}
1471
1472
1473int
1474PyUnicodeTranslateError_SetStart(PyObject *exc, Py_ssize_t start)
1475{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001476 ((PyUnicodeErrorObject *)exc)->start = start;
1477 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001478}
1479
1480
1481int
1482PyUnicodeEncodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
1483{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001484 Py_ssize_t size;
1485 PyObject *obj = get_unicode(((PyUnicodeErrorObject *)exc)->object,
1486 "object");
1487 if (!obj)
1488 return -1;
1489 *end = ((PyUnicodeErrorObject *)exc)->end;
Victor Stinner9e30aa52011-11-21 02:49:52 +01001490 size = PyUnicode_GET_LENGTH(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001491 if (*end<1)
1492 *end = 1;
1493 if (*end>size)
1494 *end = size;
1495 Py_DECREF(obj);
1496 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001497}
1498
1499
1500int
1501PyUnicodeDecodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
1502{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001503 Py_ssize_t size;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001504 PyObject *obj = get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001505 if (!obj)
1506 return -1;
Christian Heimes72b710a2008-05-26 13:28:38 +00001507 size = PyBytes_GET_SIZE(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001508 *end = ((PyUnicodeErrorObject *)exc)->end;
1509 if (*end<1)
1510 *end = 1;
1511 if (*end>size)
1512 *end = size;
1513 Py_DECREF(obj);
1514 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001515}
1516
1517
1518int
1519PyUnicodeTranslateError_GetEnd(PyObject *exc, Py_ssize_t *start)
1520{
1521 return PyUnicodeEncodeError_GetEnd(exc, start);
1522}
1523
1524
1525int
1526PyUnicodeEncodeError_SetEnd(PyObject *exc, Py_ssize_t end)
1527{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001528 ((PyUnicodeErrorObject *)exc)->end = end;
1529 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001530}
1531
1532
1533int
1534PyUnicodeDecodeError_SetEnd(PyObject *exc, Py_ssize_t end)
1535{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001536 ((PyUnicodeErrorObject *)exc)->end = end;
1537 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001538}
1539
1540
1541int
1542PyUnicodeTranslateError_SetEnd(PyObject *exc, Py_ssize_t end)
1543{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001544 ((PyUnicodeErrorObject *)exc)->end = end;
1545 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001546}
1547
1548PyObject *
1549PyUnicodeEncodeError_GetReason(PyObject *exc)
1550{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001551 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001552}
1553
1554
1555PyObject *
1556PyUnicodeDecodeError_GetReason(PyObject *exc)
1557{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001558 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001559}
1560
1561
1562PyObject *
1563PyUnicodeTranslateError_GetReason(PyObject *exc)
1564{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001565 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001566}
1567
1568
1569int
1570PyUnicodeEncodeError_SetReason(PyObject *exc, const char *reason)
1571{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001572 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1573 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001574}
1575
1576
1577int
1578PyUnicodeDecodeError_SetReason(PyObject *exc, const char *reason)
1579{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001580 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1581 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001582}
1583
1584
1585int
1586PyUnicodeTranslateError_SetReason(PyObject *exc, const char *reason)
1587{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001588 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1589 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001590}
1591
1592
Thomas Wouters477c8d52006-05-27 19:21:47 +00001593static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001594UnicodeError_clear(PyUnicodeErrorObject *self)
1595{
1596 Py_CLEAR(self->encoding);
1597 Py_CLEAR(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001598 Py_CLEAR(self->reason);
1599 return BaseException_clear((PyBaseExceptionObject *)self);
1600}
1601
1602static void
1603UnicodeError_dealloc(PyUnicodeErrorObject *self)
1604{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001605 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001606 UnicodeError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +00001607 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001608}
1609
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001610static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001611UnicodeError_traverse(PyUnicodeErrorObject *self, visitproc visit, void *arg)
1612{
1613 Py_VISIT(self->encoding);
1614 Py_VISIT(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001615 Py_VISIT(self->reason);
1616 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1617}
1618
1619static PyMemberDef UnicodeError_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +00001620 {"encoding", T_OBJECT, offsetof(PyUnicodeErrorObject, encoding), 0,
1621 PyDoc_STR("exception encoding")},
1622 {"object", T_OBJECT, offsetof(PyUnicodeErrorObject, object), 0,
1623 PyDoc_STR("exception object")},
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001624 {"start", T_PYSSIZET, offsetof(PyUnicodeErrorObject, start), 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001625 PyDoc_STR("exception start")},
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001626 {"end", T_PYSSIZET, offsetof(PyUnicodeErrorObject, end), 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001627 PyDoc_STR("exception end")},
1628 {"reason", T_OBJECT, offsetof(PyUnicodeErrorObject, reason), 0,
1629 PyDoc_STR("exception reason")},
1630 {NULL} /* Sentinel */
1631};
1632
1633
1634/*
1635 * UnicodeEncodeError extends UnicodeError
1636 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001637
1638static int
1639UnicodeEncodeError_init(PyObject *self, PyObject *args, PyObject *kwds)
1640{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001641 PyUnicodeErrorObject *err;
1642
Thomas Wouters477c8d52006-05-27 19:21:47 +00001643 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1644 return -1;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001645
1646 err = (PyUnicodeErrorObject *)self;
1647
1648 Py_CLEAR(err->encoding);
1649 Py_CLEAR(err->object);
1650 Py_CLEAR(err->reason);
1651
1652 if (!PyArg_ParseTuple(args, "O!O!nnO!",
1653 &PyUnicode_Type, &err->encoding,
1654 &PyUnicode_Type, &err->object,
1655 &err->start,
1656 &err->end,
1657 &PyUnicode_Type, &err->reason)) {
1658 err->encoding = err->object = err->reason = NULL;
1659 return -1;
1660 }
1661
Martin v. Löwisb09af032011-11-04 11:16:41 +01001662 if (PyUnicode_READY(err->object) < -1) {
1663 err->encoding = NULL;
1664 return -1;
1665 }
1666
Guido van Rossum98297ee2007-11-06 21:34:58 +00001667 Py_INCREF(err->encoding);
1668 Py_INCREF(err->object);
1669 Py_INCREF(err->reason);
1670
1671 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001672}
1673
1674static PyObject *
1675UnicodeEncodeError_str(PyObject *self)
1676{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001677 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00001678 PyObject *result = NULL;
1679 PyObject *reason_str = NULL;
1680 PyObject *encoding_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001681
Eric Smith0facd772010-02-24 15:42:29 +00001682 /* Get reason and encoding as strings, which they might not be if
1683 they've been modified after we were contructed. */
1684 reason_str = PyObject_Str(uself->reason);
1685 if (reason_str == NULL)
1686 goto done;
1687 encoding_str = PyObject_Str(uself->encoding);
1688 if (encoding_str == NULL)
1689 goto done;
1690
Victor Stinnerda1ddf32011-11-20 22:50:23 +01001691 if (uself->start < PyUnicode_GET_LENGTH(uself->object) && uself->end == uself->start+1) {
1692 Py_UCS4 badchar = PyUnicode_ReadChar(uself->object, uself->start);
Walter Dörwald787b03b2007-06-05 13:29:29 +00001693 const char *fmt;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001694 if (badchar <= 0xff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00001695 fmt = "'%U' codec can't encode character '\\x%02x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001696 else if (badchar <= 0xffff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00001697 fmt = "'%U' codec can't encode character '\\u%04x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001698 else
Walter Dörwald32a4c712007-06-20 09:25:34 +00001699 fmt = "'%U' codec can't encode character '\\U%08x' in position %zd: %U";
Eric Smith0facd772010-02-24 15:42:29 +00001700 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00001701 fmt,
Eric Smith0facd772010-02-24 15:42:29 +00001702 encoding_str,
Victor Stinnerda1ddf32011-11-20 22:50:23 +01001703 (int)badchar,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001704 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00001705 reason_str);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001706 }
Eric Smith0facd772010-02-24 15:42:29 +00001707 else {
1708 result = PyUnicode_FromFormat(
1709 "'%U' codec can't encode characters in position %zd-%zd: %U",
1710 encoding_str,
1711 uself->start,
1712 uself->end-1,
1713 reason_str);
1714 }
1715done:
1716 Py_XDECREF(reason_str);
1717 Py_XDECREF(encoding_str);
1718 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001719}
1720
1721static PyTypeObject _PyExc_UnicodeEncodeError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001722 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00001723 "UnicodeEncodeError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00001724 sizeof(PyUnicodeErrorObject), 0,
1725 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1726 (reprfunc)UnicodeEncodeError_str, 0, 0, 0,
1727 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001728 PyDoc_STR("Unicode encoding error."), (traverseproc)UnicodeError_traverse,
1729 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001730 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001731 (initproc)UnicodeEncodeError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001732};
1733PyObject *PyExc_UnicodeEncodeError = (PyObject *)&_PyExc_UnicodeEncodeError;
1734
1735PyObject *
1736PyUnicodeEncodeError_Create(
1737 const char *encoding, const Py_UNICODE *object, Py_ssize_t length,
1738 Py_ssize_t start, Py_ssize_t end, const char *reason)
1739{
Victor Stinner7eeb5b52010-06-07 19:57:46 +00001740 return PyObject_CallFunction(PyExc_UnicodeEncodeError, "su#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001741 encoding, object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001742}
1743
1744
1745/*
1746 * UnicodeDecodeError extends UnicodeError
1747 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001748
1749static int
1750UnicodeDecodeError_init(PyObject *self, PyObject *args, PyObject *kwds)
1751{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001752 PyUnicodeErrorObject *ude;
1753 const char *data;
1754 Py_ssize_t size;
1755
Thomas Wouters477c8d52006-05-27 19:21:47 +00001756 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1757 return -1;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001758
1759 ude = (PyUnicodeErrorObject *)self;
1760
1761 Py_CLEAR(ude->encoding);
1762 Py_CLEAR(ude->object);
1763 Py_CLEAR(ude->reason);
1764
1765 if (!PyArg_ParseTuple(args, "O!OnnO!",
1766 &PyUnicode_Type, &ude->encoding,
1767 &ude->object,
1768 &ude->start,
1769 &ude->end,
1770 &PyUnicode_Type, &ude->reason)) {
1771 ude->encoding = ude->object = ude->reason = NULL;
1772 return -1;
1773 }
1774
Christian Heimes72b710a2008-05-26 13:28:38 +00001775 if (!PyBytes_Check(ude->object)) {
Guido van Rossum98297ee2007-11-06 21:34:58 +00001776 if (PyObject_AsReadBuffer(ude->object, (const void **)&data, &size)) {
1777 ude->encoding = ude->object = ude->reason = NULL;
1778 return -1;
1779 }
Christian Heimes72b710a2008-05-26 13:28:38 +00001780 ude->object = PyBytes_FromStringAndSize(data, size);
Guido van Rossum98297ee2007-11-06 21:34:58 +00001781 }
1782 else {
1783 Py_INCREF(ude->object);
1784 }
1785
1786 Py_INCREF(ude->encoding);
1787 Py_INCREF(ude->reason);
1788
1789 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001790}
1791
1792static PyObject *
1793UnicodeDecodeError_str(PyObject *self)
1794{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001795 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00001796 PyObject *result = NULL;
1797 PyObject *reason_str = NULL;
1798 PyObject *encoding_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001799
Eric Smith0facd772010-02-24 15:42:29 +00001800 /* Get reason and encoding as strings, which they might not be if
1801 they've been modified after we were contructed. */
1802 reason_str = PyObject_Str(uself->reason);
1803 if (reason_str == NULL)
1804 goto done;
1805 encoding_str = PyObject_Str(uself->encoding);
1806 if (encoding_str == NULL)
1807 goto done;
1808
1809 if (uself->start < PyBytes_GET_SIZE(uself->object) && uself->end == uself->start+1) {
Christian Heimes72b710a2008-05-26 13:28:38 +00001810 int byte = (int)(PyBytes_AS_STRING(((PyUnicodeErrorObject *)self)->object)[uself->start]&0xff);
Eric Smith0facd772010-02-24 15:42:29 +00001811 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00001812 "'%U' codec can't decode byte 0x%02x in position %zd: %U",
Eric Smith0facd772010-02-24 15:42:29 +00001813 encoding_str,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001814 byte,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001815 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00001816 reason_str);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001817 }
Eric Smith0facd772010-02-24 15:42:29 +00001818 else {
1819 result = PyUnicode_FromFormat(
1820 "'%U' codec can't decode bytes in position %zd-%zd: %U",
1821 encoding_str,
1822 uself->start,
1823 uself->end-1,
1824 reason_str
1825 );
1826 }
1827done:
1828 Py_XDECREF(reason_str);
1829 Py_XDECREF(encoding_str);
1830 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001831}
1832
1833static PyTypeObject _PyExc_UnicodeDecodeError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001834 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00001835 "UnicodeDecodeError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00001836 sizeof(PyUnicodeErrorObject), 0,
1837 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1838 (reprfunc)UnicodeDecodeError_str, 0, 0, 0,
1839 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001840 PyDoc_STR("Unicode decoding error."), (traverseproc)UnicodeError_traverse,
1841 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001842 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001843 (initproc)UnicodeDecodeError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001844};
1845PyObject *PyExc_UnicodeDecodeError = (PyObject *)&_PyExc_UnicodeDecodeError;
1846
1847PyObject *
1848PyUnicodeDecodeError_Create(
1849 const char *encoding, const char *object, Py_ssize_t length,
1850 Py_ssize_t start, Py_ssize_t end, const char *reason)
1851{
Victor Stinner7eeb5b52010-06-07 19:57:46 +00001852 return PyObject_CallFunction(PyExc_UnicodeDecodeError, "sy#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001853 encoding, object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001854}
1855
1856
1857/*
1858 * UnicodeTranslateError extends UnicodeError
1859 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001860
1861static int
1862UnicodeTranslateError_init(PyUnicodeErrorObject *self, PyObject *args,
1863 PyObject *kwds)
1864{
1865 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1866 return -1;
1867
1868 Py_CLEAR(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001869 Py_CLEAR(self->reason);
1870
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001871 if (!PyArg_ParseTuple(args, "O!nnO!",
Thomas Wouters477c8d52006-05-27 19:21:47 +00001872 &PyUnicode_Type, &self->object,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001873 &self->start,
1874 &self->end,
Walter Dörwaldd2034312007-05-18 16:29:38 +00001875 &PyUnicode_Type, &self->reason)) {
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001876 self->object = self->reason = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001877 return -1;
1878 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001879
Thomas Wouters477c8d52006-05-27 19:21:47 +00001880 Py_INCREF(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001881 Py_INCREF(self->reason);
1882
1883 return 0;
1884}
1885
1886
1887static PyObject *
1888UnicodeTranslateError_str(PyObject *self)
1889{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001890 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00001891 PyObject *result = NULL;
1892 PyObject *reason_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001893
Eric Smith0facd772010-02-24 15:42:29 +00001894 /* Get reason as a string, which it might not be if it's been
1895 modified after we were contructed. */
1896 reason_str = PyObject_Str(uself->reason);
1897 if (reason_str == NULL)
1898 goto done;
1899
Victor Stinner53b33e72011-11-21 01:17:27 +01001900 if (uself->start < PyUnicode_GET_LENGTH(uself->object) && uself->end == uself->start+1) {
1901 Py_UCS4 badchar = PyUnicode_ReadChar(uself->object, uself->start);
Walter Dörwald787b03b2007-06-05 13:29:29 +00001902 const char *fmt;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001903 if (badchar <= 0xff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00001904 fmt = "can't translate character '\\x%02x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001905 else if (badchar <= 0xffff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00001906 fmt = "can't translate character '\\u%04x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001907 else
Walter Dörwald32a4c712007-06-20 09:25:34 +00001908 fmt = "can't translate character '\\U%08x' in position %zd: %U";
Benjamin Petersonc5f4e1e2010-02-25 01:22:28 +00001909 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00001910 fmt,
Victor Stinner53b33e72011-11-21 01:17:27 +01001911 (int)badchar,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001912 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00001913 reason_str
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001914 );
Eric Smith0facd772010-02-24 15:42:29 +00001915 } else {
1916 result = PyUnicode_FromFormat(
1917 "can't translate characters in position %zd-%zd: %U",
1918 uself->start,
1919 uself->end-1,
1920 reason_str
1921 );
Thomas Wouters477c8d52006-05-27 19:21:47 +00001922 }
Eric Smith0facd772010-02-24 15:42:29 +00001923done:
1924 Py_XDECREF(reason_str);
1925 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001926}
1927
1928static PyTypeObject _PyExc_UnicodeTranslateError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001929 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00001930 "UnicodeTranslateError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00001931 sizeof(PyUnicodeErrorObject), 0,
1932 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1933 (reprfunc)UnicodeTranslateError_str, 0, 0, 0,
1934 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters89f507f2006-12-13 04:49:30 +00001935 PyDoc_STR("Unicode translation error."), (traverseproc)UnicodeError_traverse,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001936 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
1937 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001938 (initproc)UnicodeTranslateError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001939};
1940PyObject *PyExc_UnicodeTranslateError = (PyObject *)&_PyExc_UnicodeTranslateError;
1941
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001942/* Deprecated. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001943PyObject *
1944PyUnicodeTranslateError_Create(
1945 const Py_UNICODE *object, Py_ssize_t length,
1946 Py_ssize_t start, Py_ssize_t end, const char *reason)
1947{
1948 return PyObject_CallFunction(PyExc_UnicodeTranslateError, "u#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001949 object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001950}
Thomas Wouters477c8d52006-05-27 19:21:47 +00001951
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001952PyObject *
1953_PyUnicodeTranslateError_Create(
1954 PyObject *object,
1955 Py_ssize_t start, Py_ssize_t end, const char *reason)
1956{
1957 return PyObject_CallFunction(PyExc_UnicodeTranslateError, "Ons",
1958 object, start, end, reason);
1959}
Thomas Wouters477c8d52006-05-27 19:21:47 +00001960
1961/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001962 * AssertionError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001963 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001964SimpleExtendsException(PyExc_Exception, AssertionError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001965 "Assertion failed.");
1966
1967
1968/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001969 * ArithmeticError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001970 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001971SimpleExtendsException(PyExc_Exception, ArithmeticError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001972 "Base class for arithmetic errors.");
1973
1974
1975/*
1976 * FloatingPointError extends ArithmeticError
1977 */
1978SimpleExtendsException(PyExc_ArithmeticError, FloatingPointError,
1979 "Floating point operation failed.");
1980
1981
1982/*
1983 * OverflowError extends ArithmeticError
1984 */
1985SimpleExtendsException(PyExc_ArithmeticError, OverflowError,
1986 "Result too large to be represented.");
1987
1988
1989/*
1990 * ZeroDivisionError extends ArithmeticError
1991 */
1992SimpleExtendsException(PyExc_ArithmeticError, ZeroDivisionError,
1993 "Second argument to a division or modulo operation was zero.");
1994
1995
1996/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001997 * SystemError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001998 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001999SimpleExtendsException(PyExc_Exception, SystemError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002000 "Internal error in the Python interpreter.\n"
2001 "\n"
2002 "Please report this to the Python maintainer, along with the traceback,\n"
2003 "the Python version, and the hardware/OS platform and version.");
2004
2005
2006/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002007 * ReferenceError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002008 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002009SimpleExtendsException(PyExc_Exception, ReferenceError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002010 "Weak ref proxy used after referent went away.");
2011
2012
2013/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002014 * MemoryError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002015 */
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002016
2017#define MEMERRORS_SAVE 16
2018static PyBaseExceptionObject *memerrors_freelist = NULL;
2019static int memerrors_numfree = 0;
2020
2021static PyObject *
2022MemoryError_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2023{
2024 PyBaseExceptionObject *self;
2025
2026 if (type != (PyTypeObject *) PyExc_MemoryError)
2027 return BaseException_new(type, args, kwds);
2028 if (memerrors_freelist == NULL)
2029 return BaseException_new(type, args, kwds);
2030 /* Fetch object from freelist and revive it */
2031 self = memerrors_freelist;
2032 self->args = PyTuple_New(0);
2033 /* This shouldn't happen since the empty tuple is persistent */
2034 if (self->args == NULL)
2035 return NULL;
2036 memerrors_freelist = (PyBaseExceptionObject *) self->dict;
2037 memerrors_numfree--;
2038 self->dict = NULL;
2039 _Py_NewReference((PyObject *)self);
2040 _PyObject_GC_TRACK(self);
2041 return (PyObject *)self;
2042}
2043
2044static void
2045MemoryError_dealloc(PyBaseExceptionObject *self)
2046{
2047 _PyObject_GC_UNTRACK(self);
2048 BaseException_clear(self);
2049 if (memerrors_numfree >= MEMERRORS_SAVE)
2050 Py_TYPE(self)->tp_free((PyObject *)self);
2051 else {
2052 self->dict = (PyObject *) memerrors_freelist;
2053 memerrors_freelist = self;
2054 memerrors_numfree++;
2055 }
2056}
2057
2058static void
2059preallocate_memerrors(void)
2060{
2061 /* We create enough MemoryErrors and then decref them, which will fill
2062 up the freelist. */
2063 int i;
2064 PyObject *errors[MEMERRORS_SAVE];
2065 for (i = 0; i < MEMERRORS_SAVE; i++) {
2066 errors[i] = MemoryError_new((PyTypeObject *) PyExc_MemoryError,
2067 NULL, NULL);
2068 if (!errors[i])
2069 Py_FatalError("Could not preallocate MemoryError object");
2070 }
2071 for (i = 0; i < MEMERRORS_SAVE; i++) {
2072 Py_DECREF(errors[i]);
2073 }
2074}
2075
2076static void
2077free_preallocated_memerrors(void)
2078{
2079 while (memerrors_freelist != NULL) {
2080 PyObject *self = (PyObject *) memerrors_freelist;
2081 memerrors_freelist = (PyBaseExceptionObject *) memerrors_freelist->dict;
2082 Py_TYPE(self)->tp_free((PyObject *)self);
2083 }
2084}
2085
2086
2087static PyTypeObject _PyExc_MemoryError = {
2088 PyVarObject_HEAD_INIT(NULL, 0)
2089 "MemoryError",
2090 sizeof(PyBaseExceptionObject),
2091 0, (destructor)MemoryError_dealloc, 0, 0, 0, 0, 0, 0, 0,
2092 0, 0, 0, 0, 0, 0, 0,
2093 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
2094 PyDoc_STR("Out of memory."), (traverseproc)BaseException_traverse,
2095 (inquiry)BaseException_clear, 0, 0, 0, 0, 0, 0, 0, &_PyExc_Exception,
2096 0, 0, 0, offsetof(PyBaseExceptionObject, dict),
2097 (initproc)BaseException_init, 0, MemoryError_new
2098};
2099PyObject *PyExc_MemoryError = (PyObject *) &_PyExc_MemoryError;
2100
Thomas Wouters477c8d52006-05-27 19:21:47 +00002101
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002102/*
2103 * BufferError extends Exception
2104 */
2105SimpleExtendsException(PyExc_Exception, BufferError, "Buffer error.");
2106
Thomas Wouters477c8d52006-05-27 19:21:47 +00002107
2108/* Warning category docstrings */
2109
2110/*
2111 * Warning extends Exception
2112 */
2113SimpleExtendsException(PyExc_Exception, Warning,
2114 "Base class for warning categories.");
2115
2116
2117/*
2118 * UserWarning extends Warning
2119 */
2120SimpleExtendsException(PyExc_Warning, UserWarning,
2121 "Base class for warnings generated by user code.");
2122
2123
2124/*
2125 * DeprecationWarning extends Warning
2126 */
2127SimpleExtendsException(PyExc_Warning, DeprecationWarning,
2128 "Base class for warnings about deprecated features.");
2129
2130
2131/*
2132 * PendingDeprecationWarning extends Warning
2133 */
2134SimpleExtendsException(PyExc_Warning, PendingDeprecationWarning,
2135 "Base class for warnings about features which will be deprecated\n"
2136 "in the future.");
2137
2138
2139/*
2140 * SyntaxWarning extends Warning
2141 */
2142SimpleExtendsException(PyExc_Warning, SyntaxWarning,
2143 "Base class for warnings about dubious syntax.");
2144
2145
2146/*
2147 * RuntimeWarning extends Warning
2148 */
2149SimpleExtendsException(PyExc_Warning, RuntimeWarning,
2150 "Base class for warnings about dubious runtime behavior.");
2151
2152
2153/*
2154 * FutureWarning extends Warning
2155 */
2156SimpleExtendsException(PyExc_Warning, FutureWarning,
2157 "Base class for warnings about constructs that will change semantically\n"
2158 "in the future.");
2159
2160
2161/*
2162 * ImportWarning extends Warning
2163 */
2164SimpleExtendsException(PyExc_Warning, ImportWarning,
2165 "Base class for warnings about probable mistakes in module imports");
2166
2167
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002168/*
2169 * UnicodeWarning extends Warning
2170 */
2171SimpleExtendsException(PyExc_Warning, UnicodeWarning,
2172 "Base class for warnings about Unicode related problems, mostly\n"
2173 "related to conversion problems.");
2174
Georg Brandl08be72d2010-10-24 15:11:22 +00002175
Guido van Rossum98297ee2007-11-06 21:34:58 +00002176/*
2177 * BytesWarning extends Warning
2178 */
2179SimpleExtendsException(PyExc_Warning, BytesWarning,
2180 "Base class for warnings about bytes and buffer related problems, mostly\n"
2181 "related to conversion from str or comparing to str.");
2182
2183
Georg Brandl08be72d2010-10-24 15:11:22 +00002184/*
2185 * ResourceWarning extends Warning
2186 */
2187SimpleExtendsException(PyExc_Warning, ResourceWarning,
2188 "Base class for warnings about resource usage.");
2189
2190
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002191
Thomas Wouters89d996e2007-09-08 17:39:28 +00002192/* Pre-computed RuntimeError instance for when recursion depth is reached.
2193 Meant to be used when normalizing the exception for exceeding the recursion
2194 depth will cause its own infinite recursion.
2195*/
2196PyObject *PyExc_RecursionErrorInst = NULL;
2197
Antoine Pitrou55f217f2012-01-18 21:23:13 +01002198#define PRE_INIT(TYPE) \
2199 if (!(_PyExc_ ## TYPE.tp_flags & Py_TPFLAGS_READY)) { \
2200 if (PyType_Ready(&_PyExc_ ## TYPE) < 0) \
2201 Py_FatalError("exceptions bootstrapping error."); \
2202 Py_INCREF(PyExc_ ## TYPE); \
2203 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002204
Antoine Pitrou55f217f2012-01-18 21:23:13 +01002205#define POST_INIT(TYPE) \
Thomas Wouters477c8d52006-05-27 19:21:47 +00002206 if (PyDict_SetItemString(bdict, # TYPE, PyExc_ ## TYPE)) \
2207 Py_FatalError("Module dictionary insertion problem.");
2208
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002209#define INIT_ALIAS(NAME, TYPE) Py_INCREF(PyExc_ ## TYPE); \
Antoine Pitrou8b0a74e2012-01-18 21:29:05 +01002210 Py_XDECREF(PyExc_ ## NAME); \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002211 PyExc_ ## NAME = PyExc_ ## TYPE; \
2212 if (PyDict_SetItemString(bdict, # NAME, PyExc_ ## NAME)) \
2213 Py_FatalError("Module dictionary insertion problem.");
2214
2215#define ADD_ERRNO(TYPE, CODE) { \
2216 PyObject *_code = PyLong_FromLong(CODE); \
2217 assert(_PyObject_RealIsSubclass(PyExc_ ## TYPE, PyExc_OSError)); \
2218 if (!_code || PyDict_SetItem(errnomap, _code, PyExc_ ## TYPE)) \
2219 Py_FatalError("errmap insertion problem."); \
Antoine Pitrou8b0a74e2012-01-18 21:29:05 +01002220 Py_DECREF(_code); \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002221 }
2222
2223#ifdef MS_WINDOWS
2224#include <Winsock2.h>
2225#if defined(WSAEALREADY) && !defined(EALREADY)
2226#define EALREADY WSAEALREADY
2227#endif
2228#if defined(WSAECONNABORTED) && !defined(ECONNABORTED)
2229#define ECONNABORTED WSAECONNABORTED
2230#endif
2231#if defined(WSAECONNREFUSED) && !defined(ECONNREFUSED)
2232#define ECONNREFUSED WSAECONNREFUSED
2233#endif
2234#if defined(WSAECONNRESET) && !defined(ECONNRESET)
2235#define ECONNRESET WSAECONNRESET
2236#endif
2237#if defined(WSAEINPROGRESS) && !defined(EINPROGRESS)
2238#define EINPROGRESS WSAEINPROGRESS
2239#endif
2240#if defined(WSAESHUTDOWN) && !defined(ESHUTDOWN)
2241#define ESHUTDOWN WSAESHUTDOWN
2242#endif
2243#if defined(WSAETIMEDOUT) && !defined(ETIMEDOUT)
2244#define ETIMEDOUT WSAETIMEDOUT
2245#endif
2246#if defined(WSAEWOULDBLOCK) && !defined(EWOULDBLOCK)
2247#define EWOULDBLOCK WSAEWOULDBLOCK
2248#endif
2249#endif /* MS_WINDOWS */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002250
Martin v. Löwis1a214512008-06-11 05:26:20 +00002251void
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002252_PyExc_Init(void)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002253{
Neal Norwitz2633c692007-02-26 22:22:47 +00002254 PyObject *bltinmod, *bdict;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002255
2256 PRE_INIT(BaseException)
2257 PRE_INIT(Exception)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002258 PRE_INIT(TypeError)
2259 PRE_INIT(StopIteration)
2260 PRE_INIT(GeneratorExit)
2261 PRE_INIT(SystemExit)
2262 PRE_INIT(KeyboardInterrupt)
2263 PRE_INIT(ImportError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002264 PRE_INIT(OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002265 PRE_INIT(EOFError)
2266 PRE_INIT(RuntimeError)
2267 PRE_INIT(NotImplementedError)
2268 PRE_INIT(NameError)
2269 PRE_INIT(UnboundLocalError)
2270 PRE_INIT(AttributeError)
2271 PRE_INIT(SyntaxError)
2272 PRE_INIT(IndentationError)
2273 PRE_INIT(TabError)
2274 PRE_INIT(LookupError)
2275 PRE_INIT(IndexError)
2276 PRE_INIT(KeyError)
2277 PRE_INIT(ValueError)
2278 PRE_INIT(UnicodeError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002279 PRE_INIT(UnicodeEncodeError)
2280 PRE_INIT(UnicodeDecodeError)
2281 PRE_INIT(UnicodeTranslateError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002282 PRE_INIT(AssertionError)
2283 PRE_INIT(ArithmeticError)
2284 PRE_INIT(FloatingPointError)
2285 PRE_INIT(OverflowError)
2286 PRE_INIT(ZeroDivisionError)
2287 PRE_INIT(SystemError)
2288 PRE_INIT(ReferenceError)
Neal Norwitzfaa54a32007-08-19 04:23:20 +00002289 PRE_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002290 PRE_INIT(MemoryError)
Benjamin Peterson2b968d62008-07-05 23:38:30 +00002291 PRE_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002292 PRE_INIT(Warning)
2293 PRE_INIT(UserWarning)
2294 PRE_INIT(DeprecationWarning)
2295 PRE_INIT(PendingDeprecationWarning)
2296 PRE_INIT(SyntaxWarning)
2297 PRE_INIT(RuntimeWarning)
2298 PRE_INIT(FutureWarning)
2299 PRE_INIT(ImportWarning)
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002300 PRE_INIT(UnicodeWarning)
Guido van Rossum98297ee2007-11-06 21:34:58 +00002301 PRE_INIT(BytesWarning)
Georg Brandl08be72d2010-10-24 15:11:22 +00002302 PRE_INIT(ResourceWarning)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002303
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002304 /* OSError subclasses */
2305 PRE_INIT(ConnectionError);
2306
2307 PRE_INIT(BlockingIOError);
2308 PRE_INIT(BrokenPipeError);
2309 PRE_INIT(ChildProcessError);
2310 PRE_INIT(ConnectionAbortedError);
2311 PRE_INIT(ConnectionRefusedError);
2312 PRE_INIT(ConnectionResetError);
2313 PRE_INIT(FileExistsError);
2314 PRE_INIT(FileNotFoundError);
2315 PRE_INIT(IsADirectoryError);
2316 PRE_INIT(NotADirectoryError);
2317 PRE_INIT(InterruptedError);
2318 PRE_INIT(PermissionError);
2319 PRE_INIT(ProcessLookupError);
2320 PRE_INIT(TimeoutError);
2321
Georg Brandl1a3284e2007-12-02 09:40:06 +00002322 bltinmod = PyImport_ImportModule("builtins");
Thomas Wouters477c8d52006-05-27 19:21:47 +00002323 if (bltinmod == NULL)
2324 Py_FatalError("exceptions bootstrapping error.");
2325 bdict = PyModule_GetDict(bltinmod);
2326 if (bdict == NULL)
2327 Py_FatalError("exceptions bootstrapping error.");
2328
2329 POST_INIT(BaseException)
2330 POST_INIT(Exception)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002331 POST_INIT(TypeError)
2332 POST_INIT(StopIteration)
2333 POST_INIT(GeneratorExit)
2334 POST_INIT(SystemExit)
2335 POST_INIT(KeyboardInterrupt)
2336 POST_INIT(ImportError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002337 POST_INIT(OSError)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002338 INIT_ALIAS(EnvironmentError, OSError)
2339 INIT_ALIAS(IOError, OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002340#ifdef MS_WINDOWS
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002341 INIT_ALIAS(WindowsError, OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002342#endif
2343#ifdef __VMS
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002344 INIT_ALIAS(VMSError, OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002345#endif
2346 POST_INIT(EOFError)
2347 POST_INIT(RuntimeError)
2348 POST_INIT(NotImplementedError)
2349 POST_INIT(NameError)
2350 POST_INIT(UnboundLocalError)
2351 POST_INIT(AttributeError)
2352 POST_INIT(SyntaxError)
2353 POST_INIT(IndentationError)
2354 POST_INIT(TabError)
2355 POST_INIT(LookupError)
2356 POST_INIT(IndexError)
2357 POST_INIT(KeyError)
2358 POST_INIT(ValueError)
2359 POST_INIT(UnicodeError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002360 POST_INIT(UnicodeEncodeError)
2361 POST_INIT(UnicodeDecodeError)
2362 POST_INIT(UnicodeTranslateError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002363 POST_INIT(AssertionError)
2364 POST_INIT(ArithmeticError)
2365 POST_INIT(FloatingPointError)
2366 POST_INIT(OverflowError)
2367 POST_INIT(ZeroDivisionError)
2368 POST_INIT(SystemError)
2369 POST_INIT(ReferenceError)
Neal Norwitzfaa54a32007-08-19 04:23:20 +00002370 POST_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002371 POST_INIT(MemoryError)
Benjamin Peterson2b968d62008-07-05 23:38:30 +00002372 POST_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002373 POST_INIT(Warning)
2374 POST_INIT(UserWarning)
2375 POST_INIT(DeprecationWarning)
2376 POST_INIT(PendingDeprecationWarning)
2377 POST_INIT(SyntaxWarning)
2378 POST_INIT(RuntimeWarning)
2379 POST_INIT(FutureWarning)
2380 POST_INIT(ImportWarning)
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002381 POST_INIT(UnicodeWarning)
Guido van Rossum98297ee2007-11-06 21:34:58 +00002382 POST_INIT(BytesWarning)
Georg Brandl08be72d2010-10-24 15:11:22 +00002383 POST_INIT(ResourceWarning)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002384
Antoine Pitrouac456a12012-01-18 21:35:21 +01002385 if (!errnomap) {
2386 errnomap = PyDict_New();
2387 if (!errnomap)
2388 Py_FatalError("Cannot allocate map from errnos to OSError subclasses");
2389 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002390
2391 /* OSError subclasses */
2392 POST_INIT(ConnectionError);
2393
2394 POST_INIT(BlockingIOError);
2395 ADD_ERRNO(BlockingIOError, EAGAIN);
2396 ADD_ERRNO(BlockingIOError, EALREADY);
2397 ADD_ERRNO(BlockingIOError, EINPROGRESS);
2398 ADD_ERRNO(BlockingIOError, EWOULDBLOCK);
2399 POST_INIT(BrokenPipeError);
2400 ADD_ERRNO(BrokenPipeError, EPIPE);
2401 ADD_ERRNO(BrokenPipeError, ESHUTDOWN);
2402 POST_INIT(ChildProcessError);
2403 ADD_ERRNO(ChildProcessError, ECHILD);
2404 POST_INIT(ConnectionAbortedError);
2405 ADD_ERRNO(ConnectionAbortedError, ECONNABORTED);
2406 POST_INIT(ConnectionRefusedError);
2407 ADD_ERRNO(ConnectionRefusedError, ECONNREFUSED);
2408 POST_INIT(ConnectionResetError);
2409 ADD_ERRNO(ConnectionResetError, ECONNRESET);
2410 POST_INIT(FileExistsError);
2411 ADD_ERRNO(FileExistsError, EEXIST);
2412 POST_INIT(FileNotFoundError);
2413 ADD_ERRNO(FileNotFoundError, ENOENT);
2414 POST_INIT(IsADirectoryError);
2415 ADD_ERRNO(IsADirectoryError, EISDIR);
2416 POST_INIT(NotADirectoryError);
2417 ADD_ERRNO(NotADirectoryError, ENOTDIR);
2418 POST_INIT(InterruptedError);
2419 ADD_ERRNO(InterruptedError, EINTR);
2420 POST_INIT(PermissionError);
2421 ADD_ERRNO(PermissionError, EACCES);
2422 ADD_ERRNO(PermissionError, EPERM);
2423 POST_INIT(ProcessLookupError);
2424 ADD_ERRNO(ProcessLookupError, ESRCH);
2425 POST_INIT(TimeoutError);
2426 ADD_ERRNO(TimeoutError, ETIMEDOUT);
2427
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002428 preallocate_memerrors();
Thomas Wouters477c8d52006-05-27 19:21:47 +00002429
Antoine Pitrou1c7ade52012-01-18 16:13:31 +01002430 if (!PyExc_RecursionErrorInst) {
2431 PyExc_RecursionErrorInst = BaseException_new(&_PyExc_RuntimeError, NULL, NULL);
2432 if (!PyExc_RecursionErrorInst)
2433 Py_FatalError("Cannot pre-allocate RuntimeError instance for "
2434 "recursion errors");
2435 else {
2436 PyBaseExceptionObject *err_inst =
2437 (PyBaseExceptionObject *)PyExc_RecursionErrorInst;
2438 PyObject *args_tuple;
2439 PyObject *exc_message;
2440 exc_message = PyUnicode_FromString("maximum recursion depth exceeded");
2441 if (!exc_message)
2442 Py_FatalError("cannot allocate argument for RuntimeError "
2443 "pre-allocation");
2444 args_tuple = PyTuple_Pack(1, exc_message);
2445 if (!args_tuple)
2446 Py_FatalError("cannot allocate tuple for RuntimeError "
2447 "pre-allocation");
2448 Py_DECREF(exc_message);
2449 if (BaseException_init(err_inst, args_tuple, NULL))
2450 Py_FatalError("init of pre-allocated RuntimeError failed");
2451 Py_DECREF(args_tuple);
2452 }
Thomas Wouters89d996e2007-09-08 17:39:28 +00002453 }
Benjamin Petersonefe7c9d2012-02-10 08:46:54 -05002454 Py_DECREF(bltinmod);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002455}
2456
2457void
2458_PyExc_Fini(void)
2459{
Benjamin Peterson78565b22009-06-28 19:19:51 +00002460 Py_CLEAR(PyExc_RecursionErrorInst);
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002461 free_preallocated_memerrors();
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002462 Py_CLEAR(errnomap);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002463}