blob: e9522e86484805a702a4f2da4f2e4ee523a7ea15 [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 */
Georg Brandlab6f2f62009-03-31 04:16:10 +0000269 Py_RETURN_NONE;
270}
271
272static int
273BaseException_set_cause(PyObject *self, PyObject *arg) {
274 if (arg == NULL) {
275 PyErr_SetString(PyExc_TypeError, "__cause__ may not be deleted");
276 return -1;
277 } else if (arg == Py_None) {
278 arg = NULL;
279 } else if (!PyExceptionInstance_Check(arg)) {
280 PyErr_SetString(PyExc_TypeError, "exception cause must be None "
281 "or derive from BaseException");
282 return -1;
283 } else {
284 /* PyException_SetCause steals this reference */
285 Py_INCREF(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000286 }
Georg Brandlab6f2f62009-03-31 04:16:10 +0000287 PyException_SetCause(self, arg);
288 return 0;
289}
290
Guido van Rossum360e4b82007-05-14 22:51:27 +0000291
Thomas Wouters477c8d52006-05-27 19:21:47 +0000292static PyGetSetDef BaseException_getset[] = {
Benjamin Peterson23d7f122012-02-19 20:02:57 -0500293 {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict},
Thomas Wouters477c8d52006-05-27 19:21:47 +0000294 {"args", (getter)BaseException_get_args, (setter)BaseException_set_args},
Collin Winter828f04a2007-08-31 00:04:24 +0000295 {"__traceback__", (getter)BaseException_get_tb, (setter)BaseException_set_tb},
Georg Brandlab6f2f62009-03-31 04:16:10 +0000296 {"__context__", (getter)BaseException_get_context,
297 (setter)BaseException_set_context, PyDoc_STR("exception context")},
298 {"__cause__", (getter)BaseException_get_cause,
299 (setter)BaseException_set_cause, PyDoc_STR("exception cause")},
Thomas Wouters477c8d52006-05-27 19:21:47 +0000300 {NULL},
301};
302
303
Collin Winter828f04a2007-08-31 00:04:24 +0000304PyObject *
305PyException_GetTraceback(PyObject *self) {
306 PyBaseExceptionObject *base_self = (PyBaseExceptionObject *)self;
307 Py_XINCREF(base_self->traceback);
308 return base_self->traceback;
309}
310
311
312int
313PyException_SetTraceback(PyObject *self, PyObject *tb) {
314 return BaseException_set_tb((PyBaseExceptionObject *)self, tb);
315}
316
317PyObject *
318PyException_GetCause(PyObject *self) {
319 PyObject *cause = ((PyBaseExceptionObject *)self)->cause;
320 Py_XINCREF(cause);
321 return cause;
322}
323
324/* Steals a reference to cause */
325void
326PyException_SetCause(PyObject *self, PyObject *cause) {
327 PyObject *old_cause = ((PyBaseExceptionObject *)self)->cause;
328 ((PyBaseExceptionObject *)self)->cause = cause;
329 Py_XDECREF(old_cause);
330}
331
332PyObject *
333PyException_GetContext(PyObject *self) {
334 PyObject *context = ((PyBaseExceptionObject *)self)->context;
335 Py_XINCREF(context);
336 return context;
337}
338
339/* Steals a reference to context */
340void
341PyException_SetContext(PyObject *self, PyObject *context) {
342 PyObject *old_context = ((PyBaseExceptionObject *)self)->context;
343 ((PyBaseExceptionObject *)self)->context = context;
344 Py_XDECREF(old_context);
345}
346
347
Thomas Wouters477c8d52006-05-27 19:21:47 +0000348static PyTypeObject _PyExc_BaseException = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000349 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +0000350 "BaseException", /*tp_name*/
Thomas Wouters477c8d52006-05-27 19:21:47 +0000351 sizeof(PyBaseExceptionObject), /*tp_basicsize*/
352 0, /*tp_itemsize*/
353 (destructor)BaseException_dealloc, /*tp_dealloc*/
354 0, /*tp_print*/
355 0, /*tp_getattr*/
356 0, /*tp_setattr*/
Mark Dickinsone94c6792009-02-02 20:36:42 +0000357 0, /* tp_reserved; */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000358 (reprfunc)BaseException_repr, /*tp_repr*/
359 0, /*tp_as_number*/
Brett Cannonba7bf492007-02-27 00:15:55 +0000360 0, /*tp_as_sequence*/
Thomas Wouters477c8d52006-05-27 19:21:47 +0000361 0, /*tp_as_mapping*/
362 0, /*tp_hash */
363 0, /*tp_call*/
364 (reprfunc)BaseException_str, /*tp_str*/
365 PyObject_GenericGetAttr, /*tp_getattro*/
366 PyObject_GenericSetAttr, /*tp_setattro*/
367 0, /*tp_as_buffer*/
Thomas Wouters27d517b2007-02-25 20:39:11 +0000368 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC |
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000369 Py_TPFLAGS_BASE_EXC_SUBCLASS, /*tp_flags*/
Thomas Wouters477c8d52006-05-27 19:21:47 +0000370 PyDoc_STR("Common base class for all exceptions"), /* tp_doc */
371 (traverseproc)BaseException_traverse, /* tp_traverse */
372 (inquiry)BaseException_clear, /* tp_clear */
373 0, /* tp_richcompare */
374 0, /* tp_weaklistoffset */
375 0, /* tp_iter */
376 0, /* tp_iternext */
377 BaseException_methods, /* tp_methods */
Georg Brandlab6f2f62009-03-31 04:16:10 +0000378 0, /* tp_members */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000379 BaseException_getset, /* tp_getset */
380 0, /* tp_base */
381 0, /* tp_dict */
382 0, /* tp_descr_get */
383 0, /* tp_descr_set */
384 offsetof(PyBaseExceptionObject, dict), /* tp_dictoffset */
385 (initproc)BaseException_init, /* tp_init */
386 0, /* tp_alloc */
387 BaseException_new, /* tp_new */
388};
389/* the CPython API expects exceptions to be (PyObject *) - both a hold-over
390from the previous implmentation and also allowing Python objects to be used
391in the API */
392PyObject *PyExc_BaseException = (PyObject *)&_PyExc_BaseException;
393
394/* note these macros omit the last semicolon so the macro invocation may
395 * include it and not look strange.
396 */
397#define SimpleExtendsException(EXCBASE, EXCNAME, EXCDOC) \
398static PyTypeObject _PyExc_ ## EXCNAME = { \
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000399 PyVarObject_HEAD_INIT(NULL, 0) \
Neal Norwitz2633c692007-02-26 22:22:47 +0000400 # EXCNAME, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000401 sizeof(PyBaseExceptionObject), \
402 0, (destructor)BaseException_dealloc, 0, 0, 0, 0, 0, 0, 0, \
403 0, 0, 0, 0, 0, 0, 0, \
404 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
405 PyDoc_STR(EXCDOC), (traverseproc)BaseException_traverse, \
406 (inquiry)BaseException_clear, 0, 0, 0, 0, 0, 0, 0, &_ ## EXCBASE, \
407 0, 0, 0, offsetof(PyBaseExceptionObject, dict), \
408 (initproc)BaseException_init, 0, BaseException_new,\
409}; \
410PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
411
412#define MiddlingExtendsException(EXCBASE, EXCNAME, EXCSTORE, EXCDOC) \
413static PyTypeObject _PyExc_ ## EXCNAME = { \
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000414 PyVarObject_HEAD_INIT(NULL, 0) \
Neal Norwitz2633c692007-02-26 22:22:47 +0000415 # EXCNAME, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000416 sizeof(Py ## EXCSTORE ## Object), \
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000417 0, (destructor)EXCSTORE ## _dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000418 0, 0, 0, 0, 0, \
419 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000420 PyDoc_STR(EXCDOC), (traverseproc)EXCSTORE ## _traverse, \
421 (inquiry)EXCSTORE ## _clear, 0, 0, 0, 0, 0, 0, 0, &_ ## EXCBASE, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000422 0, 0, 0, offsetof(Py ## EXCSTORE ## Object, dict), \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200423 (initproc)EXCSTORE ## _init, 0, 0, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000424}; \
425PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
426
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200427#define ComplexExtendsException(EXCBASE, EXCNAME, EXCSTORE, EXCNEW, \
428 EXCMETHODS, EXCMEMBERS, EXCGETSET, \
429 EXCSTR, EXCDOC) \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000430static PyTypeObject _PyExc_ ## EXCNAME = { \
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000431 PyVarObject_HEAD_INIT(NULL, 0) \
Neal Norwitz2633c692007-02-26 22:22:47 +0000432 # EXCNAME, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000433 sizeof(Py ## EXCSTORE ## Object), 0, \
434 (destructor)EXCSTORE ## _dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
435 (reprfunc)EXCSTR, 0, 0, 0, \
436 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
437 PyDoc_STR(EXCDOC), (traverseproc)EXCSTORE ## _traverse, \
438 (inquiry)EXCSTORE ## _clear, 0, 0, 0, 0, EXCMETHODS, \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200439 EXCMEMBERS, EXCGETSET, &_ ## EXCBASE, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000440 0, 0, 0, offsetof(Py ## EXCSTORE ## Object, dict), \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200441 (initproc)EXCSTORE ## _init, 0, EXCNEW,\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000442}; \
443PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
444
445
446/*
447 * Exception extends BaseException
448 */
449SimpleExtendsException(PyExc_BaseException, Exception,
450 "Common base class for all non-exit exceptions.");
451
452
453/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000454 * TypeError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +0000455 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000456SimpleExtendsException(PyExc_Exception, TypeError,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000457 "Inappropriate argument type.");
458
459
460/*
461 * StopIteration extends Exception
462 */
Nick Coghlan1f7ce622012-01-13 21:43:40 +1000463
464static PyMemberDef StopIteration_members[] = {
465 {"value", T_OBJECT, offsetof(PyStopIterationObject, value), 0,
466 PyDoc_STR("generator return value")},
467 {NULL} /* Sentinel */
468};
469
470static int
471StopIteration_init(PyStopIterationObject *self, PyObject *args, PyObject *kwds)
472{
473 Py_ssize_t size = PyTuple_GET_SIZE(args);
474 PyObject *value;
475
476 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
477 return -1;
478 Py_CLEAR(self->value);
479 if (size > 0)
480 value = PyTuple_GET_ITEM(args, 0);
481 else
482 value = Py_None;
483 Py_INCREF(value);
484 self->value = value;
485 return 0;
486}
487
488static int
489StopIteration_clear(PyStopIterationObject *self)
490{
491 Py_CLEAR(self->value);
492 return BaseException_clear((PyBaseExceptionObject *)self);
493}
494
495static void
496StopIteration_dealloc(PyStopIterationObject *self)
497{
498 _PyObject_GC_UNTRACK(self);
499 StopIteration_clear(self);
500 Py_TYPE(self)->tp_free((PyObject *)self);
501}
502
503static int
504StopIteration_traverse(PyStopIterationObject *self, visitproc visit, void *arg)
505{
506 Py_VISIT(self->value);
507 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
508}
509
510PyObject *
511PyStopIteration_Create(PyObject *value)
512{
513 return PyObject_CallFunctionObjArgs(PyExc_StopIteration, value, NULL);
514}
515
516ComplexExtendsException(
517 PyExc_Exception, /* base */
518 StopIteration, /* name */
519 StopIteration, /* prefix for *_init, etc */
520 0, /* new */
521 0, /* methods */
522 StopIteration_members, /* members */
523 0, /* getset */
524 0, /* str */
525 "Signal the end from iterator.__next__()."
526);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000527
528
529/*
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000530 * GeneratorExit extends BaseException
Thomas Wouters477c8d52006-05-27 19:21:47 +0000531 */
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000532SimpleExtendsException(PyExc_BaseException, GeneratorExit,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000533 "Request that a generator exit.");
534
535
536/*
537 * SystemExit extends BaseException
538 */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000539
540static int
541SystemExit_init(PySystemExitObject *self, PyObject *args, PyObject *kwds)
542{
543 Py_ssize_t size = PyTuple_GET_SIZE(args);
544
545 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
546 return -1;
547
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000548 if (size == 0)
549 return 0;
550 Py_CLEAR(self->code);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000551 if (size == 1)
552 self->code = PyTuple_GET_ITEM(args, 0);
Victor Stinner92236e52011-05-26 14:25:54 +0200553 else /* size > 1 */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000554 self->code = args;
555 Py_INCREF(self->code);
556 return 0;
557}
558
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000559static int
Thomas Wouters477c8d52006-05-27 19:21:47 +0000560SystemExit_clear(PySystemExitObject *self)
561{
562 Py_CLEAR(self->code);
563 return BaseException_clear((PyBaseExceptionObject *)self);
564}
565
566static void
567SystemExit_dealloc(PySystemExitObject *self)
568{
Thomas Wouters89f507f2006-12-13 04:49:30 +0000569 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000570 SystemExit_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +0000571 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000572}
573
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000574static int
Thomas Wouters477c8d52006-05-27 19:21:47 +0000575SystemExit_traverse(PySystemExitObject *self, visitproc visit, void *arg)
576{
577 Py_VISIT(self->code);
578 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
579}
580
581static PyMemberDef SystemExit_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +0000582 {"code", T_OBJECT, offsetof(PySystemExitObject, code), 0,
583 PyDoc_STR("exception code")},
584 {NULL} /* Sentinel */
585};
586
587ComplexExtendsException(PyExc_BaseException, SystemExit, SystemExit,
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200588 0, 0, SystemExit_members, 0, 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000589 "Request to exit from the interpreter.");
590
591/*
592 * KeyboardInterrupt extends BaseException
593 */
594SimpleExtendsException(PyExc_BaseException, KeyboardInterrupt,
595 "Program interrupted by user.");
596
597
598/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000599 * ImportError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +0000600 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000601SimpleExtendsException(PyExc_Exception, ImportError,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000602 "Import can't find module, or can't find name in module.");
603
604
605/*
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200606 * OSError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +0000607 */
608
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200609#ifdef MS_WINDOWS
610#include "errmap.h"
611#endif
612
Thomas Wouters477c8d52006-05-27 19:21:47 +0000613/* Where a function has a single filename, such as open() or some
614 * of the os module functions, PyErr_SetFromErrnoWithFilename() is
615 * called, giving a third argument which is the filename. But, so
616 * that old code using in-place unpacking doesn't break, e.g.:
617 *
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200618 * except OSError, (errno, strerror):
Thomas Wouters477c8d52006-05-27 19:21:47 +0000619 *
620 * we hack args so that it only contains two items. This also
621 * means we need our own __str__() which prints out the filename
622 * when it was supplied.
623 */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200624
Antoine Pitroue0e27352011-12-15 14:31:28 +0100625/* This function doesn't cleanup on error, the caller should */
626static int
627oserror_parse_args(PyObject **p_args,
628 PyObject **myerrno, PyObject **strerror,
629 PyObject **filename
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200630#ifdef MS_WINDOWS
Antoine Pitroue0e27352011-12-15 14:31:28 +0100631 , PyObject **winerror
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200632#endif
Antoine Pitroue0e27352011-12-15 14:31:28 +0100633 )
634{
635 Py_ssize_t nargs;
636 PyObject *args = *p_args;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000637
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200638 nargs = PyTuple_GET_SIZE(args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000639
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200640#ifdef MS_WINDOWS
641 if (nargs >= 2 && nargs <= 4) {
642 if (!PyArg_UnpackTuple(args, "OSError", 2, 4,
Antoine Pitroue0e27352011-12-15 14:31:28 +0100643 myerrno, strerror, filename, winerror))
644 return -1;
645 if (*winerror && PyLong_Check(*winerror)) {
646 long errcode, winerrcode;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200647 PyObject *newargs;
648 Py_ssize_t i;
649
Antoine Pitroue0e27352011-12-15 14:31:28 +0100650 winerrcode = PyLong_AsLong(*winerror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200651 if (winerrcode == -1 && PyErr_Occurred())
Antoine Pitroue0e27352011-12-15 14:31:28 +0100652 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200653 /* Set errno to the corresponding POSIX errno (overriding
654 first argument). Windows Socket error codes (>= 10000)
655 have the same value as their POSIX counterparts.
656 */
657 if (winerrcode < 10000)
658 errcode = winerror_to_errno(winerrcode);
659 else
660 errcode = winerrcode;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100661 *myerrno = PyLong_FromLong(errcode);
662 if (!*myerrno)
663 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200664 newargs = PyTuple_New(nargs);
665 if (!newargs)
Antoine Pitroue0e27352011-12-15 14:31:28 +0100666 return -1;
667 PyTuple_SET_ITEM(newargs, 0, *myerrno);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200668 for (i = 1; i < nargs; i++) {
669 PyObject *val = PyTuple_GET_ITEM(args, i);
670 Py_INCREF(val);
671 PyTuple_SET_ITEM(newargs, i, val);
672 }
673 Py_DECREF(args);
Antoine Pitroue0e27352011-12-15 14:31:28 +0100674 args = *p_args = newargs;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200675 }
676 }
677#else
678 if (nargs >= 2 && nargs <= 3) {
679 if (!PyArg_UnpackTuple(args, "OSError", 2, 3,
Antoine Pitroue0e27352011-12-15 14:31:28 +0100680 myerrno, strerror, filename))
681 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200682 }
683#endif
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000684
Antoine Pitroue0e27352011-12-15 14:31:28 +0100685 return 0;
686}
Thomas Wouters477c8d52006-05-27 19:21:47 +0000687
Antoine Pitroue0e27352011-12-15 14:31:28 +0100688static int
689oserror_init(PyOSErrorObject *self, PyObject **p_args,
690 PyObject *myerrno, PyObject *strerror,
691 PyObject *filename
692#ifdef MS_WINDOWS
693 , PyObject *winerror
694#endif
695 )
696{
697 PyObject *args = *p_args;
698 Py_ssize_t nargs = PyTuple_GET_SIZE(args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000699
700 /* self->filename will remain Py_None otherwise */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200701 if (filename && filename != Py_None) {
Antoine Pitroue0e27352011-12-15 14:31:28 +0100702 if (Py_TYPE(self) == (PyTypeObject *) PyExc_BlockingIOError &&
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200703 PyNumber_Check(filename)) {
704 /* BlockingIOError's 3rd argument can be the number of
705 * characters written.
706 */
707 self->written = PyNumber_AsSsize_t(filename, PyExc_ValueError);
708 if (self->written == -1 && PyErr_Occurred())
Antoine Pitroue0e27352011-12-15 14:31:28 +0100709 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200710 }
711 else {
712 Py_INCREF(filename);
713 self->filename = filename;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000714
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200715 if (nargs >= 2 && nargs <= 3) {
716 /* filename is removed from the args tuple (for compatibility
717 purposes, see test_exceptions.py) */
Antoine Pitroue0e27352011-12-15 14:31:28 +0100718 PyObject *subslice = PyTuple_GetSlice(args, 0, 2);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200719 if (!subslice)
Antoine Pitroue0e27352011-12-15 14:31:28 +0100720 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000721
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200722 Py_DECREF(args); /* replacing args */
Antoine Pitroue0e27352011-12-15 14:31:28 +0100723 *p_args = args = subslice;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200724 }
725 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000726 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200727 Py_XINCREF(myerrno);
728 self->myerrno = myerrno;
729
730 Py_XINCREF(strerror);
731 self->strerror = strerror;
732
733#ifdef MS_WINDOWS
734 Py_XINCREF(winerror);
735 self->winerror = winerror;
736#endif
737
Antoine Pitroue0e27352011-12-15 14:31:28 +0100738 /* Steals the reference to args */
739 self->args = args;
740 args = NULL;
741
742 return 0;
743}
744
745static PyObject *
746OSError_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
747static int
748OSError_init(PyOSErrorObject *self, PyObject *args, PyObject *kwds);
749
750static int
751oserror_use_init(PyTypeObject *type)
752{
753 /* When __init__ is defined in a OSError subclass, we want any
754 extraneous argument to __new__ to be ignored. The only reasonable
755 solution, given __new__ takes a variable number of arguments,
756 is to defer arg parsing and initialization to __init__.
757
758 But when __new__ is overriden as well, it should call our __new__
759 with the right arguments.
760
761 (see http://bugs.python.org/issue12555#msg148829 )
762 */
763 if (type->tp_init != (initproc) OSError_init &&
764 type->tp_new == (newfunc) OSError_new) {
765 assert((PyObject *) type != PyExc_OSError);
766 return 1;
767 }
768 return 0;
769}
770
771static PyObject *
772OSError_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
773{
774 PyOSErrorObject *self = NULL;
775 PyObject *myerrno = NULL, *strerror = NULL, *filename = NULL;
776#ifdef MS_WINDOWS
777 PyObject *winerror = NULL;
778#endif
779
780 if (!oserror_use_init(type)) {
781 if (!_PyArg_NoKeywords(type->tp_name, kwds))
782 return NULL;
783
784 Py_INCREF(args);
785 if (oserror_parse_args(&args, &myerrno, &strerror, &filename
786#ifdef MS_WINDOWS
787 , &winerror
788#endif
789 ))
790 goto error;
791
792 if (myerrno && PyLong_Check(myerrno) &&
793 errnomap && (PyObject *) type == PyExc_OSError) {
794 PyObject *newtype;
795 newtype = PyDict_GetItem(errnomap, myerrno);
796 if (newtype) {
797 assert(PyType_Check(newtype));
798 type = (PyTypeObject *) newtype;
799 }
800 else if (PyErr_Occurred())
801 goto error;
802 }
803 }
804
805 self = (PyOSErrorObject *) type->tp_alloc(type, 0);
806 if (!self)
807 goto error;
808
809 self->dict = NULL;
810 self->traceback = self->cause = self->context = NULL;
811 self->written = -1;
812
813 if (!oserror_use_init(type)) {
814 if (oserror_init(self, &args, myerrno, strerror, filename
815#ifdef MS_WINDOWS
816 , winerror
817#endif
818 ))
819 goto error;
820 }
821
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200822 return (PyObject *) self;
823
824error:
825 Py_XDECREF(args);
826 Py_XDECREF(self);
827 return NULL;
828}
829
830static int
Antoine Pitroue0e27352011-12-15 14:31:28 +0100831OSError_init(PyOSErrorObject *self, PyObject *args, PyObject *kwds)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200832{
Antoine Pitroue0e27352011-12-15 14:31:28 +0100833 PyObject *myerrno = NULL, *strerror = NULL, *filename = NULL;
834#ifdef MS_WINDOWS
835 PyObject *winerror = NULL;
836#endif
837
838 if (!oserror_use_init(Py_TYPE(self)))
839 /* Everything already done in OSError_new */
840 return 0;
841
842 if (!_PyArg_NoKeywords(Py_TYPE(self)->tp_name, kwds))
843 return -1;
844
845 Py_INCREF(args);
846 if (oserror_parse_args(&args, &myerrno, &strerror, &filename
847#ifdef MS_WINDOWS
848 , &winerror
849#endif
850 ))
851 goto error;
852
853 if (oserror_init(self, &args, myerrno, strerror, filename
854#ifdef MS_WINDOWS
855 , winerror
856#endif
857 ))
858 goto error;
859
Thomas Wouters477c8d52006-05-27 19:21:47 +0000860 return 0;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100861
862error:
863 Py_XDECREF(args);
864 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000865}
866
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000867static int
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200868OSError_clear(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000869{
870 Py_CLEAR(self->myerrno);
871 Py_CLEAR(self->strerror);
872 Py_CLEAR(self->filename);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200873#ifdef MS_WINDOWS
874 Py_CLEAR(self->winerror);
875#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000876 return BaseException_clear((PyBaseExceptionObject *)self);
877}
878
879static void
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200880OSError_dealloc(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000881{
Thomas Wouters89f507f2006-12-13 04:49:30 +0000882 _PyObject_GC_UNTRACK(self);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200883 OSError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +0000884 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000885}
886
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000887static int
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200888OSError_traverse(PyOSErrorObject *self, visitproc visit,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000889 void *arg)
890{
891 Py_VISIT(self->myerrno);
892 Py_VISIT(self->strerror);
893 Py_VISIT(self->filename);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200894#ifdef MS_WINDOWS
895 Py_VISIT(self->winerror);
896#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000897 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
898}
899
900static PyObject *
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200901OSError_str(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000902{
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200903#ifdef MS_WINDOWS
904 /* If available, winerror has the priority over myerrno */
905 if (self->winerror && self->filename)
906 return PyUnicode_FromFormat("[Error %S] %S: %R",
907 self->winerror ? self->winerror: Py_None,
908 self->strerror ? self->strerror: Py_None,
909 self->filename);
910 if (self->winerror && self->strerror)
911 return PyUnicode_FromFormat("[Error %S] %S",
912 self->winerror ? self->winerror: Py_None,
913 self->strerror ? self->strerror: Py_None);
914#endif
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +0000915 if (self->filename)
916 return PyUnicode_FromFormat("[Errno %S] %S: %R",
917 self->myerrno ? self->myerrno: Py_None,
918 self->strerror ? self->strerror: Py_None,
919 self->filename);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200920 if (self->myerrno && self->strerror)
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +0000921 return PyUnicode_FromFormat("[Errno %S] %S",
922 self->myerrno ? self->myerrno: Py_None,
923 self->strerror ? self->strerror: Py_None);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200924 return BaseException_str((PyBaseExceptionObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000925}
926
Thomas Wouters477c8d52006-05-27 19:21:47 +0000927static PyObject *
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200928OSError_reduce(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000929{
930 PyObject *args = self->args;
931 PyObject *res = NULL, *tmp;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000932
Thomas Wouters477c8d52006-05-27 19:21:47 +0000933 /* self->args is only the first two real arguments if there was a
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200934 * file name given to OSError. */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000935 if (PyTuple_GET_SIZE(args) == 2 && self->filename) {
Thomas Wouters477c8d52006-05-27 19:21:47 +0000936 args = PyTuple_New(3);
Benjamin Peterson90b13582012-02-03 19:22:31 -0500937 if (!args)
938 return NULL;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000939
940 tmp = PyTuple_GET_ITEM(self->args, 0);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000941 Py_INCREF(tmp);
942 PyTuple_SET_ITEM(args, 0, tmp);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000943
944 tmp = PyTuple_GET_ITEM(self->args, 1);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000945 Py_INCREF(tmp);
946 PyTuple_SET_ITEM(args, 1, tmp);
947
948 Py_INCREF(self->filename);
949 PyTuple_SET_ITEM(args, 2, self->filename);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000950 } else
Thomas Wouters477c8d52006-05-27 19:21:47 +0000951 Py_INCREF(args);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000952
953 if (self->dict)
Christian Heimes90aa7642007-12-19 02:45:37 +0000954 res = PyTuple_Pack(3, Py_TYPE(self), args, self->dict);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000955 else
Christian Heimes90aa7642007-12-19 02:45:37 +0000956 res = PyTuple_Pack(2, Py_TYPE(self), args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000957 Py_DECREF(args);
958 return res;
959}
960
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200961static PyObject *
962OSError_written_get(PyOSErrorObject *self, void *context)
963{
964 if (self->written == -1) {
965 PyErr_SetString(PyExc_AttributeError, "characters_written");
966 return NULL;
967 }
968 return PyLong_FromSsize_t(self->written);
969}
Thomas Wouters477c8d52006-05-27 19:21:47 +0000970
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200971static int
972OSError_written_set(PyOSErrorObject *self, PyObject *arg, void *context)
973{
974 Py_ssize_t n;
975 n = PyNumber_AsSsize_t(arg, PyExc_ValueError);
976 if (n == -1 && PyErr_Occurred())
977 return -1;
978 self->written = n;
979 return 0;
980}
981
982static PyMemberDef OSError_members[] = {
983 {"errno", T_OBJECT, offsetof(PyOSErrorObject, myerrno), 0,
984 PyDoc_STR("POSIX exception code")},
985 {"strerror", T_OBJECT, offsetof(PyOSErrorObject, strerror), 0,
986 PyDoc_STR("exception strerror")},
987 {"filename", T_OBJECT, offsetof(PyOSErrorObject, filename), 0,
988 PyDoc_STR("exception filename")},
989#ifdef MS_WINDOWS
990 {"winerror", T_OBJECT, offsetof(PyOSErrorObject, winerror), 0,
991 PyDoc_STR("Win32 exception code")},
992#endif
993 {NULL} /* Sentinel */
994};
995
996static PyMethodDef OSError_methods[] = {
997 {"__reduce__", (PyCFunction)OSError_reduce, METH_NOARGS},
Thomas Wouters477c8d52006-05-27 19:21:47 +0000998 {NULL}
999};
1000
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001001static PyGetSetDef OSError_getset[] = {
1002 {"characters_written", (getter) OSError_written_get,
1003 (setter) OSError_written_set, NULL},
1004 {NULL}
1005};
1006
1007
1008ComplexExtendsException(PyExc_Exception, OSError,
1009 OSError, OSError_new,
1010 OSError_methods, OSError_members, OSError_getset,
1011 OSError_str,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001012 "Base class for I/O related errors.");
1013
1014
1015/*
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001016 * Various OSError subclasses
Thomas Wouters477c8d52006-05-27 19:21:47 +00001017 */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001018MiddlingExtendsException(PyExc_OSError, BlockingIOError, OSError,
1019 "I/O operation would block.");
1020MiddlingExtendsException(PyExc_OSError, ConnectionError, OSError,
1021 "Connection error.");
1022MiddlingExtendsException(PyExc_OSError, ChildProcessError, OSError,
1023 "Child process error.");
1024MiddlingExtendsException(PyExc_ConnectionError, BrokenPipeError, OSError,
1025 "Broken pipe.");
1026MiddlingExtendsException(PyExc_ConnectionError, ConnectionAbortedError, OSError,
1027 "Connection aborted.");
1028MiddlingExtendsException(PyExc_ConnectionError, ConnectionRefusedError, OSError,
1029 "Connection refused.");
1030MiddlingExtendsException(PyExc_ConnectionError, ConnectionResetError, OSError,
1031 "Connection reset.");
1032MiddlingExtendsException(PyExc_OSError, FileExistsError, OSError,
1033 "File already exists.");
1034MiddlingExtendsException(PyExc_OSError, FileNotFoundError, OSError,
1035 "File not found.");
1036MiddlingExtendsException(PyExc_OSError, IsADirectoryError, OSError,
1037 "Operation doesn't work on directories.");
1038MiddlingExtendsException(PyExc_OSError, NotADirectoryError, OSError,
1039 "Operation only works on directories.");
1040MiddlingExtendsException(PyExc_OSError, InterruptedError, OSError,
1041 "Interrupted by signal.");
1042MiddlingExtendsException(PyExc_OSError, PermissionError, OSError,
1043 "Not enough permissions.");
1044MiddlingExtendsException(PyExc_OSError, ProcessLookupError, OSError,
1045 "Process not found.");
1046MiddlingExtendsException(PyExc_OSError, TimeoutError, OSError,
1047 "Timeout expired.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001048
1049/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001050 * EOFError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001051 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001052SimpleExtendsException(PyExc_Exception, EOFError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001053 "Read beyond end of file.");
1054
1055
1056/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001057 * RuntimeError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001058 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001059SimpleExtendsException(PyExc_Exception, RuntimeError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001060 "Unspecified run-time error.");
1061
1062
1063/*
1064 * NotImplementedError extends RuntimeError
1065 */
1066SimpleExtendsException(PyExc_RuntimeError, NotImplementedError,
1067 "Method or function hasn't been implemented yet.");
1068
1069/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001070 * NameError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001071 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001072SimpleExtendsException(PyExc_Exception, NameError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001073 "Name not found globally.");
1074
1075/*
1076 * UnboundLocalError extends NameError
1077 */
1078SimpleExtendsException(PyExc_NameError, UnboundLocalError,
1079 "Local name referenced but not bound to a value.");
1080
1081/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001082 * AttributeError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001083 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001084SimpleExtendsException(PyExc_Exception, AttributeError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001085 "Attribute not found.");
1086
1087
1088/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001089 * SyntaxError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001090 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001091
1092static int
1093SyntaxError_init(PySyntaxErrorObject *self, PyObject *args, PyObject *kwds)
1094{
1095 PyObject *info = NULL;
1096 Py_ssize_t lenargs = PyTuple_GET_SIZE(args);
1097
1098 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1099 return -1;
1100
1101 if (lenargs >= 1) {
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001102 Py_CLEAR(self->msg);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001103 self->msg = PyTuple_GET_ITEM(args, 0);
1104 Py_INCREF(self->msg);
1105 }
1106 if (lenargs == 2) {
1107 info = PyTuple_GET_ITEM(args, 1);
1108 info = PySequence_Tuple(info);
Benjamin Peterson90b13582012-02-03 19:22:31 -05001109 if (!info)
1110 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001111
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001112 if (PyTuple_GET_SIZE(info) != 4) {
1113 /* not a very good error message, but it's what Python 2.4 gives */
1114 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
1115 Py_DECREF(info);
1116 return -1;
1117 }
1118
1119 Py_CLEAR(self->filename);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001120 self->filename = PyTuple_GET_ITEM(info, 0);
1121 Py_INCREF(self->filename);
1122
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001123 Py_CLEAR(self->lineno);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001124 self->lineno = PyTuple_GET_ITEM(info, 1);
1125 Py_INCREF(self->lineno);
1126
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001127 Py_CLEAR(self->offset);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001128 self->offset = PyTuple_GET_ITEM(info, 2);
1129 Py_INCREF(self->offset);
1130
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001131 Py_CLEAR(self->text);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001132 self->text = PyTuple_GET_ITEM(info, 3);
1133 Py_INCREF(self->text);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001134
1135 Py_DECREF(info);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001136 }
1137 return 0;
1138}
1139
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001140static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001141SyntaxError_clear(PySyntaxErrorObject *self)
1142{
1143 Py_CLEAR(self->msg);
1144 Py_CLEAR(self->filename);
1145 Py_CLEAR(self->lineno);
1146 Py_CLEAR(self->offset);
1147 Py_CLEAR(self->text);
1148 Py_CLEAR(self->print_file_and_line);
1149 return BaseException_clear((PyBaseExceptionObject *)self);
1150}
1151
1152static void
1153SyntaxError_dealloc(PySyntaxErrorObject *self)
1154{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001155 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001156 SyntaxError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +00001157 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001158}
1159
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001160static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001161SyntaxError_traverse(PySyntaxErrorObject *self, visitproc visit, void *arg)
1162{
1163 Py_VISIT(self->msg);
1164 Py_VISIT(self->filename);
1165 Py_VISIT(self->lineno);
1166 Py_VISIT(self->offset);
1167 Py_VISIT(self->text);
1168 Py_VISIT(self->print_file_and_line);
1169 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1170}
1171
1172/* This is called "my_basename" instead of just "basename" to avoid name
1173 conflicts with glibc; basename is already prototyped if _GNU_SOURCE is
1174 defined, and Python does define that. */
Victor Stinner6237daf2010-04-28 17:26:19 +00001175static PyObject*
1176my_basename(PyObject *name)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001177{
Victor Stinner6237daf2010-04-28 17:26:19 +00001178 Py_ssize_t i, size, offset;
Victor Stinner31392e72011-10-05 20:14:23 +02001179 int kind;
1180 void *data;
1181
1182 if (PyUnicode_READY(name))
1183 return NULL;
1184 kind = PyUnicode_KIND(name);
1185 data = PyUnicode_DATA(name);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001186 size = PyUnicode_GET_LENGTH(name);
Victor Stinner6237daf2010-04-28 17:26:19 +00001187 offset = 0;
1188 for(i=0; i < size; i++) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001189 if (PyUnicode_READ(kind, data, i) == SEP)
Victor Stinner6237daf2010-04-28 17:26:19 +00001190 offset = i + 1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001191 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001192 if (offset != 0)
1193 return PyUnicode_Substring(name, offset, size);
1194 else {
Victor Stinner6237daf2010-04-28 17:26:19 +00001195 Py_INCREF(name);
1196 return name;
1197 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001198}
1199
1200
1201static PyObject *
1202SyntaxError_str(PySyntaxErrorObject *self)
1203{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001204 int have_lineno = 0;
Victor Stinner6237daf2010-04-28 17:26:19 +00001205 PyObject *filename;
1206 PyObject *result;
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001207 /* Below, we always ignore overflow errors, just printing -1.
1208 Still, we cannot allow an OverflowError to be raised, so
1209 we need to call PyLong_AsLongAndOverflow. */
1210 int overflow;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001211
1212 /* XXX -- do all the additional formatting with filename and
1213 lineno here */
1214
Neal Norwitzed2b7392007-08-26 04:51:10 +00001215 if (self->filename && PyUnicode_Check(self->filename)) {
Victor Stinner6237daf2010-04-28 17:26:19 +00001216 filename = my_basename(self->filename);
1217 if (filename == NULL)
1218 return NULL;
1219 } else {
1220 filename = NULL;
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001221 }
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001222 have_lineno = (self->lineno != NULL) && PyLong_CheckExact(self->lineno);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001223
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001224 if (!filename && !have_lineno)
Thomas Heller519a0422007-11-15 20:48:54 +00001225 return PyObject_Str(self->msg ? self->msg : Py_None);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001226
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001227 if (filename && have_lineno)
Victor Stinner6237daf2010-04-28 17:26:19 +00001228 result = PyUnicode_FromFormat("%S (%U, line %ld)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001229 self->msg ? self->msg : Py_None,
Victor Stinner6237daf2010-04-28 17:26:19 +00001230 filename,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001231 PyLong_AsLongAndOverflow(self->lineno, &overflow));
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001232 else if (filename)
Victor Stinner6237daf2010-04-28 17:26:19 +00001233 result = PyUnicode_FromFormat("%S (%U)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001234 self->msg ? self->msg : Py_None,
Victor Stinner6237daf2010-04-28 17:26:19 +00001235 filename);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001236 else /* only have_lineno */
Victor Stinner6237daf2010-04-28 17:26:19 +00001237 result = PyUnicode_FromFormat("%S (line %ld)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001238 self->msg ? self->msg : Py_None,
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001239 PyLong_AsLongAndOverflow(self->lineno, &overflow));
Victor Stinner6237daf2010-04-28 17:26:19 +00001240 Py_XDECREF(filename);
1241 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001242}
1243
1244static PyMemberDef SyntaxError_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +00001245 {"msg", T_OBJECT, offsetof(PySyntaxErrorObject, msg), 0,
1246 PyDoc_STR("exception msg")},
1247 {"filename", T_OBJECT, offsetof(PySyntaxErrorObject, filename), 0,
1248 PyDoc_STR("exception filename")},
1249 {"lineno", T_OBJECT, offsetof(PySyntaxErrorObject, lineno), 0,
1250 PyDoc_STR("exception lineno")},
1251 {"offset", T_OBJECT, offsetof(PySyntaxErrorObject, offset), 0,
1252 PyDoc_STR("exception offset")},
1253 {"text", T_OBJECT, offsetof(PySyntaxErrorObject, text), 0,
1254 PyDoc_STR("exception text")},
1255 {"print_file_and_line", T_OBJECT,
1256 offsetof(PySyntaxErrorObject, print_file_and_line), 0,
1257 PyDoc_STR("exception print_file_and_line")},
1258 {NULL} /* Sentinel */
1259};
1260
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001261ComplexExtendsException(PyExc_Exception, SyntaxError, SyntaxError,
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001262 0, 0, SyntaxError_members, 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001263 SyntaxError_str, "Invalid syntax.");
1264
1265
1266/*
1267 * IndentationError extends SyntaxError
1268 */
1269MiddlingExtendsException(PyExc_SyntaxError, IndentationError, SyntaxError,
1270 "Improper indentation.");
1271
1272
1273/*
1274 * TabError extends IndentationError
1275 */
1276MiddlingExtendsException(PyExc_IndentationError, TabError, SyntaxError,
1277 "Improper mixture of spaces and tabs.");
1278
1279
1280/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001281 * LookupError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001282 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001283SimpleExtendsException(PyExc_Exception, LookupError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001284 "Base class for lookup errors.");
1285
1286
1287/*
1288 * IndexError extends LookupError
1289 */
1290SimpleExtendsException(PyExc_LookupError, IndexError,
1291 "Sequence index out of range.");
1292
1293
1294/*
1295 * KeyError extends LookupError
1296 */
1297static PyObject *
1298KeyError_str(PyBaseExceptionObject *self)
1299{
1300 /* If args is a tuple of exactly one item, apply repr to args[0].
1301 This is done so that e.g. the exception raised by {}[''] prints
1302 KeyError: ''
1303 rather than the confusing
1304 KeyError
1305 alone. The downside is that if KeyError is raised with an explanatory
1306 string, that string will be displayed in quotes. Too bad.
1307 If args is anything else, use the default BaseException__str__().
1308 */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001309 if (PyTuple_GET_SIZE(self->args) == 1) {
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001310 return PyObject_Repr(PyTuple_GET_ITEM(self->args, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001311 }
1312 return BaseException_str(self);
1313}
1314
1315ComplexExtendsException(PyExc_LookupError, KeyError, BaseException,
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001316 0, 0, 0, 0, KeyError_str, "Mapping key not found.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001317
1318
1319/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001320 * ValueError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001321 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001322SimpleExtendsException(PyExc_Exception, ValueError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001323 "Inappropriate argument value (of correct type).");
1324
1325/*
1326 * UnicodeError extends ValueError
1327 */
1328
1329SimpleExtendsException(PyExc_ValueError, UnicodeError,
1330 "Unicode related error.");
1331
Thomas Wouters477c8d52006-05-27 19:21:47 +00001332static PyObject *
Guido van Rossum98297ee2007-11-06 21:34:58 +00001333get_string(PyObject *attr, const char *name)
Walter Dörwald612344f2007-05-04 19:28:21 +00001334{
1335 if (!attr) {
1336 PyErr_Format(PyExc_TypeError, "%.200s attribute not set", name);
1337 return NULL;
1338 }
1339
Christian Heimes72b710a2008-05-26 13:28:38 +00001340 if (!PyBytes_Check(attr)) {
Walter Dörwald612344f2007-05-04 19:28:21 +00001341 PyErr_Format(PyExc_TypeError, "%.200s attribute must be bytes", name);
1342 return NULL;
1343 }
1344 Py_INCREF(attr);
1345 return attr;
1346}
1347
1348static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00001349get_unicode(PyObject *attr, const char *name)
1350{
1351 if (!attr) {
1352 PyErr_Format(PyExc_TypeError, "%.200s attribute not set", name);
1353 return NULL;
1354 }
1355
1356 if (!PyUnicode_Check(attr)) {
1357 PyErr_Format(PyExc_TypeError,
1358 "%.200s attribute must be unicode", name);
1359 return NULL;
1360 }
1361 Py_INCREF(attr);
1362 return attr;
1363}
1364
Walter Dörwaldd2034312007-05-18 16:29:38 +00001365static int
1366set_unicodefromstring(PyObject **attr, const char *value)
1367{
1368 PyObject *obj = PyUnicode_FromString(value);
1369 if (!obj)
1370 return -1;
1371 Py_CLEAR(*attr);
1372 *attr = obj;
1373 return 0;
1374}
1375
Thomas Wouters477c8d52006-05-27 19:21:47 +00001376PyObject *
1377PyUnicodeEncodeError_GetEncoding(PyObject *exc)
1378{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001379 return get_unicode(((PyUnicodeErrorObject *)exc)->encoding, "encoding");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001380}
1381
1382PyObject *
1383PyUnicodeDecodeError_GetEncoding(PyObject *exc)
1384{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001385 return get_unicode(((PyUnicodeErrorObject *)exc)->encoding, "encoding");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001386}
1387
1388PyObject *
1389PyUnicodeEncodeError_GetObject(PyObject *exc)
1390{
1391 return get_unicode(((PyUnicodeErrorObject *)exc)->object, "object");
1392}
1393
1394PyObject *
1395PyUnicodeDecodeError_GetObject(PyObject *exc)
1396{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001397 return get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001398}
1399
1400PyObject *
1401PyUnicodeTranslateError_GetObject(PyObject *exc)
1402{
1403 return get_unicode(((PyUnicodeErrorObject *)exc)->object, "object");
1404}
1405
1406int
1407PyUnicodeEncodeError_GetStart(PyObject *exc, Py_ssize_t *start)
1408{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001409 Py_ssize_t size;
1410 PyObject *obj = get_unicode(((PyUnicodeErrorObject *)exc)->object,
1411 "object");
1412 if (!obj)
1413 return -1;
1414 *start = ((PyUnicodeErrorObject *)exc)->start;
Victor Stinner9e30aa52011-11-21 02:49:52 +01001415 size = PyUnicode_GET_LENGTH(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001416 if (*start<0)
1417 *start = 0; /*XXX check for values <0*/
1418 if (*start>=size)
1419 *start = size-1;
1420 Py_DECREF(obj);
1421 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001422}
1423
1424
1425int
1426PyUnicodeDecodeError_GetStart(PyObject *exc, Py_ssize_t *start)
1427{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001428 Py_ssize_t size;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001429 PyObject *obj = get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001430 if (!obj)
1431 return -1;
Christian Heimes72b710a2008-05-26 13:28:38 +00001432 size = PyBytes_GET_SIZE(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001433 *start = ((PyUnicodeErrorObject *)exc)->start;
1434 if (*start<0)
1435 *start = 0;
1436 if (*start>=size)
1437 *start = size-1;
1438 Py_DECREF(obj);
1439 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001440}
1441
1442
1443int
1444PyUnicodeTranslateError_GetStart(PyObject *exc, Py_ssize_t *start)
1445{
1446 return PyUnicodeEncodeError_GetStart(exc, start);
1447}
1448
1449
1450int
1451PyUnicodeEncodeError_SetStart(PyObject *exc, Py_ssize_t start)
1452{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001453 ((PyUnicodeErrorObject *)exc)->start = start;
1454 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001455}
1456
1457
1458int
1459PyUnicodeDecodeError_SetStart(PyObject *exc, Py_ssize_t start)
1460{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001461 ((PyUnicodeErrorObject *)exc)->start = start;
1462 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001463}
1464
1465
1466int
1467PyUnicodeTranslateError_SetStart(PyObject *exc, Py_ssize_t start)
1468{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001469 ((PyUnicodeErrorObject *)exc)->start = start;
1470 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001471}
1472
1473
1474int
1475PyUnicodeEncodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
1476{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001477 Py_ssize_t size;
1478 PyObject *obj = get_unicode(((PyUnicodeErrorObject *)exc)->object,
1479 "object");
1480 if (!obj)
1481 return -1;
1482 *end = ((PyUnicodeErrorObject *)exc)->end;
Victor Stinner9e30aa52011-11-21 02:49:52 +01001483 size = PyUnicode_GET_LENGTH(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001484 if (*end<1)
1485 *end = 1;
1486 if (*end>size)
1487 *end = size;
1488 Py_DECREF(obj);
1489 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001490}
1491
1492
1493int
1494PyUnicodeDecodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
1495{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001496 Py_ssize_t size;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001497 PyObject *obj = get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001498 if (!obj)
1499 return -1;
Christian Heimes72b710a2008-05-26 13:28:38 +00001500 size = PyBytes_GET_SIZE(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001501 *end = ((PyUnicodeErrorObject *)exc)->end;
1502 if (*end<1)
1503 *end = 1;
1504 if (*end>size)
1505 *end = size;
1506 Py_DECREF(obj);
1507 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001508}
1509
1510
1511int
1512PyUnicodeTranslateError_GetEnd(PyObject *exc, Py_ssize_t *start)
1513{
1514 return PyUnicodeEncodeError_GetEnd(exc, start);
1515}
1516
1517
1518int
1519PyUnicodeEncodeError_SetEnd(PyObject *exc, Py_ssize_t end)
1520{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001521 ((PyUnicodeErrorObject *)exc)->end = end;
1522 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001523}
1524
1525
1526int
1527PyUnicodeDecodeError_SetEnd(PyObject *exc, Py_ssize_t end)
1528{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001529 ((PyUnicodeErrorObject *)exc)->end = end;
1530 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001531}
1532
1533
1534int
1535PyUnicodeTranslateError_SetEnd(PyObject *exc, Py_ssize_t end)
1536{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001537 ((PyUnicodeErrorObject *)exc)->end = end;
1538 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001539}
1540
1541PyObject *
1542PyUnicodeEncodeError_GetReason(PyObject *exc)
1543{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001544 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001545}
1546
1547
1548PyObject *
1549PyUnicodeDecodeError_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 *
1556PyUnicodeTranslateError_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
1562int
1563PyUnicodeEncodeError_SetReason(PyObject *exc, const char *reason)
1564{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001565 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1566 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001567}
1568
1569
1570int
1571PyUnicodeDecodeError_SetReason(PyObject *exc, const char *reason)
1572{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001573 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1574 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001575}
1576
1577
1578int
1579PyUnicodeTranslateError_SetReason(PyObject *exc, const char *reason)
1580{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001581 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1582 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001583}
1584
1585
Thomas Wouters477c8d52006-05-27 19:21:47 +00001586static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001587UnicodeError_clear(PyUnicodeErrorObject *self)
1588{
1589 Py_CLEAR(self->encoding);
1590 Py_CLEAR(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001591 Py_CLEAR(self->reason);
1592 return BaseException_clear((PyBaseExceptionObject *)self);
1593}
1594
1595static void
1596UnicodeError_dealloc(PyUnicodeErrorObject *self)
1597{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001598 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001599 UnicodeError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +00001600 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001601}
1602
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001603static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001604UnicodeError_traverse(PyUnicodeErrorObject *self, visitproc visit, void *arg)
1605{
1606 Py_VISIT(self->encoding);
1607 Py_VISIT(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001608 Py_VISIT(self->reason);
1609 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1610}
1611
1612static PyMemberDef UnicodeError_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +00001613 {"encoding", T_OBJECT, offsetof(PyUnicodeErrorObject, encoding), 0,
1614 PyDoc_STR("exception encoding")},
1615 {"object", T_OBJECT, offsetof(PyUnicodeErrorObject, object), 0,
1616 PyDoc_STR("exception object")},
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001617 {"start", T_PYSSIZET, offsetof(PyUnicodeErrorObject, start), 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001618 PyDoc_STR("exception start")},
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001619 {"end", T_PYSSIZET, offsetof(PyUnicodeErrorObject, end), 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001620 PyDoc_STR("exception end")},
1621 {"reason", T_OBJECT, offsetof(PyUnicodeErrorObject, reason), 0,
1622 PyDoc_STR("exception reason")},
1623 {NULL} /* Sentinel */
1624};
1625
1626
1627/*
1628 * UnicodeEncodeError extends UnicodeError
1629 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001630
1631static int
1632UnicodeEncodeError_init(PyObject *self, PyObject *args, PyObject *kwds)
1633{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001634 PyUnicodeErrorObject *err;
1635
Thomas Wouters477c8d52006-05-27 19:21:47 +00001636 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1637 return -1;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001638
1639 err = (PyUnicodeErrorObject *)self;
1640
1641 Py_CLEAR(err->encoding);
1642 Py_CLEAR(err->object);
1643 Py_CLEAR(err->reason);
1644
1645 if (!PyArg_ParseTuple(args, "O!O!nnO!",
1646 &PyUnicode_Type, &err->encoding,
1647 &PyUnicode_Type, &err->object,
1648 &err->start,
1649 &err->end,
1650 &PyUnicode_Type, &err->reason)) {
1651 err->encoding = err->object = err->reason = NULL;
1652 return -1;
1653 }
1654
Martin v. Löwisb09af032011-11-04 11:16:41 +01001655 if (PyUnicode_READY(err->object) < -1) {
1656 err->encoding = NULL;
1657 return -1;
1658 }
1659
Guido van Rossum98297ee2007-11-06 21:34:58 +00001660 Py_INCREF(err->encoding);
1661 Py_INCREF(err->object);
1662 Py_INCREF(err->reason);
1663
1664 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001665}
1666
1667static PyObject *
1668UnicodeEncodeError_str(PyObject *self)
1669{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001670 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00001671 PyObject *result = NULL;
1672 PyObject *reason_str = NULL;
1673 PyObject *encoding_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001674
Eric Smith0facd772010-02-24 15:42:29 +00001675 /* Get reason and encoding as strings, which they might not be if
1676 they've been modified after we were contructed. */
1677 reason_str = PyObject_Str(uself->reason);
1678 if (reason_str == NULL)
1679 goto done;
1680 encoding_str = PyObject_Str(uself->encoding);
1681 if (encoding_str == NULL)
1682 goto done;
1683
Victor Stinnerda1ddf32011-11-20 22:50:23 +01001684 if (uself->start < PyUnicode_GET_LENGTH(uself->object) && uself->end == uself->start+1) {
1685 Py_UCS4 badchar = PyUnicode_ReadChar(uself->object, uself->start);
Walter Dörwald787b03b2007-06-05 13:29:29 +00001686 const char *fmt;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001687 if (badchar <= 0xff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00001688 fmt = "'%U' codec can't encode character '\\x%02x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001689 else if (badchar <= 0xffff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00001690 fmt = "'%U' codec can't encode character '\\u%04x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001691 else
Walter Dörwald32a4c712007-06-20 09:25:34 +00001692 fmt = "'%U' codec can't encode character '\\U%08x' in position %zd: %U";
Eric Smith0facd772010-02-24 15:42:29 +00001693 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00001694 fmt,
Eric Smith0facd772010-02-24 15:42:29 +00001695 encoding_str,
Victor Stinnerda1ddf32011-11-20 22:50:23 +01001696 (int)badchar,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001697 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00001698 reason_str);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001699 }
Eric Smith0facd772010-02-24 15:42:29 +00001700 else {
1701 result = PyUnicode_FromFormat(
1702 "'%U' codec can't encode characters in position %zd-%zd: %U",
1703 encoding_str,
1704 uself->start,
1705 uself->end-1,
1706 reason_str);
1707 }
1708done:
1709 Py_XDECREF(reason_str);
1710 Py_XDECREF(encoding_str);
1711 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001712}
1713
1714static PyTypeObject _PyExc_UnicodeEncodeError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001715 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00001716 "UnicodeEncodeError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00001717 sizeof(PyUnicodeErrorObject), 0,
1718 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1719 (reprfunc)UnicodeEncodeError_str, 0, 0, 0,
1720 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001721 PyDoc_STR("Unicode encoding error."), (traverseproc)UnicodeError_traverse,
1722 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001723 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001724 (initproc)UnicodeEncodeError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001725};
1726PyObject *PyExc_UnicodeEncodeError = (PyObject *)&_PyExc_UnicodeEncodeError;
1727
1728PyObject *
1729PyUnicodeEncodeError_Create(
1730 const char *encoding, const Py_UNICODE *object, Py_ssize_t length,
1731 Py_ssize_t start, Py_ssize_t end, const char *reason)
1732{
Victor Stinner7eeb5b52010-06-07 19:57:46 +00001733 return PyObject_CallFunction(PyExc_UnicodeEncodeError, "su#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001734 encoding, object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001735}
1736
1737
1738/*
1739 * UnicodeDecodeError extends UnicodeError
1740 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001741
1742static int
1743UnicodeDecodeError_init(PyObject *self, PyObject *args, PyObject *kwds)
1744{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001745 PyUnicodeErrorObject *ude;
1746 const char *data;
1747 Py_ssize_t size;
1748
Thomas Wouters477c8d52006-05-27 19:21:47 +00001749 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1750 return -1;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001751
1752 ude = (PyUnicodeErrorObject *)self;
1753
1754 Py_CLEAR(ude->encoding);
1755 Py_CLEAR(ude->object);
1756 Py_CLEAR(ude->reason);
1757
1758 if (!PyArg_ParseTuple(args, "O!OnnO!",
1759 &PyUnicode_Type, &ude->encoding,
1760 &ude->object,
1761 &ude->start,
1762 &ude->end,
1763 &PyUnicode_Type, &ude->reason)) {
1764 ude->encoding = ude->object = ude->reason = NULL;
1765 return -1;
1766 }
1767
Christian Heimes72b710a2008-05-26 13:28:38 +00001768 if (!PyBytes_Check(ude->object)) {
Guido van Rossum98297ee2007-11-06 21:34:58 +00001769 if (PyObject_AsReadBuffer(ude->object, (const void **)&data, &size)) {
1770 ude->encoding = ude->object = ude->reason = NULL;
1771 return -1;
1772 }
Christian Heimes72b710a2008-05-26 13:28:38 +00001773 ude->object = PyBytes_FromStringAndSize(data, size);
Guido van Rossum98297ee2007-11-06 21:34:58 +00001774 }
1775 else {
1776 Py_INCREF(ude->object);
1777 }
1778
1779 Py_INCREF(ude->encoding);
1780 Py_INCREF(ude->reason);
1781
1782 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001783}
1784
1785static PyObject *
1786UnicodeDecodeError_str(PyObject *self)
1787{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001788 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00001789 PyObject *result = NULL;
1790 PyObject *reason_str = NULL;
1791 PyObject *encoding_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001792
Eric Smith0facd772010-02-24 15:42:29 +00001793 /* Get reason and encoding as strings, which they might not be if
1794 they've been modified after we were contructed. */
1795 reason_str = PyObject_Str(uself->reason);
1796 if (reason_str == NULL)
1797 goto done;
1798 encoding_str = PyObject_Str(uself->encoding);
1799 if (encoding_str == NULL)
1800 goto done;
1801
1802 if (uself->start < PyBytes_GET_SIZE(uself->object) && uself->end == uself->start+1) {
Christian Heimes72b710a2008-05-26 13:28:38 +00001803 int byte = (int)(PyBytes_AS_STRING(((PyUnicodeErrorObject *)self)->object)[uself->start]&0xff);
Eric Smith0facd772010-02-24 15:42:29 +00001804 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00001805 "'%U' codec can't decode byte 0x%02x in position %zd: %U",
Eric Smith0facd772010-02-24 15:42:29 +00001806 encoding_str,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001807 byte,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001808 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00001809 reason_str);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001810 }
Eric Smith0facd772010-02-24 15:42:29 +00001811 else {
1812 result = PyUnicode_FromFormat(
1813 "'%U' codec can't decode bytes in position %zd-%zd: %U",
1814 encoding_str,
1815 uself->start,
1816 uself->end-1,
1817 reason_str
1818 );
1819 }
1820done:
1821 Py_XDECREF(reason_str);
1822 Py_XDECREF(encoding_str);
1823 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001824}
1825
1826static PyTypeObject _PyExc_UnicodeDecodeError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001827 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00001828 "UnicodeDecodeError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00001829 sizeof(PyUnicodeErrorObject), 0,
1830 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1831 (reprfunc)UnicodeDecodeError_str, 0, 0, 0,
1832 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001833 PyDoc_STR("Unicode decoding error."), (traverseproc)UnicodeError_traverse,
1834 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001835 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001836 (initproc)UnicodeDecodeError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001837};
1838PyObject *PyExc_UnicodeDecodeError = (PyObject *)&_PyExc_UnicodeDecodeError;
1839
1840PyObject *
1841PyUnicodeDecodeError_Create(
1842 const char *encoding, const char *object, Py_ssize_t length,
1843 Py_ssize_t start, Py_ssize_t end, const char *reason)
1844{
Victor Stinner7eeb5b52010-06-07 19:57:46 +00001845 return PyObject_CallFunction(PyExc_UnicodeDecodeError, "sy#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001846 encoding, object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001847}
1848
1849
1850/*
1851 * UnicodeTranslateError extends UnicodeError
1852 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001853
1854static int
1855UnicodeTranslateError_init(PyUnicodeErrorObject *self, PyObject *args,
1856 PyObject *kwds)
1857{
1858 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1859 return -1;
1860
1861 Py_CLEAR(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001862 Py_CLEAR(self->reason);
1863
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001864 if (!PyArg_ParseTuple(args, "O!nnO!",
Thomas Wouters477c8d52006-05-27 19:21:47 +00001865 &PyUnicode_Type, &self->object,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001866 &self->start,
1867 &self->end,
Walter Dörwaldd2034312007-05-18 16:29:38 +00001868 &PyUnicode_Type, &self->reason)) {
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001869 self->object = self->reason = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001870 return -1;
1871 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001872
Thomas Wouters477c8d52006-05-27 19:21:47 +00001873 Py_INCREF(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001874 Py_INCREF(self->reason);
1875
1876 return 0;
1877}
1878
1879
1880static PyObject *
1881UnicodeTranslateError_str(PyObject *self)
1882{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001883 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00001884 PyObject *result = NULL;
1885 PyObject *reason_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001886
Eric Smith0facd772010-02-24 15:42:29 +00001887 /* Get reason as a string, which it might not be if it's been
1888 modified after we were contructed. */
1889 reason_str = PyObject_Str(uself->reason);
1890 if (reason_str == NULL)
1891 goto done;
1892
Victor Stinner53b33e72011-11-21 01:17:27 +01001893 if (uself->start < PyUnicode_GET_LENGTH(uself->object) && uself->end == uself->start+1) {
1894 Py_UCS4 badchar = PyUnicode_ReadChar(uself->object, uself->start);
Walter Dörwald787b03b2007-06-05 13:29:29 +00001895 const char *fmt;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001896 if (badchar <= 0xff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00001897 fmt = "can't translate character '\\x%02x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001898 else if (badchar <= 0xffff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00001899 fmt = "can't translate character '\\u%04x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001900 else
Walter Dörwald32a4c712007-06-20 09:25:34 +00001901 fmt = "can't translate character '\\U%08x' in position %zd: %U";
Benjamin Petersonc5f4e1e2010-02-25 01:22:28 +00001902 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00001903 fmt,
Victor Stinner53b33e72011-11-21 01:17:27 +01001904 (int)badchar,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001905 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00001906 reason_str
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001907 );
Eric Smith0facd772010-02-24 15:42:29 +00001908 } else {
1909 result = PyUnicode_FromFormat(
1910 "can't translate characters in position %zd-%zd: %U",
1911 uself->start,
1912 uself->end-1,
1913 reason_str
1914 );
Thomas Wouters477c8d52006-05-27 19:21:47 +00001915 }
Eric Smith0facd772010-02-24 15:42:29 +00001916done:
1917 Py_XDECREF(reason_str);
1918 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001919}
1920
1921static PyTypeObject _PyExc_UnicodeTranslateError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001922 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00001923 "UnicodeTranslateError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00001924 sizeof(PyUnicodeErrorObject), 0,
1925 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1926 (reprfunc)UnicodeTranslateError_str, 0, 0, 0,
1927 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters89f507f2006-12-13 04:49:30 +00001928 PyDoc_STR("Unicode translation error."), (traverseproc)UnicodeError_traverse,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001929 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
1930 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001931 (initproc)UnicodeTranslateError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001932};
1933PyObject *PyExc_UnicodeTranslateError = (PyObject *)&_PyExc_UnicodeTranslateError;
1934
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001935/* Deprecated. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001936PyObject *
1937PyUnicodeTranslateError_Create(
1938 const Py_UNICODE *object, Py_ssize_t length,
1939 Py_ssize_t start, Py_ssize_t end, const char *reason)
1940{
1941 return PyObject_CallFunction(PyExc_UnicodeTranslateError, "u#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001942 object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001943}
Thomas Wouters477c8d52006-05-27 19:21:47 +00001944
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001945PyObject *
1946_PyUnicodeTranslateError_Create(
1947 PyObject *object,
1948 Py_ssize_t start, Py_ssize_t end, const char *reason)
1949{
1950 return PyObject_CallFunction(PyExc_UnicodeTranslateError, "Ons",
1951 object, start, end, reason);
1952}
Thomas Wouters477c8d52006-05-27 19:21:47 +00001953
1954/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001955 * AssertionError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001956 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001957SimpleExtendsException(PyExc_Exception, AssertionError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001958 "Assertion failed.");
1959
1960
1961/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001962 * ArithmeticError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001963 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001964SimpleExtendsException(PyExc_Exception, ArithmeticError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001965 "Base class for arithmetic errors.");
1966
1967
1968/*
1969 * FloatingPointError extends ArithmeticError
1970 */
1971SimpleExtendsException(PyExc_ArithmeticError, FloatingPointError,
1972 "Floating point operation failed.");
1973
1974
1975/*
1976 * OverflowError extends ArithmeticError
1977 */
1978SimpleExtendsException(PyExc_ArithmeticError, OverflowError,
1979 "Result too large to be represented.");
1980
1981
1982/*
1983 * ZeroDivisionError extends ArithmeticError
1984 */
1985SimpleExtendsException(PyExc_ArithmeticError, ZeroDivisionError,
1986 "Second argument to a division or modulo operation was zero.");
1987
1988
1989/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001990 * SystemError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001991 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001992SimpleExtendsException(PyExc_Exception, SystemError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001993 "Internal error in the Python interpreter.\n"
1994 "\n"
1995 "Please report this to the Python maintainer, along with the traceback,\n"
1996 "the Python version, and the hardware/OS platform and version.");
1997
1998
1999/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002000 * ReferenceError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002001 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002002SimpleExtendsException(PyExc_Exception, ReferenceError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002003 "Weak ref proxy used after referent went away.");
2004
2005
2006/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002007 * MemoryError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002008 */
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002009
2010#define MEMERRORS_SAVE 16
2011static PyBaseExceptionObject *memerrors_freelist = NULL;
2012static int memerrors_numfree = 0;
2013
2014static PyObject *
2015MemoryError_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2016{
2017 PyBaseExceptionObject *self;
2018
2019 if (type != (PyTypeObject *) PyExc_MemoryError)
2020 return BaseException_new(type, args, kwds);
2021 if (memerrors_freelist == NULL)
2022 return BaseException_new(type, args, kwds);
2023 /* Fetch object from freelist and revive it */
2024 self = memerrors_freelist;
2025 self->args = PyTuple_New(0);
2026 /* This shouldn't happen since the empty tuple is persistent */
2027 if (self->args == NULL)
2028 return NULL;
2029 memerrors_freelist = (PyBaseExceptionObject *) self->dict;
2030 memerrors_numfree--;
2031 self->dict = NULL;
2032 _Py_NewReference((PyObject *)self);
2033 _PyObject_GC_TRACK(self);
2034 return (PyObject *)self;
2035}
2036
2037static void
2038MemoryError_dealloc(PyBaseExceptionObject *self)
2039{
2040 _PyObject_GC_UNTRACK(self);
2041 BaseException_clear(self);
2042 if (memerrors_numfree >= MEMERRORS_SAVE)
2043 Py_TYPE(self)->tp_free((PyObject *)self);
2044 else {
2045 self->dict = (PyObject *) memerrors_freelist;
2046 memerrors_freelist = self;
2047 memerrors_numfree++;
2048 }
2049}
2050
2051static void
2052preallocate_memerrors(void)
2053{
2054 /* We create enough MemoryErrors and then decref them, which will fill
2055 up the freelist. */
2056 int i;
2057 PyObject *errors[MEMERRORS_SAVE];
2058 for (i = 0; i < MEMERRORS_SAVE; i++) {
2059 errors[i] = MemoryError_new((PyTypeObject *) PyExc_MemoryError,
2060 NULL, NULL);
2061 if (!errors[i])
2062 Py_FatalError("Could not preallocate MemoryError object");
2063 }
2064 for (i = 0; i < MEMERRORS_SAVE; i++) {
2065 Py_DECREF(errors[i]);
2066 }
2067}
2068
2069static void
2070free_preallocated_memerrors(void)
2071{
2072 while (memerrors_freelist != NULL) {
2073 PyObject *self = (PyObject *) memerrors_freelist;
2074 memerrors_freelist = (PyBaseExceptionObject *) memerrors_freelist->dict;
2075 Py_TYPE(self)->tp_free((PyObject *)self);
2076 }
2077}
2078
2079
2080static PyTypeObject _PyExc_MemoryError = {
2081 PyVarObject_HEAD_INIT(NULL, 0)
2082 "MemoryError",
2083 sizeof(PyBaseExceptionObject),
2084 0, (destructor)MemoryError_dealloc, 0, 0, 0, 0, 0, 0, 0,
2085 0, 0, 0, 0, 0, 0, 0,
2086 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
2087 PyDoc_STR("Out of memory."), (traverseproc)BaseException_traverse,
2088 (inquiry)BaseException_clear, 0, 0, 0, 0, 0, 0, 0, &_PyExc_Exception,
2089 0, 0, 0, offsetof(PyBaseExceptionObject, dict),
2090 (initproc)BaseException_init, 0, MemoryError_new
2091};
2092PyObject *PyExc_MemoryError = (PyObject *) &_PyExc_MemoryError;
2093
Thomas Wouters477c8d52006-05-27 19:21:47 +00002094
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002095/*
2096 * BufferError extends Exception
2097 */
2098SimpleExtendsException(PyExc_Exception, BufferError, "Buffer error.");
2099
Thomas Wouters477c8d52006-05-27 19:21:47 +00002100
2101/* Warning category docstrings */
2102
2103/*
2104 * Warning extends Exception
2105 */
2106SimpleExtendsException(PyExc_Exception, Warning,
2107 "Base class for warning categories.");
2108
2109
2110/*
2111 * UserWarning extends Warning
2112 */
2113SimpleExtendsException(PyExc_Warning, UserWarning,
2114 "Base class for warnings generated by user code.");
2115
2116
2117/*
2118 * DeprecationWarning extends Warning
2119 */
2120SimpleExtendsException(PyExc_Warning, DeprecationWarning,
2121 "Base class for warnings about deprecated features.");
2122
2123
2124/*
2125 * PendingDeprecationWarning extends Warning
2126 */
2127SimpleExtendsException(PyExc_Warning, PendingDeprecationWarning,
2128 "Base class for warnings about features which will be deprecated\n"
2129 "in the future.");
2130
2131
2132/*
2133 * SyntaxWarning extends Warning
2134 */
2135SimpleExtendsException(PyExc_Warning, SyntaxWarning,
2136 "Base class for warnings about dubious syntax.");
2137
2138
2139/*
2140 * RuntimeWarning extends Warning
2141 */
2142SimpleExtendsException(PyExc_Warning, RuntimeWarning,
2143 "Base class for warnings about dubious runtime behavior.");
2144
2145
2146/*
2147 * FutureWarning extends Warning
2148 */
2149SimpleExtendsException(PyExc_Warning, FutureWarning,
2150 "Base class for warnings about constructs that will change semantically\n"
2151 "in the future.");
2152
2153
2154/*
2155 * ImportWarning extends Warning
2156 */
2157SimpleExtendsException(PyExc_Warning, ImportWarning,
2158 "Base class for warnings about probable mistakes in module imports");
2159
2160
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002161/*
2162 * UnicodeWarning extends Warning
2163 */
2164SimpleExtendsException(PyExc_Warning, UnicodeWarning,
2165 "Base class for warnings about Unicode related problems, mostly\n"
2166 "related to conversion problems.");
2167
Georg Brandl08be72d2010-10-24 15:11:22 +00002168
Guido van Rossum98297ee2007-11-06 21:34:58 +00002169/*
2170 * BytesWarning extends Warning
2171 */
2172SimpleExtendsException(PyExc_Warning, BytesWarning,
2173 "Base class for warnings about bytes and buffer related problems, mostly\n"
2174 "related to conversion from str or comparing to str.");
2175
2176
Georg Brandl08be72d2010-10-24 15:11:22 +00002177/*
2178 * ResourceWarning extends Warning
2179 */
2180SimpleExtendsException(PyExc_Warning, ResourceWarning,
2181 "Base class for warnings about resource usage.");
2182
2183
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002184
Thomas Wouters89d996e2007-09-08 17:39:28 +00002185/* Pre-computed RuntimeError instance for when recursion depth is reached.
2186 Meant to be used when normalizing the exception for exceeding the recursion
2187 depth will cause its own infinite recursion.
2188*/
2189PyObject *PyExc_RecursionErrorInst = NULL;
2190
Antoine Pitrou55f217f2012-01-18 21:23:13 +01002191#define PRE_INIT(TYPE) \
2192 if (!(_PyExc_ ## TYPE.tp_flags & Py_TPFLAGS_READY)) { \
2193 if (PyType_Ready(&_PyExc_ ## TYPE) < 0) \
2194 Py_FatalError("exceptions bootstrapping error."); \
2195 Py_INCREF(PyExc_ ## TYPE); \
2196 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002197
Antoine Pitrou55f217f2012-01-18 21:23:13 +01002198#define POST_INIT(TYPE) \
Thomas Wouters477c8d52006-05-27 19:21:47 +00002199 if (PyDict_SetItemString(bdict, # TYPE, PyExc_ ## TYPE)) \
2200 Py_FatalError("Module dictionary insertion problem.");
2201
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002202#define INIT_ALIAS(NAME, TYPE) Py_INCREF(PyExc_ ## TYPE); \
Antoine Pitrou8b0a74e2012-01-18 21:29:05 +01002203 Py_XDECREF(PyExc_ ## NAME); \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002204 PyExc_ ## NAME = PyExc_ ## TYPE; \
2205 if (PyDict_SetItemString(bdict, # NAME, PyExc_ ## NAME)) \
2206 Py_FatalError("Module dictionary insertion problem.");
2207
2208#define ADD_ERRNO(TYPE, CODE) { \
2209 PyObject *_code = PyLong_FromLong(CODE); \
2210 assert(_PyObject_RealIsSubclass(PyExc_ ## TYPE, PyExc_OSError)); \
2211 if (!_code || PyDict_SetItem(errnomap, _code, PyExc_ ## TYPE)) \
2212 Py_FatalError("errmap insertion problem."); \
Antoine Pitrou8b0a74e2012-01-18 21:29:05 +01002213 Py_DECREF(_code); \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002214 }
2215
2216#ifdef MS_WINDOWS
2217#include <Winsock2.h>
2218#if defined(WSAEALREADY) && !defined(EALREADY)
2219#define EALREADY WSAEALREADY
2220#endif
2221#if defined(WSAECONNABORTED) && !defined(ECONNABORTED)
2222#define ECONNABORTED WSAECONNABORTED
2223#endif
2224#if defined(WSAECONNREFUSED) && !defined(ECONNREFUSED)
2225#define ECONNREFUSED WSAECONNREFUSED
2226#endif
2227#if defined(WSAECONNRESET) && !defined(ECONNRESET)
2228#define ECONNRESET WSAECONNRESET
2229#endif
2230#if defined(WSAEINPROGRESS) && !defined(EINPROGRESS)
2231#define EINPROGRESS WSAEINPROGRESS
2232#endif
2233#if defined(WSAESHUTDOWN) && !defined(ESHUTDOWN)
2234#define ESHUTDOWN WSAESHUTDOWN
2235#endif
2236#if defined(WSAETIMEDOUT) && !defined(ETIMEDOUT)
2237#define ETIMEDOUT WSAETIMEDOUT
2238#endif
2239#if defined(WSAEWOULDBLOCK) && !defined(EWOULDBLOCK)
2240#define EWOULDBLOCK WSAEWOULDBLOCK
2241#endif
2242#endif /* MS_WINDOWS */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002243
Martin v. Löwis1a214512008-06-11 05:26:20 +00002244void
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002245_PyExc_Init(void)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002246{
Neal Norwitz2633c692007-02-26 22:22:47 +00002247 PyObject *bltinmod, *bdict;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002248
2249 PRE_INIT(BaseException)
2250 PRE_INIT(Exception)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002251 PRE_INIT(TypeError)
2252 PRE_INIT(StopIteration)
2253 PRE_INIT(GeneratorExit)
2254 PRE_INIT(SystemExit)
2255 PRE_INIT(KeyboardInterrupt)
2256 PRE_INIT(ImportError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002257 PRE_INIT(OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002258 PRE_INIT(EOFError)
2259 PRE_INIT(RuntimeError)
2260 PRE_INIT(NotImplementedError)
2261 PRE_INIT(NameError)
2262 PRE_INIT(UnboundLocalError)
2263 PRE_INIT(AttributeError)
2264 PRE_INIT(SyntaxError)
2265 PRE_INIT(IndentationError)
2266 PRE_INIT(TabError)
2267 PRE_INIT(LookupError)
2268 PRE_INIT(IndexError)
2269 PRE_INIT(KeyError)
2270 PRE_INIT(ValueError)
2271 PRE_INIT(UnicodeError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002272 PRE_INIT(UnicodeEncodeError)
2273 PRE_INIT(UnicodeDecodeError)
2274 PRE_INIT(UnicodeTranslateError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002275 PRE_INIT(AssertionError)
2276 PRE_INIT(ArithmeticError)
2277 PRE_INIT(FloatingPointError)
2278 PRE_INIT(OverflowError)
2279 PRE_INIT(ZeroDivisionError)
2280 PRE_INIT(SystemError)
2281 PRE_INIT(ReferenceError)
Neal Norwitzfaa54a32007-08-19 04:23:20 +00002282 PRE_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002283 PRE_INIT(MemoryError)
Benjamin Peterson2b968d62008-07-05 23:38:30 +00002284 PRE_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002285 PRE_INIT(Warning)
2286 PRE_INIT(UserWarning)
2287 PRE_INIT(DeprecationWarning)
2288 PRE_INIT(PendingDeprecationWarning)
2289 PRE_INIT(SyntaxWarning)
2290 PRE_INIT(RuntimeWarning)
2291 PRE_INIT(FutureWarning)
2292 PRE_INIT(ImportWarning)
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002293 PRE_INIT(UnicodeWarning)
Guido van Rossum98297ee2007-11-06 21:34:58 +00002294 PRE_INIT(BytesWarning)
Georg Brandl08be72d2010-10-24 15:11:22 +00002295 PRE_INIT(ResourceWarning)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002296
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002297 /* OSError subclasses */
2298 PRE_INIT(ConnectionError);
2299
2300 PRE_INIT(BlockingIOError);
2301 PRE_INIT(BrokenPipeError);
2302 PRE_INIT(ChildProcessError);
2303 PRE_INIT(ConnectionAbortedError);
2304 PRE_INIT(ConnectionRefusedError);
2305 PRE_INIT(ConnectionResetError);
2306 PRE_INIT(FileExistsError);
2307 PRE_INIT(FileNotFoundError);
2308 PRE_INIT(IsADirectoryError);
2309 PRE_INIT(NotADirectoryError);
2310 PRE_INIT(InterruptedError);
2311 PRE_INIT(PermissionError);
2312 PRE_INIT(ProcessLookupError);
2313 PRE_INIT(TimeoutError);
2314
Georg Brandl1a3284e2007-12-02 09:40:06 +00002315 bltinmod = PyImport_ImportModule("builtins");
Thomas Wouters477c8d52006-05-27 19:21:47 +00002316 if (bltinmod == NULL)
2317 Py_FatalError("exceptions bootstrapping error.");
2318 bdict = PyModule_GetDict(bltinmod);
2319 if (bdict == NULL)
2320 Py_FatalError("exceptions bootstrapping error.");
2321
2322 POST_INIT(BaseException)
2323 POST_INIT(Exception)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002324 POST_INIT(TypeError)
2325 POST_INIT(StopIteration)
2326 POST_INIT(GeneratorExit)
2327 POST_INIT(SystemExit)
2328 POST_INIT(KeyboardInterrupt)
2329 POST_INIT(ImportError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002330 POST_INIT(OSError)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002331 INIT_ALIAS(EnvironmentError, OSError)
2332 INIT_ALIAS(IOError, OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002333#ifdef MS_WINDOWS
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002334 INIT_ALIAS(WindowsError, OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002335#endif
2336#ifdef __VMS
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002337 INIT_ALIAS(VMSError, OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002338#endif
2339 POST_INIT(EOFError)
2340 POST_INIT(RuntimeError)
2341 POST_INIT(NotImplementedError)
2342 POST_INIT(NameError)
2343 POST_INIT(UnboundLocalError)
2344 POST_INIT(AttributeError)
2345 POST_INIT(SyntaxError)
2346 POST_INIT(IndentationError)
2347 POST_INIT(TabError)
2348 POST_INIT(LookupError)
2349 POST_INIT(IndexError)
2350 POST_INIT(KeyError)
2351 POST_INIT(ValueError)
2352 POST_INIT(UnicodeError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002353 POST_INIT(UnicodeEncodeError)
2354 POST_INIT(UnicodeDecodeError)
2355 POST_INIT(UnicodeTranslateError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002356 POST_INIT(AssertionError)
2357 POST_INIT(ArithmeticError)
2358 POST_INIT(FloatingPointError)
2359 POST_INIT(OverflowError)
2360 POST_INIT(ZeroDivisionError)
2361 POST_INIT(SystemError)
2362 POST_INIT(ReferenceError)
Neal Norwitzfaa54a32007-08-19 04:23:20 +00002363 POST_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002364 POST_INIT(MemoryError)
Benjamin Peterson2b968d62008-07-05 23:38:30 +00002365 POST_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002366 POST_INIT(Warning)
2367 POST_INIT(UserWarning)
2368 POST_INIT(DeprecationWarning)
2369 POST_INIT(PendingDeprecationWarning)
2370 POST_INIT(SyntaxWarning)
2371 POST_INIT(RuntimeWarning)
2372 POST_INIT(FutureWarning)
2373 POST_INIT(ImportWarning)
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002374 POST_INIT(UnicodeWarning)
Guido van Rossum98297ee2007-11-06 21:34:58 +00002375 POST_INIT(BytesWarning)
Georg Brandl08be72d2010-10-24 15:11:22 +00002376 POST_INIT(ResourceWarning)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002377
Antoine Pitrouac456a12012-01-18 21:35:21 +01002378 if (!errnomap) {
2379 errnomap = PyDict_New();
2380 if (!errnomap)
2381 Py_FatalError("Cannot allocate map from errnos to OSError subclasses");
2382 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002383
2384 /* OSError subclasses */
2385 POST_INIT(ConnectionError);
2386
2387 POST_INIT(BlockingIOError);
2388 ADD_ERRNO(BlockingIOError, EAGAIN);
2389 ADD_ERRNO(BlockingIOError, EALREADY);
2390 ADD_ERRNO(BlockingIOError, EINPROGRESS);
2391 ADD_ERRNO(BlockingIOError, EWOULDBLOCK);
2392 POST_INIT(BrokenPipeError);
2393 ADD_ERRNO(BrokenPipeError, EPIPE);
2394 ADD_ERRNO(BrokenPipeError, ESHUTDOWN);
2395 POST_INIT(ChildProcessError);
2396 ADD_ERRNO(ChildProcessError, ECHILD);
2397 POST_INIT(ConnectionAbortedError);
2398 ADD_ERRNO(ConnectionAbortedError, ECONNABORTED);
2399 POST_INIT(ConnectionRefusedError);
2400 ADD_ERRNO(ConnectionRefusedError, ECONNREFUSED);
2401 POST_INIT(ConnectionResetError);
2402 ADD_ERRNO(ConnectionResetError, ECONNRESET);
2403 POST_INIT(FileExistsError);
2404 ADD_ERRNO(FileExistsError, EEXIST);
2405 POST_INIT(FileNotFoundError);
2406 ADD_ERRNO(FileNotFoundError, ENOENT);
2407 POST_INIT(IsADirectoryError);
2408 ADD_ERRNO(IsADirectoryError, EISDIR);
2409 POST_INIT(NotADirectoryError);
2410 ADD_ERRNO(NotADirectoryError, ENOTDIR);
2411 POST_INIT(InterruptedError);
2412 ADD_ERRNO(InterruptedError, EINTR);
2413 POST_INIT(PermissionError);
2414 ADD_ERRNO(PermissionError, EACCES);
2415 ADD_ERRNO(PermissionError, EPERM);
2416 POST_INIT(ProcessLookupError);
2417 ADD_ERRNO(ProcessLookupError, ESRCH);
2418 POST_INIT(TimeoutError);
2419 ADD_ERRNO(TimeoutError, ETIMEDOUT);
2420
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002421 preallocate_memerrors();
Thomas Wouters477c8d52006-05-27 19:21:47 +00002422
Antoine Pitrou1c7ade52012-01-18 16:13:31 +01002423 if (!PyExc_RecursionErrorInst) {
2424 PyExc_RecursionErrorInst = BaseException_new(&_PyExc_RuntimeError, NULL, NULL);
2425 if (!PyExc_RecursionErrorInst)
2426 Py_FatalError("Cannot pre-allocate RuntimeError instance for "
2427 "recursion errors");
2428 else {
2429 PyBaseExceptionObject *err_inst =
2430 (PyBaseExceptionObject *)PyExc_RecursionErrorInst;
2431 PyObject *args_tuple;
2432 PyObject *exc_message;
2433 exc_message = PyUnicode_FromString("maximum recursion depth exceeded");
2434 if (!exc_message)
2435 Py_FatalError("cannot allocate argument for RuntimeError "
2436 "pre-allocation");
2437 args_tuple = PyTuple_Pack(1, exc_message);
2438 if (!args_tuple)
2439 Py_FatalError("cannot allocate tuple for RuntimeError "
2440 "pre-allocation");
2441 Py_DECREF(exc_message);
2442 if (BaseException_init(err_inst, args_tuple, NULL))
2443 Py_FatalError("init of pre-allocated RuntimeError failed");
2444 Py_DECREF(args_tuple);
2445 }
Thomas Wouters89d996e2007-09-08 17:39:28 +00002446 }
Benjamin Petersonefe7c9d2012-02-10 08:46:54 -05002447 Py_DECREF(bltinmod);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002448}
2449
2450void
2451_PyExc_Fini(void)
2452{
Benjamin Peterson78565b22009-06-28 19:19:51 +00002453 Py_CLEAR(PyExc_RecursionErrorInst);
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002454 free_preallocated_memerrors();
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002455 Py_CLEAR(errnomap);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002456}