blob: e77052913a54907be1a932f9ee02ff0321334462 [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
180
Thomas Wouters477c8d52006-05-27 19:21:47 +0000181static PyObject *
182BaseException_get_dict(PyBaseExceptionObject *self)
183{
184 if (self->dict == NULL) {
185 self->dict = PyDict_New();
186 if (!self->dict)
187 return NULL;
188 }
189 Py_INCREF(self->dict);
190 return self->dict;
191}
192
193static int
194BaseException_set_dict(PyBaseExceptionObject *self, PyObject *val)
195{
196 if (val == NULL) {
197 PyErr_SetString(PyExc_TypeError, "__dict__ may not be deleted");
198 return -1;
199 }
200 if (!PyDict_Check(val)) {
201 PyErr_SetString(PyExc_TypeError, "__dict__ must be a dictionary");
202 return -1;
203 }
204 Py_CLEAR(self->dict);
205 Py_INCREF(val);
206 self->dict = val;
207 return 0;
208}
209
210static PyObject *
211BaseException_get_args(PyBaseExceptionObject *self)
212{
213 if (self->args == NULL) {
214 Py_INCREF(Py_None);
215 return Py_None;
216 }
217 Py_INCREF(self->args);
218 return self->args;
219}
220
221static int
222BaseException_set_args(PyBaseExceptionObject *self, PyObject *val)
223{
224 PyObject *seq;
225 if (val == NULL) {
226 PyErr_SetString(PyExc_TypeError, "args may not be deleted");
227 return -1;
228 }
229 seq = PySequence_Tuple(val);
Benjamin Peterson90b13582012-02-03 19:22:31 -0500230 if (!seq)
231 return -1;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000232 Py_CLEAR(self->args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000233 self->args = seq;
234 return 0;
235}
236
Collin Winter828f04a2007-08-31 00:04:24 +0000237static PyObject *
238BaseException_get_tb(PyBaseExceptionObject *self)
239{
240 if (self->traceback == NULL) {
241 Py_INCREF(Py_None);
242 return Py_None;
243 }
244 Py_INCREF(self->traceback);
245 return self->traceback;
246}
247
248static int
249BaseException_set_tb(PyBaseExceptionObject *self, PyObject *tb)
250{
251 if (tb == NULL) {
252 PyErr_SetString(PyExc_TypeError, "__traceback__ may not be deleted");
253 return -1;
254 }
255 else if (!(tb == Py_None || PyTraceBack_Check(tb))) {
256 PyErr_SetString(PyExc_TypeError,
257 "__traceback__ must be a traceback or None");
258 return -1;
259 }
260
261 Py_XINCREF(tb);
262 Py_XDECREF(self->traceback);
263 self->traceback = tb;
264 return 0;
265}
266
Georg Brandlab6f2f62009-03-31 04:16:10 +0000267static PyObject *
268BaseException_get_context(PyObject *self) {
269 PyObject *res = PyException_GetContext(self);
Benjamin Peterson90b13582012-02-03 19:22:31 -0500270 if (res)
271 return res; /* new reference already returned above */
Georg Brandlab6f2f62009-03-31 04:16:10 +0000272 Py_RETURN_NONE;
273}
274
275static int
276BaseException_set_context(PyObject *self, PyObject *arg) {
277 if (arg == NULL) {
278 PyErr_SetString(PyExc_TypeError, "__context__ may not be deleted");
279 return -1;
280 } else if (arg == Py_None) {
281 arg = NULL;
282 } else if (!PyExceptionInstance_Check(arg)) {
283 PyErr_SetString(PyExc_TypeError, "exception context must be None "
284 "or derive from BaseException");
285 return -1;
286 } else {
287 /* PyException_SetContext steals this reference */
288 Py_INCREF(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000289 }
Georg Brandlab6f2f62009-03-31 04:16:10 +0000290 PyException_SetContext(self, arg);
291 return 0;
292}
293
294static PyObject *
295BaseException_get_cause(PyObject *self) {
296 PyObject *res = PyException_GetCause(self);
Benjamin Peterson90b13582012-02-03 19:22:31 -0500297 if (res)
298 return res; /* new reference already returned above */
Georg Brandlab6f2f62009-03-31 04:16:10 +0000299 Py_RETURN_NONE;
300}
301
302static int
303BaseException_set_cause(PyObject *self, PyObject *arg) {
304 if (arg == NULL) {
305 PyErr_SetString(PyExc_TypeError, "__cause__ may not be deleted");
306 return -1;
307 } else if (arg == Py_None) {
308 arg = NULL;
309 } else if (!PyExceptionInstance_Check(arg)) {
310 PyErr_SetString(PyExc_TypeError, "exception cause must be None "
311 "or derive from BaseException");
312 return -1;
313 } else {
314 /* PyException_SetCause steals this reference */
315 Py_INCREF(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000316 }
Georg Brandlab6f2f62009-03-31 04:16:10 +0000317 PyException_SetCause(self, arg);
318 return 0;
319}
320
Guido van Rossum360e4b82007-05-14 22:51:27 +0000321
Thomas Wouters477c8d52006-05-27 19:21:47 +0000322static PyGetSetDef BaseException_getset[] = {
323 {"__dict__", (getter)BaseException_get_dict, (setter)BaseException_set_dict},
324 {"args", (getter)BaseException_get_args, (setter)BaseException_set_args},
Collin Winter828f04a2007-08-31 00:04:24 +0000325 {"__traceback__", (getter)BaseException_get_tb, (setter)BaseException_set_tb},
Georg Brandlab6f2f62009-03-31 04:16:10 +0000326 {"__context__", (getter)BaseException_get_context,
327 (setter)BaseException_set_context, PyDoc_STR("exception context")},
328 {"__cause__", (getter)BaseException_get_cause,
329 (setter)BaseException_set_cause, PyDoc_STR("exception cause")},
Thomas Wouters477c8d52006-05-27 19:21:47 +0000330 {NULL},
331};
332
333
Collin Winter828f04a2007-08-31 00:04:24 +0000334PyObject *
335PyException_GetTraceback(PyObject *self) {
336 PyBaseExceptionObject *base_self = (PyBaseExceptionObject *)self;
337 Py_XINCREF(base_self->traceback);
338 return base_self->traceback;
339}
340
341
342int
343PyException_SetTraceback(PyObject *self, PyObject *tb) {
344 return BaseException_set_tb((PyBaseExceptionObject *)self, tb);
345}
346
347PyObject *
348PyException_GetCause(PyObject *self) {
349 PyObject *cause = ((PyBaseExceptionObject *)self)->cause;
350 Py_XINCREF(cause);
351 return cause;
352}
353
354/* Steals a reference to cause */
355void
356PyException_SetCause(PyObject *self, PyObject *cause) {
357 PyObject *old_cause = ((PyBaseExceptionObject *)self)->cause;
358 ((PyBaseExceptionObject *)self)->cause = cause;
359 Py_XDECREF(old_cause);
360}
361
362PyObject *
363PyException_GetContext(PyObject *self) {
364 PyObject *context = ((PyBaseExceptionObject *)self)->context;
365 Py_XINCREF(context);
366 return context;
367}
368
369/* Steals a reference to context */
370void
371PyException_SetContext(PyObject *self, PyObject *context) {
372 PyObject *old_context = ((PyBaseExceptionObject *)self)->context;
373 ((PyBaseExceptionObject *)self)->context = context;
374 Py_XDECREF(old_context);
375}
376
377
Thomas Wouters477c8d52006-05-27 19:21:47 +0000378static PyTypeObject _PyExc_BaseException = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000379 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +0000380 "BaseException", /*tp_name*/
Thomas Wouters477c8d52006-05-27 19:21:47 +0000381 sizeof(PyBaseExceptionObject), /*tp_basicsize*/
382 0, /*tp_itemsize*/
383 (destructor)BaseException_dealloc, /*tp_dealloc*/
384 0, /*tp_print*/
385 0, /*tp_getattr*/
386 0, /*tp_setattr*/
Mark Dickinsone94c6792009-02-02 20:36:42 +0000387 0, /* tp_reserved; */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000388 (reprfunc)BaseException_repr, /*tp_repr*/
389 0, /*tp_as_number*/
Brett Cannonba7bf492007-02-27 00:15:55 +0000390 0, /*tp_as_sequence*/
Thomas Wouters477c8d52006-05-27 19:21:47 +0000391 0, /*tp_as_mapping*/
392 0, /*tp_hash */
393 0, /*tp_call*/
394 (reprfunc)BaseException_str, /*tp_str*/
395 PyObject_GenericGetAttr, /*tp_getattro*/
396 PyObject_GenericSetAttr, /*tp_setattro*/
397 0, /*tp_as_buffer*/
Thomas Wouters27d517b2007-02-25 20:39:11 +0000398 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC |
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000399 Py_TPFLAGS_BASE_EXC_SUBCLASS, /*tp_flags*/
Thomas Wouters477c8d52006-05-27 19:21:47 +0000400 PyDoc_STR("Common base class for all exceptions"), /* tp_doc */
401 (traverseproc)BaseException_traverse, /* tp_traverse */
402 (inquiry)BaseException_clear, /* tp_clear */
403 0, /* tp_richcompare */
404 0, /* tp_weaklistoffset */
405 0, /* tp_iter */
406 0, /* tp_iternext */
407 BaseException_methods, /* tp_methods */
Georg Brandlab6f2f62009-03-31 04:16:10 +0000408 0, /* tp_members */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000409 BaseException_getset, /* tp_getset */
410 0, /* tp_base */
411 0, /* tp_dict */
412 0, /* tp_descr_get */
413 0, /* tp_descr_set */
414 offsetof(PyBaseExceptionObject, dict), /* tp_dictoffset */
415 (initproc)BaseException_init, /* tp_init */
416 0, /* tp_alloc */
417 BaseException_new, /* tp_new */
418};
419/* the CPython API expects exceptions to be (PyObject *) - both a hold-over
420from the previous implmentation and also allowing Python objects to be used
421in the API */
422PyObject *PyExc_BaseException = (PyObject *)&_PyExc_BaseException;
423
424/* note these macros omit the last semicolon so the macro invocation may
425 * include it and not look strange.
426 */
427#define SimpleExtendsException(EXCBASE, EXCNAME, EXCDOC) \
428static PyTypeObject _PyExc_ ## EXCNAME = { \
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000429 PyVarObject_HEAD_INIT(NULL, 0) \
Neal Norwitz2633c692007-02-26 22:22:47 +0000430 # EXCNAME, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000431 sizeof(PyBaseExceptionObject), \
432 0, (destructor)BaseException_dealloc, 0, 0, 0, 0, 0, 0, 0, \
433 0, 0, 0, 0, 0, 0, 0, \
434 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
435 PyDoc_STR(EXCDOC), (traverseproc)BaseException_traverse, \
436 (inquiry)BaseException_clear, 0, 0, 0, 0, 0, 0, 0, &_ ## EXCBASE, \
437 0, 0, 0, offsetof(PyBaseExceptionObject, dict), \
438 (initproc)BaseException_init, 0, BaseException_new,\
439}; \
440PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
441
442#define MiddlingExtendsException(EXCBASE, EXCNAME, EXCSTORE, EXCDOC) \
443static PyTypeObject _PyExc_ ## EXCNAME = { \
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000444 PyVarObject_HEAD_INIT(NULL, 0) \
Neal Norwitz2633c692007-02-26 22:22:47 +0000445 # EXCNAME, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000446 sizeof(Py ## EXCSTORE ## Object), \
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000447 0, (destructor)EXCSTORE ## _dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000448 0, 0, 0, 0, 0, \
449 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000450 PyDoc_STR(EXCDOC), (traverseproc)EXCSTORE ## _traverse, \
451 (inquiry)EXCSTORE ## _clear, 0, 0, 0, 0, 0, 0, 0, &_ ## EXCBASE, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000452 0, 0, 0, offsetof(Py ## EXCSTORE ## Object, dict), \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200453 (initproc)EXCSTORE ## _init, 0, 0, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000454}; \
455PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
456
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200457#define ComplexExtendsException(EXCBASE, EXCNAME, EXCSTORE, EXCNEW, \
458 EXCMETHODS, EXCMEMBERS, EXCGETSET, \
459 EXCSTR, EXCDOC) \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000460static PyTypeObject _PyExc_ ## EXCNAME = { \
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000461 PyVarObject_HEAD_INIT(NULL, 0) \
Neal Norwitz2633c692007-02-26 22:22:47 +0000462 # EXCNAME, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000463 sizeof(Py ## EXCSTORE ## Object), 0, \
464 (destructor)EXCSTORE ## _dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
465 (reprfunc)EXCSTR, 0, 0, 0, \
466 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
467 PyDoc_STR(EXCDOC), (traverseproc)EXCSTORE ## _traverse, \
468 (inquiry)EXCSTORE ## _clear, 0, 0, 0, 0, EXCMETHODS, \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200469 EXCMEMBERS, EXCGETSET, &_ ## EXCBASE, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000470 0, 0, 0, offsetof(Py ## EXCSTORE ## Object, dict), \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200471 (initproc)EXCSTORE ## _init, 0, EXCNEW,\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000472}; \
473PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
474
475
476/*
477 * Exception extends BaseException
478 */
479SimpleExtendsException(PyExc_BaseException, Exception,
480 "Common base class for all non-exit exceptions.");
481
482
483/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000484 * TypeError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +0000485 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000486SimpleExtendsException(PyExc_Exception, TypeError,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000487 "Inappropriate argument type.");
488
489
490/*
491 * StopIteration extends Exception
492 */
Nick Coghlan1f7ce622012-01-13 21:43:40 +1000493
494static PyMemberDef StopIteration_members[] = {
495 {"value", T_OBJECT, offsetof(PyStopIterationObject, value), 0,
496 PyDoc_STR("generator return value")},
497 {NULL} /* Sentinel */
498};
499
500static int
501StopIteration_init(PyStopIterationObject *self, PyObject *args, PyObject *kwds)
502{
503 Py_ssize_t size = PyTuple_GET_SIZE(args);
504 PyObject *value;
505
506 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
507 return -1;
508 Py_CLEAR(self->value);
509 if (size > 0)
510 value = PyTuple_GET_ITEM(args, 0);
511 else
512 value = Py_None;
513 Py_INCREF(value);
514 self->value = value;
515 return 0;
516}
517
518static int
519StopIteration_clear(PyStopIterationObject *self)
520{
521 Py_CLEAR(self->value);
522 return BaseException_clear((PyBaseExceptionObject *)self);
523}
524
525static void
526StopIteration_dealloc(PyStopIterationObject *self)
527{
528 _PyObject_GC_UNTRACK(self);
529 StopIteration_clear(self);
530 Py_TYPE(self)->tp_free((PyObject *)self);
531}
532
533static int
534StopIteration_traverse(PyStopIterationObject *self, visitproc visit, void *arg)
535{
536 Py_VISIT(self->value);
537 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
538}
539
540PyObject *
541PyStopIteration_Create(PyObject *value)
542{
543 return PyObject_CallFunctionObjArgs(PyExc_StopIteration, value, NULL);
544}
545
546ComplexExtendsException(
547 PyExc_Exception, /* base */
548 StopIteration, /* name */
549 StopIteration, /* prefix for *_init, etc */
550 0, /* new */
551 0, /* methods */
552 StopIteration_members, /* members */
553 0, /* getset */
554 0, /* str */
555 "Signal the end from iterator.__next__()."
556);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000557
558
559/*
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000560 * GeneratorExit extends BaseException
Thomas Wouters477c8d52006-05-27 19:21:47 +0000561 */
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000562SimpleExtendsException(PyExc_BaseException, GeneratorExit,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000563 "Request that a generator exit.");
564
565
566/*
567 * SystemExit extends BaseException
568 */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000569
570static int
571SystemExit_init(PySystemExitObject *self, PyObject *args, PyObject *kwds)
572{
573 Py_ssize_t size = PyTuple_GET_SIZE(args);
574
575 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
576 return -1;
577
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000578 if (size == 0)
579 return 0;
580 Py_CLEAR(self->code);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000581 if (size == 1)
582 self->code = PyTuple_GET_ITEM(args, 0);
Victor Stinner92236e52011-05-26 14:25:54 +0200583 else /* size > 1 */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000584 self->code = args;
585 Py_INCREF(self->code);
586 return 0;
587}
588
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000589static int
Thomas Wouters477c8d52006-05-27 19:21:47 +0000590SystemExit_clear(PySystemExitObject *self)
591{
592 Py_CLEAR(self->code);
593 return BaseException_clear((PyBaseExceptionObject *)self);
594}
595
596static void
597SystemExit_dealloc(PySystemExitObject *self)
598{
Thomas Wouters89f507f2006-12-13 04:49:30 +0000599 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000600 SystemExit_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +0000601 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000602}
603
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000604static int
Thomas Wouters477c8d52006-05-27 19:21:47 +0000605SystemExit_traverse(PySystemExitObject *self, visitproc visit, void *arg)
606{
607 Py_VISIT(self->code);
608 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
609}
610
611static PyMemberDef SystemExit_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +0000612 {"code", T_OBJECT, offsetof(PySystemExitObject, code), 0,
613 PyDoc_STR("exception code")},
614 {NULL} /* Sentinel */
615};
616
617ComplexExtendsException(PyExc_BaseException, SystemExit, SystemExit,
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200618 0, 0, SystemExit_members, 0, 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000619 "Request to exit from the interpreter.");
620
621/*
622 * KeyboardInterrupt extends BaseException
623 */
624SimpleExtendsException(PyExc_BaseException, KeyboardInterrupt,
625 "Program interrupted by user.");
626
627
628/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000629 * ImportError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +0000630 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000631SimpleExtendsException(PyExc_Exception, ImportError,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000632 "Import can't find module, or can't find name in module.");
633
634
635/*
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200636 * OSError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +0000637 */
638
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200639#ifdef MS_WINDOWS
640#include "errmap.h"
641#endif
642
Thomas Wouters477c8d52006-05-27 19:21:47 +0000643/* Where a function has a single filename, such as open() or some
644 * of the os module functions, PyErr_SetFromErrnoWithFilename() is
645 * called, giving a third argument which is the filename. But, so
646 * that old code using in-place unpacking doesn't break, e.g.:
647 *
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200648 * except OSError, (errno, strerror):
Thomas Wouters477c8d52006-05-27 19:21:47 +0000649 *
650 * we hack args so that it only contains two items. This also
651 * means we need our own __str__() which prints out the filename
652 * when it was supplied.
653 */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200654
Antoine Pitroue0e27352011-12-15 14:31:28 +0100655/* This function doesn't cleanup on error, the caller should */
656static int
657oserror_parse_args(PyObject **p_args,
658 PyObject **myerrno, PyObject **strerror,
659 PyObject **filename
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200660#ifdef MS_WINDOWS
Antoine Pitroue0e27352011-12-15 14:31:28 +0100661 , PyObject **winerror
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200662#endif
Antoine Pitroue0e27352011-12-15 14:31:28 +0100663 )
664{
665 Py_ssize_t nargs;
666 PyObject *args = *p_args;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000667
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200668 nargs = PyTuple_GET_SIZE(args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000669
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200670#ifdef MS_WINDOWS
671 if (nargs >= 2 && nargs <= 4) {
672 if (!PyArg_UnpackTuple(args, "OSError", 2, 4,
Antoine Pitroue0e27352011-12-15 14:31:28 +0100673 myerrno, strerror, filename, winerror))
674 return -1;
675 if (*winerror && PyLong_Check(*winerror)) {
676 long errcode, winerrcode;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200677 PyObject *newargs;
678 Py_ssize_t i;
679
Antoine Pitroue0e27352011-12-15 14:31:28 +0100680 winerrcode = PyLong_AsLong(*winerror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200681 if (winerrcode == -1 && PyErr_Occurred())
Antoine Pitroue0e27352011-12-15 14:31:28 +0100682 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200683 /* Set errno to the corresponding POSIX errno (overriding
684 first argument). Windows Socket error codes (>= 10000)
685 have the same value as their POSIX counterparts.
686 */
687 if (winerrcode < 10000)
688 errcode = winerror_to_errno(winerrcode);
689 else
690 errcode = winerrcode;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100691 *myerrno = PyLong_FromLong(errcode);
692 if (!*myerrno)
693 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200694 newargs = PyTuple_New(nargs);
695 if (!newargs)
Antoine Pitroue0e27352011-12-15 14:31:28 +0100696 return -1;
697 PyTuple_SET_ITEM(newargs, 0, *myerrno);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200698 for (i = 1; i < nargs; i++) {
699 PyObject *val = PyTuple_GET_ITEM(args, i);
700 Py_INCREF(val);
701 PyTuple_SET_ITEM(newargs, i, val);
702 }
703 Py_DECREF(args);
Antoine Pitroue0e27352011-12-15 14:31:28 +0100704 args = *p_args = newargs;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200705 }
706 }
707#else
708 if (nargs >= 2 && nargs <= 3) {
709 if (!PyArg_UnpackTuple(args, "OSError", 2, 3,
Antoine Pitroue0e27352011-12-15 14:31:28 +0100710 myerrno, strerror, filename))
711 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200712 }
713#endif
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000714
Antoine Pitroue0e27352011-12-15 14:31:28 +0100715 return 0;
716}
Thomas Wouters477c8d52006-05-27 19:21:47 +0000717
Antoine Pitroue0e27352011-12-15 14:31:28 +0100718static int
719oserror_init(PyOSErrorObject *self, PyObject **p_args,
720 PyObject *myerrno, PyObject *strerror,
721 PyObject *filename
722#ifdef MS_WINDOWS
723 , PyObject *winerror
724#endif
725 )
726{
727 PyObject *args = *p_args;
728 Py_ssize_t nargs = PyTuple_GET_SIZE(args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000729
730 /* self->filename will remain Py_None otherwise */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200731 if (filename && filename != Py_None) {
Antoine Pitroue0e27352011-12-15 14:31:28 +0100732 if (Py_TYPE(self) == (PyTypeObject *) PyExc_BlockingIOError &&
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200733 PyNumber_Check(filename)) {
734 /* BlockingIOError's 3rd argument can be the number of
735 * characters written.
736 */
737 self->written = PyNumber_AsSsize_t(filename, PyExc_ValueError);
738 if (self->written == -1 && PyErr_Occurred())
Antoine Pitroue0e27352011-12-15 14:31:28 +0100739 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200740 }
741 else {
742 Py_INCREF(filename);
743 self->filename = filename;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000744
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200745 if (nargs >= 2 && nargs <= 3) {
746 /* filename is removed from the args tuple (for compatibility
747 purposes, see test_exceptions.py) */
Antoine Pitroue0e27352011-12-15 14:31:28 +0100748 PyObject *subslice = PyTuple_GetSlice(args, 0, 2);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200749 if (!subslice)
Antoine Pitroue0e27352011-12-15 14:31:28 +0100750 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000751
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200752 Py_DECREF(args); /* replacing args */
Antoine Pitroue0e27352011-12-15 14:31:28 +0100753 *p_args = args = subslice;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200754 }
755 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000756 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200757 Py_XINCREF(myerrno);
758 self->myerrno = myerrno;
759
760 Py_XINCREF(strerror);
761 self->strerror = strerror;
762
763#ifdef MS_WINDOWS
764 Py_XINCREF(winerror);
765 self->winerror = winerror;
766#endif
767
Antoine Pitroue0e27352011-12-15 14:31:28 +0100768 /* Steals the reference to args */
769 self->args = args;
770 args = NULL;
771
772 return 0;
773}
774
775static PyObject *
776OSError_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
777static int
778OSError_init(PyOSErrorObject *self, PyObject *args, PyObject *kwds);
779
780static int
781oserror_use_init(PyTypeObject *type)
782{
783 /* When __init__ is defined in a OSError subclass, we want any
784 extraneous argument to __new__ to be ignored. The only reasonable
785 solution, given __new__ takes a variable number of arguments,
786 is to defer arg parsing and initialization to __init__.
787
788 But when __new__ is overriden as well, it should call our __new__
789 with the right arguments.
790
791 (see http://bugs.python.org/issue12555#msg148829 )
792 */
793 if (type->tp_init != (initproc) OSError_init &&
794 type->tp_new == (newfunc) OSError_new) {
795 assert((PyObject *) type != PyExc_OSError);
796 return 1;
797 }
798 return 0;
799}
800
801static PyObject *
802OSError_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
803{
804 PyOSErrorObject *self = NULL;
805 PyObject *myerrno = NULL, *strerror = NULL, *filename = NULL;
806#ifdef MS_WINDOWS
807 PyObject *winerror = NULL;
808#endif
809
810 if (!oserror_use_init(type)) {
811 if (!_PyArg_NoKeywords(type->tp_name, kwds))
812 return NULL;
813
814 Py_INCREF(args);
815 if (oserror_parse_args(&args, &myerrno, &strerror, &filename
816#ifdef MS_WINDOWS
817 , &winerror
818#endif
819 ))
820 goto error;
821
822 if (myerrno && PyLong_Check(myerrno) &&
823 errnomap && (PyObject *) type == PyExc_OSError) {
824 PyObject *newtype;
825 newtype = PyDict_GetItem(errnomap, myerrno);
826 if (newtype) {
827 assert(PyType_Check(newtype));
828 type = (PyTypeObject *) newtype;
829 }
830 else if (PyErr_Occurred())
831 goto error;
832 }
833 }
834
835 self = (PyOSErrorObject *) type->tp_alloc(type, 0);
836 if (!self)
837 goto error;
838
839 self->dict = NULL;
840 self->traceback = self->cause = self->context = NULL;
841 self->written = -1;
842
843 if (!oserror_use_init(type)) {
844 if (oserror_init(self, &args, myerrno, strerror, filename
845#ifdef MS_WINDOWS
846 , winerror
847#endif
848 ))
849 goto error;
850 }
851
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200852 return (PyObject *) self;
853
854error:
855 Py_XDECREF(args);
856 Py_XDECREF(self);
857 return NULL;
858}
859
860static int
Antoine Pitroue0e27352011-12-15 14:31:28 +0100861OSError_init(PyOSErrorObject *self, PyObject *args, PyObject *kwds)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200862{
Antoine Pitroue0e27352011-12-15 14:31:28 +0100863 PyObject *myerrno = NULL, *strerror = NULL, *filename = NULL;
864#ifdef MS_WINDOWS
865 PyObject *winerror = NULL;
866#endif
867
868 if (!oserror_use_init(Py_TYPE(self)))
869 /* Everything already done in OSError_new */
870 return 0;
871
872 if (!_PyArg_NoKeywords(Py_TYPE(self)->tp_name, kwds))
873 return -1;
874
875 Py_INCREF(args);
876 if (oserror_parse_args(&args, &myerrno, &strerror, &filename
877#ifdef MS_WINDOWS
878 , &winerror
879#endif
880 ))
881 goto error;
882
883 if (oserror_init(self, &args, myerrno, strerror, filename
884#ifdef MS_WINDOWS
885 , winerror
886#endif
887 ))
888 goto error;
889
Thomas Wouters477c8d52006-05-27 19:21:47 +0000890 return 0;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100891
892error:
893 Py_XDECREF(args);
894 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000895}
896
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000897static int
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200898OSError_clear(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000899{
900 Py_CLEAR(self->myerrno);
901 Py_CLEAR(self->strerror);
902 Py_CLEAR(self->filename);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200903#ifdef MS_WINDOWS
904 Py_CLEAR(self->winerror);
905#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000906 return BaseException_clear((PyBaseExceptionObject *)self);
907}
908
909static void
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200910OSError_dealloc(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000911{
Thomas Wouters89f507f2006-12-13 04:49:30 +0000912 _PyObject_GC_UNTRACK(self);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200913 OSError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +0000914 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000915}
916
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000917static int
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200918OSError_traverse(PyOSErrorObject *self, visitproc visit,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000919 void *arg)
920{
921 Py_VISIT(self->myerrno);
922 Py_VISIT(self->strerror);
923 Py_VISIT(self->filename);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200924#ifdef MS_WINDOWS
925 Py_VISIT(self->winerror);
926#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000927 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
928}
929
930static PyObject *
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200931OSError_str(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000932{
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200933#ifdef MS_WINDOWS
934 /* If available, winerror has the priority over myerrno */
935 if (self->winerror && self->filename)
936 return PyUnicode_FromFormat("[Error %S] %S: %R",
937 self->winerror ? self->winerror: Py_None,
938 self->strerror ? self->strerror: Py_None,
939 self->filename);
940 if (self->winerror && self->strerror)
941 return PyUnicode_FromFormat("[Error %S] %S",
942 self->winerror ? self->winerror: Py_None,
943 self->strerror ? self->strerror: Py_None);
944#endif
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +0000945 if (self->filename)
946 return PyUnicode_FromFormat("[Errno %S] %S: %R",
947 self->myerrno ? self->myerrno: Py_None,
948 self->strerror ? self->strerror: Py_None,
949 self->filename);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200950 if (self->myerrno && self->strerror)
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +0000951 return PyUnicode_FromFormat("[Errno %S] %S",
952 self->myerrno ? self->myerrno: Py_None,
953 self->strerror ? self->strerror: Py_None);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200954 return BaseException_str((PyBaseExceptionObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000955}
956
Thomas Wouters477c8d52006-05-27 19:21:47 +0000957static PyObject *
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200958OSError_reduce(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000959{
960 PyObject *args = self->args;
961 PyObject *res = NULL, *tmp;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000962
Thomas Wouters477c8d52006-05-27 19:21:47 +0000963 /* self->args is only the first two real arguments if there was a
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200964 * file name given to OSError. */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000965 if (PyTuple_GET_SIZE(args) == 2 && self->filename) {
Thomas Wouters477c8d52006-05-27 19:21:47 +0000966 args = PyTuple_New(3);
Benjamin Peterson90b13582012-02-03 19:22:31 -0500967 if (!args)
968 return NULL;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000969
970 tmp = PyTuple_GET_ITEM(self->args, 0);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000971 Py_INCREF(tmp);
972 PyTuple_SET_ITEM(args, 0, tmp);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000973
974 tmp = PyTuple_GET_ITEM(self->args, 1);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000975 Py_INCREF(tmp);
976 PyTuple_SET_ITEM(args, 1, tmp);
977
978 Py_INCREF(self->filename);
979 PyTuple_SET_ITEM(args, 2, self->filename);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000980 } else
Thomas Wouters477c8d52006-05-27 19:21:47 +0000981 Py_INCREF(args);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000982
983 if (self->dict)
Christian Heimes90aa7642007-12-19 02:45:37 +0000984 res = PyTuple_Pack(3, Py_TYPE(self), args, self->dict);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000985 else
Christian Heimes90aa7642007-12-19 02:45:37 +0000986 res = PyTuple_Pack(2, Py_TYPE(self), args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000987 Py_DECREF(args);
988 return res;
989}
990
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200991static PyObject *
992OSError_written_get(PyOSErrorObject *self, void *context)
993{
994 if (self->written == -1) {
995 PyErr_SetString(PyExc_AttributeError, "characters_written");
996 return NULL;
997 }
998 return PyLong_FromSsize_t(self->written);
999}
Thomas Wouters477c8d52006-05-27 19:21:47 +00001000
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001001static int
1002OSError_written_set(PyOSErrorObject *self, PyObject *arg, void *context)
1003{
1004 Py_ssize_t n;
1005 n = PyNumber_AsSsize_t(arg, PyExc_ValueError);
1006 if (n == -1 && PyErr_Occurred())
1007 return -1;
1008 self->written = n;
1009 return 0;
1010}
1011
1012static PyMemberDef OSError_members[] = {
1013 {"errno", T_OBJECT, offsetof(PyOSErrorObject, myerrno), 0,
1014 PyDoc_STR("POSIX exception code")},
1015 {"strerror", T_OBJECT, offsetof(PyOSErrorObject, strerror), 0,
1016 PyDoc_STR("exception strerror")},
1017 {"filename", T_OBJECT, offsetof(PyOSErrorObject, filename), 0,
1018 PyDoc_STR("exception filename")},
1019#ifdef MS_WINDOWS
1020 {"winerror", T_OBJECT, offsetof(PyOSErrorObject, winerror), 0,
1021 PyDoc_STR("Win32 exception code")},
1022#endif
1023 {NULL} /* Sentinel */
1024};
1025
1026static PyMethodDef OSError_methods[] = {
1027 {"__reduce__", (PyCFunction)OSError_reduce, METH_NOARGS},
Thomas Wouters477c8d52006-05-27 19:21:47 +00001028 {NULL}
1029};
1030
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001031static PyGetSetDef OSError_getset[] = {
1032 {"characters_written", (getter) OSError_written_get,
1033 (setter) OSError_written_set, NULL},
1034 {NULL}
1035};
1036
1037
1038ComplexExtendsException(PyExc_Exception, OSError,
1039 OSError, OSError_new,
1040 OSError_methods, OSError_members, OSError_getset,
1041 OSError_str,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001042 "Base class for I/O related errors.");
1043
1044
1045/*
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001046 * Various OSError subclasses
Thomas Wouters477c8d52006-05-27 19:21:47 +00001047 */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001048MiddlingExtendsException(PyExc_OSError, BlockingIOError, OSError,
1049 "I/O operation would block.");
1050MiddlingExtendsException(PyExc_OSError, ConnectionError, OSError,
1051 "Connection error.");
1052MiddlingExtendsException(PyExc_OSError, ChildProcessError, OSError,
1053 "Child process error.");
1054MiddlingExtendsException(PyExc_ConnectionError, BrokenPipeError, OSError,
1055 "Broken pipe.");
1056MiddlingExtendsException(PyExc_ConnectionError, ConnectionAbortedError, OSError,
1057 "Connection aborted.");
1058MiddlingExtendsException(PyExc_ConnectionError, ConnectionRefusedError, OSError,
1059 "Connection refused.");
1060MiddlingExtendsException(PyExc_ConnectionError, ConnectionResetError, OSError,
1061 "Connection reset.");
1062MiddlingExtendsException(PyExc_OSError, FileExistsError, OSError,
1063 "File already exists.");
1064MiddlingExtendsException(PyExc_OSError, FileNotFoundError, OSError,
1065 "File not found.");
1066MiddlingExtendsException(PyExc_OSError, IsADirectoryError, OSError,
1067 "Operation doesn't work on directories.");
1068MiddlingExtendsException(PyExc_OSError, NotADirectoryError, OSError,
1069 "Operation only works on directories.");
1070MiddlingExtendsException(PyExc_OSError, InterruptedError, OSError,
1071 "Interrupted by signal.");
1072MiddlingExtendsException(PyExc_OSError, PermissionError, OSError,
1073 "Not enough permissions.");
1074MiddlingExtendsException(PyExc_OSError, ProcessLookupError, OSError,
1075 "Process not found.");
1076MiddlingExtendsException(PyExc_OSError, TimeoutError, OSError,
1077 "Timeout expired.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001078
1079/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001080 * EOFError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001081 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001082SimpleExtendsException(PyExc_Exception, EOFError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001083 "Read beyond end of file.");
1084
1085
1086/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001087 * RuntimeError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001088 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001089SimpleExtendsException(PyExc_Exception, RuntimeError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001090 "Unspecified run-time error.");
1091
1092
1093/*
1094 * NotImplementedError extends RuntimeError
1095 */
1096SimpleExtendsException(PyExc_RuntimeError, NotImplementedError,
1097 "Method or function hasn't been implemented yet.");
1098
1099/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001100 * NameError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001101 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001102SimpleExtendsException(PyExc_Exception, NameError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001103 "Name not found globally.");
1104
1105/*
1106 * UnboundLocalError extends NameError
1107 */
1108SimpleExtendsException(PyExc_NameError, UnboundLocalError,
1109 "Local name referenced but not bound to a value.");
1110
1111/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001112 * AttributeError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001113 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001114SimpleExtendsException(PyExc_Exception, AttributeError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001115 "Attribute not found.");
1116
1117
1118/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001119 * SyntaxError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001120 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001121
1122static int
1123SyntaxError_init(PySyntaxErrorObject *self, PyObject *args, PyObject *kwds)
1124{
1125 PyObject *info = NULL;
1126 Py_ssize_t lenargs = PyTuple_GET_SIZE(args);
1127
1128 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1129 return -1;
1130
1131 if (lenargs >= 1) {
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001132 Py_CLEAR(self->msg);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001133 self->msg = PyTuple_GET_ITEM(args, 0);
1134 Py_INCREF(self->msg);
1135 }
1136 if (lenargs == 2) {
1137 info = PyTuple_GET_ITEM(args, 1);
1138 info = PySequence_Tuple(info);
Benjamin Peterson90b13582012-02-03 19:22:31 -05001139 if (!info)
1140 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001141
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001142 if (PyTuple_GET_SIZE(info) != 4) {
1143 /* not a very good error message, but it's what Python 2.4 gives */
1144 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
1145 Py_DECREF(info);
1146 return -1;
1147 }
1148
1149 Py_CLEAR(self->filename);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001150 self->filename = PyTuple_GET_ITEM(info, 0);
1151 Py_INCREF(self->filename);
1152
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001153 Py_CLEAR(self->lineno);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001154 self->lineno = PyTuple_GET_ITEM(info, 1);
1155 Py_INCREF(self->lineno);
1156
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001157 Py_CLEAR(self->offset);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001158 self->offset = PyTuple_GET_ITEM(info, 2);
1159 Py_INCREF(self->offset);
1160
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001161 Py_CLEAR(self->text);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001162 self->text = PyTuple_GET_ITEM(info, 3);
1163 Py_INCREF(self->text);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001164
1165 Py_DECREF(info);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001166 }
1167 return 0;
1168}
1169
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001170static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001171SyntaxError_clear(PySyntaxErrorObject *self)
1172{
1173 Py_CLEAR(self->msg);
1174 Py_CLEAR(self->filename);
1175 Py_CLEAR(self->lineno);
1176 Py_CLEAR(self->offset);
1177 Py_CLEAR(self->text);
1178 Py_CLEAR(self->print_file_and_line);
1179 return BaseException_clear((PyBaseExceptionObject *)self);
1180}
1181
1182static void
1183SyntaxError_dealloc(PySyntaxErrorObject *self)
1184{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001185 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001186 SyntaxError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +00001187 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001188}
1189
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001190static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001191SyntaxError_traverse(PySyntaxErrorObject *self, visitproc visit, void *arg)
1192{
1193 Py_VISIT(self->msg);
1194 Py_VISIT(self->filename);
1195 Py_VISIT(self->lineno);
1196 Py_VISIT(self->offset);
1197 Py_VISIT(self->text);
1198 Py_VISIT(self->print_file_and_line);
1199 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1200}
1201
1202/* This is called "my_basename" instead of just "basename" to avoid name
1203 conflicts with glibc; basename is already prototyped if _GNU_SOURCE is
1204 defined, and Python does define that. */
Victor Stinner6237daf2010-04-28 17:26:19 +00001205static PyObject*
1206my_basename(PyObject *name)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001207{
Victor Stinner6237daf2010-04-28 17:26:19 +00001208 Py_ssize_t i, size, offset;
Victor Stinner31392e72011-10-05 20:14:23 +02001209 int kind;
1210 void *data;
1211
1212 if (PyUnicode_READY(name))
1213 return NULL;
1214 kind = PyUnicode_KIND(name);
1215 data = PyUnicode_DATA(name);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001216 size = PyUnicode_GET_LENGTH(name);
Victor Stinner6237daf2010-04-28 17:26:19 +00001217 offset = 0;
1218 for(i=0; i < size; i++) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001219 if (PyUnicode_READ(kind, data, i) == SEP)
Victor Stinner6237daf2010-04-28 17:26:19 +00001220 offset = i + 1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001221 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001222 if (offset != 0)
1223 return PyUnicode_Substring(name, offset, size);
1224 else {
Victor Stinner6237daf2010-04-28 17:26:19 +00001225 Py_INCREF(name);
1226 return name;
1227 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001228}
1229
1230
1231static PyObject *
1232SyntaxError_str(PySyntaxErrorObject *self)
1233{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001234 int have_lineno = 0;
Victor Stinner6237daf2010-04-28 17:26:19 +00001235 PyObject *filename;
1236 PyObject *result;
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001237 /* Below, we always ignore overflow errors, just printing -1.
1238 Still, we cannot allow an OverflowError to be raised, so
1239 we need to call PyLong_AsLongAndOverflow. */
1240 int overflow;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001241
1242 /* XXX -- do all the additional formatting with filename and
1243 lineno here */
1244
Neal Norwitzed2b7392007-08-26 04:51:10 +00001245 if (self->filename && PyUnicode_Check(self->filename)) {
Victor Stinner6237daf2010-04-28 17:26:19 +00001246 filename = my_basename(self->filename);
1247 if (filename == NULL)
1248 return NULL;
1249 } else {
1250 filename = NULL;
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001251 }
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001252 have_lineno = (self->lineno != NULL) && PyLong_CheckExact(self->lineno);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001253
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001254 if (!filename && !have_lineno)
Thomas Heller519a0422007-11-15 20:48:54 +00001255 return PyObject_Str(self->msg ? self->msg : Py_None);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001256
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001257 if (filename && have_lineno)
Victor Stinner6237daf2010-04-28 17:26:19 +00001258 result = PyUnicode_FromFormat("%S (%U, line %ld)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001259 self->msg ? self->msg : Py_None,
Victor Stinner6237daf2010-04-28 17:26:19 +00001260 filename,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001261 PyLong_AsLongAndOverflow(self->lineno, &overflow));
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001262 else if (filename)
Victor Stinner6237daf2010-04-28 17:26:19 +00001263 result = PyUnicode_FromFormat("%S (%U)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001264 self->msg ? self->msg : Py_None,
Victor Stinner6237daf2010-04-28 17:26:19 +00001265 filename);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001266 else /* only have_lineno */
Victor Stinner6237daf2010-04-28 17:26:19 +00001267 result = PyUnicode_FromFormat("%S (line %ld)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001268 self->msg ? self->msg : Py_None,
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001269 PyLong_AsLongAndOverflow(self->lineno, &overflow));
Victor Stinner6237daf2010-04-28 17:26:19 +00001270 Py_XDECREF(filename);
1271 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001272}
1273
1274static PyMemberDef SyntaxError_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +00001275 {"msg", T_OBJECT, offsetof(PySyntaxErrorObject, msg), 0,
1276 PyDoc_STR("exception msg")},
1277 {"filename", T_OBJECT, offsetof(PySyntaxErrorObject, filename), 0,
1278 PyDoc_STR("exception filename")},
1279 {"lineno", T_OBJECT, offsetof(PySyntaxErrorObject, lineno), 0,
1280 PyDoc_STR("exception lineno")},
1281 {"offset", T_OBJECT, offsetof(PySyntaxErrorObject, offset), 0,
1282 PyDoc_STR("exception offset")},
1283 {"text", T_OBJECT, offsetof(PySyntaxErrorObject, text), 0,
1284 PyDoc_STR("exception text")},
1285 {"print_file_and_line", T_OBJECT,
1286 offsetof(PySyntaxErrorObject, print_file_and_line), 0,
1287 PyDoc_STR("exception print_file_and_line")},
1288 {NULL} /* Sentinel */
1289};
1290
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001291ComplexExtendsException(PyExc_Exception, SyntaxError, SyntaxError,
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001292 0, 0, SyntaxError_members, 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001293 SyntaxError_str, "Invalid syntax.");
1294
1295
1296/*
1297 * IndentationError extends SyntaxError
1298 */
1299MiddlingExtendsException(PyExc_SyntaxError, IndentationError, SyntaxError,
1300 "Improper indentation.");
1301
1302
1303/*
1304 * TabError extends IndentationError
1305 */
1306MiddlingExtendsException(PyExc_IndentationError, TabError, SyntaxError,
1307 "Improper mixture of spaces and tabs.");
1308
1309
1310/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001311 * LookupError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001312 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001313SimpleExtendsException(PyExc_Exception, LookupError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001314 "Base class for lookup errors.");
1315
1316
1317/*
1318 * IndexError extends LookupError
1319 */
1320SimpleExtendsException(PyExc_LookupError, IndexError,
1321 "Sequence index out of range.");
1322
1323
1324/*
1325 * KeyError extends LookupError
1326 */
1327static PyObject *
1328KeyError_str(PyBaseExceptionObject *self)
1329{
1330 /* If args is a tuple of exactly one item, apply repr to args[0].
1331 This is done so that e.g. the exception raised by {}[''] prints
1332 KeyError: ''
1333 rather than the confusing
1334 KeyError
1335 alone. The downside is that if KeyError is raised with an explanatory
1336 string, that string will be displayed in quotes. Too bad.
1337 If args is anything else, use the default BaseException__str__().
1338 */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001339 if (PyTuple_GET_SIZE(self->args) == 1) {
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001340 return PyObject_Repr(PyTuple_GET_ITEM(self->args, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001341 }
1342 return BaseException_str(self);
1343}
1344
1345ComplexExtendsException(PyExc_LookupError, KeyError, BaseException,
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001346 0, 0, 0, 0, KeyError_str, "Mapping key not found.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001347
1348
1349/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001350 * ValueError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001351 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001352SimpleExtendsException(PyExc_Exception, ValueError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001353 "Inappropriate argument value (of correct type).");
1354
1355/*
1356 * UnicodeError extends ValueError
1357 */
1358
1359SimpleExtendsException(PyExc_ValueError, UnicodeError,
1360 "Unicode related error.");
1361
Thomas Wouters477c8d52006-05-27 19:21:47 +00001362static PyObject *
Guido van Rossum98297ee2007-11-06 21:34:58 +00001363get_string(PyObject *attr, const char *name)
Walter Dörwald612344f2007-05-04 19:28:21 +00001364{
1365 if (!attr) {
1366 PyErr_Format(PyExc_TypeError, "%.200s attribute not set", name);
1367 return NULL;
1368 }
1369
Christian Heimes72b710a2008-05-26 13:28:38 +00001370 if (!PyBytes_Check(attr)) {
Walter Dörwald612344f2007-05-04 19:28:21 +00001371 PyErr_Format(PyExc_TypeError, "%.200s attribute must be bytes", name);
1372 return NULL;
1373 }
1374 Py_INCREF(attr);
1375 return attr;
1376}
1377
1378static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00001379get_unicode(PyObject *attr, const char *name)
1380{
1381 if (!attr) {
1382 PyErr_Format(PyExc_TypeError, "%.200s attribute not set", name);
1383 return NULL;
1384 }
1385
1386 if (!PyUnicode_Check(attr)) {
1387 PyErr_Format(PyExc_TypeError,
1388 "%.200s attribute must be unicode", name);
1389 return NULL;
1390 }
1391 Py_INCREF(attr);
1392 return attr;
1393}
1394
Walter Dörwaldd2034312007-05-18 16:29:38 +00001395static int
1396set_unicodefromstring(PyObject **attr, const char *value)
1397{
1398 PyObject *obj = PyUnicode_FromString(value);
1399 if (!obj)
1400 return -1;
1401 Py_CLEAR(*attr);
1402 *attr = obj;
1403 return 0;
1404}
1405
Thomas Wouters477c8d52006-05-27 19:21:47 +00001406PyObject *
1407PyUnicodeEncodeError_GetEncoding(PyObject *exc)
1408{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001409 return get_unicode(((PyUnicodeErrorObject *)exc)->encoding, "encoding");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001410}
1411
1412PyObject *
1413PyUnicodeDecodeError_GetEncoding(PyObject *exc)
1414{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001415 return get_unicode(((PyUnicodeErrorObject *)exc)->encoding, "encoding");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001416}
1417
1418PyObject *
1419PyUnicodeEncodeError_GetObject(PyObject *exc)
1420{
1421 return get_unicode(((PyUnicodeErrorObject *)exc)->object, "object");
1422}
1423
1424PyObject *
1425PyUnicodeDecodeError_GetObject(PyObject *exc)
1426{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001427 return get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001428}
1429
1430PyObject *
1431PyUnicodeTranslateError_GetObject(PyObject *exc)
1432{
1433 return get_unicode(((PyUnicodeErrorObject *)exc)->object, "object");
1434}
1435
1436int
1437PyUnicodeEncodeError_GetStart(PyObject *exc, Py_ssize_t *start)
1438{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001439 Py_ssize_t size;
1440 PyObject *obj = get_unicode(((PyUnicodeErrorObject *)exc)->object,
1441 "object");
1442 if (!obj)
1443 return -1;
1444 *start = ((PyUnicodeErrorObject *)exc)->start;
Victor Stinner9e30aa52011-11-21 02:49:52 +01001445 size = PyUnicode_GET_LENGTH(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001446 if (*start<0)
1447 *start = 0; /*XXX check for values <0*/
1448 if (*start>=size)
1449 *start = size-1;
1450 Py_DECREF(obj);
1451 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001452}
1453
1454
1455int
1456PyUnicodeDecodeError_GetStart(PyObject *exc, Py_ssize_t *start)
1457{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001458 Py_ssize_t size;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001459 PyObject *obj = get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001460 if (!obj)
1461 return -1;
Christian Heimes72b710a2008-05-26 13:28:38 +00001462 size = PyBytes_GET_SIZE(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001463 *start = ((PyUnicodeErrorObject *)exc)->start;
1464 if (*start<0)
1465 *start = 0;
1466 if (*start>=size)
1467 *start = size-1;
1468 Py_DECREF(obj);
1469 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001470}
1471
1472
1473int
1474PyUnicodeTranslateError_GetStart(PyObject *exc, Py_ssize_t *start)
1475{
1476 return PyUnicodeEncodeError_GetStart(exc, start);
1477}
1478
1479
1480int
1481PyUnicodeEncodeError_SetStart(PyObject *exc, Py_ssize_t start)
1482{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001483 ((PyUnicodeErrorObject *)exc)->start = start;
1484 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001485}
1486
1487
1488int
1489PyUnicodeDecodeError_SetStart(PyObject *exc, Py_ssize_t start)
1490{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001491 ((PyUnicodeErrorObject *)exc)->start = start;
1492 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001493}
1494
1495
1496int
1497PyUnicodeTranslateError_SetStart(PyObject *exc, Py_ssize_t start)
1498{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001499 ((PyUnicodeErrorObject *)exc)->start = start;
1500 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001501}
1502
1503
1504int
1505PyUnicodeEncodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
1506{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001507 Py_ssize_t size;
1508 PyObject *obj = get_unicode(((PyUnicodeErrorObject *)exc)->object,
1509 "object");
1510 if (!obj)
1511 return -1;
1512 *end = ((PyUnicodeErrorObject *)exc)->end;
Victor Stinner9e30aa52011-11-21 02:49:52 +01001513 size = PyUnicode_GET_LENGTH(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001514 if (*end<1)
1515 *end = 1;
1516 if (*end>size)
1517 *end = size;
1518 Py_DECREF(obj);
1519 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001520}
1521
1522
1523int
1524PyUnicodeDecodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
1525{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001526 Py_ssize_t size;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001527 PyObject *obj = get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001528 if (!obj)
1529 return -1;
Christian Heimes72b710a2008-05-26 13:28:38 +00001530 size = PyBytes_GET_SIZE(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001531 *end = ((PyUnicodeErrorObject *)exc)->end;
1532 if (*end<1)
1533 *end = 1;
1534 if (*end>size)
1535 *end = size;
1536 Py_DECREF(obj);
1537 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001538}
1539
1540
1541int
1542PyUnicodeTranslateError_GetEnd(PyObject *exc, Py_ssize_t *start)
1543{
1544 return PyUnicodeEncodeError_GetEnd(exc, start);
1545}
1546
1547
1548int
1549PyUnicodeEncodeError_SetEnd(PyObject *exc, Py_ssize_t end)
1550{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001551 ((PyUnicodeErrorObject *)exc)->end = end;
1552 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001553}
1554
1555
1556int
1557PyUnicodeDecodeError_SetEnd(PyObject *exc, Py_ssize_t end)
1558{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001559 ((PyUnicodeErrorObject *)exc)->end = end;
1560 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001561}
1562
1563
1564int
1565PyUnicodeTranslateError_SetEnd(PyObject *exc, Py_ssize_t end)
1566{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001567 ((PyUnicodeErrorObject *)exc)->end = end;
1568 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001569}
1570
1571PyObject *
1572PyUnicodeEncodeError_GetReason(PyObject *exc)
1573{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001574 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001575}
1576
1577
1578PyObject *
1579PyUnicodeDecodeError_GetReason(PyObject *exc)
1580{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001581 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001582}
1583
1584
1585PyObject *
1586PyUnicodeTranslateError_GetReason(PyObject *exc)
1587{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001588 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001589}
1590
1591
1592int
1593PyUnicodeEncodeError_SetReason(PyObject *exc, const char *reason)
1594{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001595 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1596 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001597}
1598
1599
1600int
1601PyUnicodeDecodeError_SetReason(PyObject *exc, const char *reason)
1602{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001603 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1604 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001605}
1606
1607
1608int
1609PyUnicodeTranslateError_SetReason(PyObject *exc, const char *reason)
1610{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001611 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1612 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001613}
1614
1615
Thomas Wouters477c8d52006-05-27 19:21:47 +00001616static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001617UnicodeError_clear(PyUnicodeErrorObject *self)
1618{
1619 Py_CLEAR(self->encoding);
1620 Py_CLEAR(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001621 Py_CLEAR(self->reason);
1622 return BaseException_clear((PyBaseExceptionObject *)self);
1623}
1624
1625static void
1626UnicodeError_dealloc(PyUnicodeErrorObject *self)
1627{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001628 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001629 UnicodeError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +00001630 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001631}
1632
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001633static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001634UnicodeError_traverse(PyUnicodeErrorObject *self, visitproc visit, void *arg)
1635{
1636 Py_VISIT(self->encoding);
1637 Py_VISIT(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001638 Py_VISIT(self->reason);
1639 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1640}
1641
1642static PyMemberDef UnicodeError_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +00001643 {"encoding", T_OBJECT, offsetof(PyUnicodeErrorObject, encoding), 0,
1644 PyDoc_STR("exception encoding")},
1645 {"object", T_OBJECT, offsetof(PyUnicodeErrorObject, object), 0,
1646 PyDoc_STR("exception object")},
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001647 {"start", T_PYSSIZET, offsetof(PyUnicodeErrorObject, start), 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001648 PyDoc_STR("exception start")},
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001649 {"end", T_PYSSIZET, offsetof(PyUnicodeErrorObject, end), 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001650 PyDoc_STR("exception end")},
1651 {"reason", T_OBJECT, offsetof(PyUnicodeErrorObject, reason), 0,
1652 PyDoc_STR("exception reason")},
1653 {NULL} /* Sentinel */
1654};
1655
1656
1657/*
1658 * UnicodeEncodeError extends UnicodeError
1659 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001660
1661static int
1662UnicodeEncodeError_init(PyObject *self, PyObject *args, PyObject *kwds)
1663{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001664 PyUnicodeErrorObject *err;
1665
Thomas Wouters477c8d52006-05-27 19:21:47 +00001666 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1667 return -1;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001668
1669 err = (PyUnicodeErrorObject *)self;
1670
1671 Py_CLEAR(err->encoding);
1672 Py_CLEAR(err->object);
1673 Py_CLEAR(err->reason);
1674
1675 if (!PyArg_ParseTuple(args, "O!O!nnO!",
1676 &PyUnicode_Type, &err->encoding,
1677 &PyUnicode_Type, &err->object,
1678 &err->start,
1679 &err->end,
1680 &PyUnicode_Type, &err->reason)) {
1681 err->encoding = err->object = err->reason = NULL;
1682 return -1;
1683 }
1684
Martin v. Löwisb09af032011-11-04 11:16:41 +01001685 if (PyUnicode_READY(err->object) < -1) {
1686 err->encoding = NULL;
1687 return -1;
1688 }
1689
Guido van Rossum98297ee2007-11-06 21:34:58 +00001690 Py_INCREF(err->encoding);
1691 Py_INCREF(err->object);
1692 Py_INCREF(err->reason);
1693
1694 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001695}
1696
1697static PyObject *
1698UnicodeEncodeError_str(PyObject *self)
1699{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001700 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00001701 PyObject *result = NULL;
1702 PyObject *reason_str = NULL;
1703 PyObject *encoding_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001704
Eric Smith0facd772010-02-24 15:42:29 +00001705 /* Get reason and encoding as strings, which they might not be if
1706 they've been modified after we were contructed. */
1707 reason_str = PyObject_Str(uself->reason);
1708 if (reason_str == NULL)
1709 goto done;
1710 encoding_str = PyObject_Str(uself->encoding);
1711 if (encoding_str == NULL)
1712 goto done;
1713
Victor Stinnerda1ddf32011-11-20 22:50:23 +01001714 if (uself->start < PyUnicode_GET_LENGTH(uself->object) && uself->end == uself->start+1) {
1715 Py_UCS4 badchar = PyUnicode_ReadChar(uself->object, uself->start);
Walter Dörwald787b03b2007-06-05 13:29:29 +00001716 const char *fmt;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001717 if (badchar <= 0xff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00001718 fmt = "'%U' codec can't encode character '\\x%02x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001719 else if (badchar <= 0xffff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00001720 fmt = "'%U' codec can't encode character '\\u%04x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001721 else
Walter Dörwald32a4c712007-06-20 09:25:34 +00001722 fmt = "'%U' codec can't encode character '\\U%08x' in position %zd: %U";
Eric Smith0facd772010-02-24 15:42:29 +00001723 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00001724 fmt,
Eric Smith0facd772010-02-24 15:42:29 +00001725 encoding_str,
Victor Stinnerda1ddf32011-11-20 22:50:23 +01001726 (int)badchar,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001727 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00001728 reason_str);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001729 }
Eric Smith0facd772010-02-24 15:42:29 +00001730 else {
1731 result = PyUnicode_FromFormat(
1732 "'%U' codec can't encode characters in position %zd-%zd: %U",
1733 encoding_str,
1734 uself->start,
1735 uself->end-1,
1736 reason_str);
1737 }
1738done:
1739 Py_XDECREF(reason_str);
1740 Py_XDECREF(encoding_str);
1741 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001742}
1743
1744static PyTypeObject _PyExc_UnicodeEncodeError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001745 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00001746 "UnicodeEncodeError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00001747 sizeof(PyUnicodeErrorObject), 0,
1748 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1749 (reprfunc)UnicodeEncodeError_str, 0, 0, 0,
1750 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001751 PyDoc_STR("Unicode encoding error."), (traverseproc)UnicodeError_traverse,
1752 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001753 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001754 (initproc)UnicodeEncodeError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001755};
1756PyObject *PyExc_UnicodeEncodeError = (PyObject *)&_PyExc_UnicodeEncodeError;
1757
1758PyObject *
1759PyUnicodeEncodeError_Create(
1760 const char *encoding, const Py_UNICODE *object, Py_ssize_t length,
1761 Py_ssize_t start, Py_ssize_t end, const char *reason)
1762{
Victor Stinner7eeb5b52010-06-07 19:57:46 +00001763 return PyObject_CallFunction(PyExc_UnicodeEncodeError, "su#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001764 encoding, object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001765}
1766
1767
1768/*
1769 * UnicodeDecodeError extends UnicodeError
1770 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001771
1772static int
1773UnicodeDecodeError_init(PyObject *self, PyObject *args, PyObject *kwds)
1774{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001775 PyUnicodeErrorObject *ude;
1776 const char *data;
1777 Py_ssize_t size;
1778
Thomas Wouters477c8d52006-05-27 19:21:47 +00001779 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1780 return -1;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001781
1782 ude = (PyUnicodeErrorObject *)self;
1783
1784 Py_CLEAR(ude->encoding);
1785 Py_CLEAR(ude->object);
1786 Py_CLEAR(ude->reason);
1787
1788 if (!PyArg_ParseTuple(args, "O!OnnO!",
1789 &PyUnicode_Type, &ude->encoding,
1790 &ude->object,
1791 &ude->start,
1792 &ude->end,
1793 &PyUnicode_Type, &ude->reason)) {
1794 ude->encoding = ude->object = ude->reason = NULL;
1795 return -1;
1796 }
1797
Christian Heimes72b710a2008-05-26 13:28:38 +00001798 if (!PyBytes_Check(ude->object)) {
Guido van Rossum98297ee2007-11-06 21:34:58 +00001799 if (PyObject_AsReadBuffer(ude->object, (const void **)&data, &size)) {
1800 ude->encoding = ude->object = ude->reason = NULL;
1801 return -1;
1802 }
Christian Heimes72b710a2008-05-26 13:28:38 +00001803 ude->object = PyBytes_FromStringAndSize(data, size);
Guido van Rossum98297ee2007-11-06 21:34:58 +00001804 }
1805 else {
1806 Py_INCREF(ude->object);
1807 }
1808
1809 Py_INCREF(ude->encoding);
1810 Py_INCREF(ude->reason);
1811
1812 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001813}
1814
1815static PyObject *
1816UnicodeDecodeError_str(PyObject *self)
1817{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001818 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00001819 PyObject *result = NULL;
1820 PyObject *reason_str = NULL;
1821 PyObject *encoding_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001822
Eric Smith0facd772010-02-24 15:42:29 +00001823 /* Get reason and encoding as strings, which they might not be if
1824 they've been modified after we were contructed. */
1825 reason_str = PyObject_Str(uself->reason);
1826 if (reason_str == NULL)
1827 goto done;
1828 encoding_str = PyObject_Str(uself->encoding);
1829 if (encoding_str == NULL)
1830 goto done;
1831
1832 if (uself->start < PyBytes_GET_SIZE(uself->object) && uself->end == uself->start+1) {
Christian Heimes72b710a2008-05-26 13:28:38 +00001833 int byte = (int)(PyBytes_AS_STRING(((PyUnicodeErrorObject *)self)->object)[uself->start]&0xff);
Eric Smith0facd772010-02-24 15:42:29 +00001834 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00001835 "'%U' codec can't decode byte 0x%02x in position %zd: %U",
Eric Smith0facd772010-02-24 15:42:29 +00001836 encoding_str,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001837 byte,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001838 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00001839 reason_str);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001840 }
Eric Smith0facd772010-02-24 15:42:29 +00001841 else {
1842 result = PyUnicode_FromFormat(
1843 "'%U' codec can't decode bytes in position %zd-%zd: %U",
1844 encoding_str,
1845 uself->start,
1846 uself->end-1,
1847 reason_str
1848 );
1849 }
1850done:
1851 Py_XDECREF(reason_str);
1852 Py_XDECREF(encoding_str);
1853 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001854}
1855
1856static PyTypeObject _PyExc_UnicodeDecodeError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001857 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00001858 "UnicodeDecodeError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00001859 sizeof(PyUnicodeErrorObject), 0,
1860 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1861 (reprfunc)UnicodeDecodeError_str, 0, 0, 0,
1862 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001863 PyDoc_STR("Unicode decoding error."), (traverseproc)UnicodeError_traverse,
1864 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001865 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001866 (initproc)UnicodeDecodeError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001867};
1868PyObject *PyExc_UnicodeDecodeError = (PyObject *)&_PyExc_UnicodeDecodeError;
1869
1870PyObject *
1871PyUnicodeDecodeError_Create(
1872 const char *encoding, const char *object, Py_ssize_t length,
1873 Py_ssize_t start, Py_ssize_t end, const char *reason)
1874{
Victor Stinner7eeb5b52010-06-07 19:57:46 +00001875 return PyObject_CallFunction(PyExc_UnicodeDecodeError, "sy#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001876 encoding, object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001877}
1878
1879
1880/*
1881 * UnicodeTranslateError extends UnicodeError
1882 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001883
1884static int
1885UnicodeTranslateError_init(PyUnicodeErrorObject *self, PyObject *args,
1886 PyObject *kwds)
1887{
1888 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1889 return -1;
1890
1891 Py_CLEAR(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001892 Py_CLEAR(self->reason);
1893
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001894 if (!PyArg_ParseTuple(args, "O!nnO!",
Thomas Wouters477c8d52006-05-27 19:21:47 +00001895 &PyUnicode_Type, &self->object,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001896 &self->start,
1897 &self->end,
Walter Dörwaldd2034312007-05-18 16:29:38 +00001898 &PyUnicode_Type, &self->reason)) {
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001899 self->object = self->reason = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001900 return -1;
1901 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001902
Thomas Wouters477c8d52006-05-27 19:21:47 +00001903 Py_INCREF(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001904 Py_INCREF(self->reason);
1905
1906 return 0;
1907}
1908
1909
1910static PyObject *
1911UnicodeTranslateError_str(PyObject *self)
1912{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001913 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00001914 PyObject *result = NULL;
1915 PyObject *reason_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001916
Eric Smith0facd772010-02-24 15:42:29 +00001917 /* Get reason as a string, which it might not be if it's been
1918 modified after we were contructed. */
1919 reason_str = PyObject_Str(uself->reason);
1920 if (reason_str == NULL)
1921 goto done;
1922
Victor Stinner53b33e72011-11-21 01:17:27 +01001923 if (uself->start < PyUnicode_GET_LENGTH(uself->object) && uself->end == uself->start+1) {
1924 Py_UCS4 badchar = PyUnicode_ReadChar(uself->object, uself->start);
Walter Dörwald787b03b2007-06-05 13:29:29 +00001925 const char *fmt;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001926 if (badchar <= 0xff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00001927 fmt = "can't translate character '\\x%02x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001928 else if (badchar <= 0xffff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00001929 fmt = "can't translate character '\\u%04x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001930 else
Walter Dörwald32a4c712007-06-20 09:25:34 +00001931 fmt = "can't translate character '\\U%08x' in position %zd: %U";
Benjamin Petersonc5f4e1e2010-02-25 01:22:28 +00001932 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00001933 fmt,
Victor Stinner53b33e72011-11-21 01:17:27 +01001934 (int)badchar,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001935 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00001936 reason_str
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001937 );
Eric Smith0facd772010-02-24 15:42:29 +00001938 } else {
1939 result = PyUnicode_FromFormat(
1940 "can't translate characters in position %zd-%zd: %U",
1941 uself->start,
1942 uself->end-1,
1943 reason_str
1944 );
Thomas Wouters477c8d52006-05-27 19:21:47 +00001945 }
Eric Smith0facd772010-02-24 15:42:29 +00001946done:
1947 Py_XDECREF(reason_str);
1948 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001949}
1950
1951static PyTypeObject _PyExc_UnicodeTranslateError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001952 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00001953 "UnicodeTranslateError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00001954 sizeof(PyUnicodeErrorObject), 0,
1955 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1956 (reprfunc)UnicodeTranslateError_str, 0, 0, 0,
1957 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters89f507f2006-12-13 04:49:30 +00001958 PyDoc_STR("Unicode translation error."), (traverseproc)UnicodeError_traverse,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001959 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
1960 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001961 (initproc)UnicodeTranslateError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001962};
1963PyObject *PyExc_UnicodeTranslateError = (PyObject *)&_PyExc_UnicodeTranslateError;
1964
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001965/* Deprecated. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001966PyObject *
1967PyUnicodeTranslateError_Create(
1968 const Py_UNICODE *object, Py_ssize_t length,
1969 Py_ssize_t start, Py_ssize_t end, const char *reason)
1970{
1971 return PyObject_CallFunction(PyExc_UnicodeTranslateError, "u#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001972 object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001973}
Thomas Wouters477c8d52006-05-27 19:21:47 +00001974
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001975PyObject *
1976_PyUnicodeTranslateError_Create(
1977 PyObject *object,
1978 Py_ssize_t start, Py_ssize_t end, const char *reason)
1979{
1980 return PyObject_CallFunction(PyExc_UnicodeTranslateError, "Ons",
1981 object, start, end, reason);
1982}
Thomas Wouters477c8d52006-05-27 19:21:47 +00001983
1984/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001985 * AssertionError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001986 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001987SimpleExtendsException(PyExc_Exception, AssertionError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001988 "Assertion failed.");
1989
1990
1991/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001992 * ArithmeticError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001993 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001994SimpleExtendsException(PyExc_Exception, ArithmeticError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001995 "Base class for arithmetic errors.");
1996
1997
1998/*
1999 * FloatingPointError extends ArithmeticError
2000 */
2001SimpleExtendsException(PyExc_ArithmeticError, FloatingPointError,
2002 "Floating point operation failed.");
2003
2004
2005/*
2006 * OverflowError extends ArithmeticError
2007 */
2008SimpleExtendsException(PyExc_ArithmeticError, OverflowError,
2009 "Result too large to be represented.");
2010
2011
2012/*
2013 * ZeroDivisionError extends ArithmeticError
2014 */
2015SimpleExtendsException(PyExc_ArithmeticError, ZeroDivisionError,
2016 "Second argument to a division or modulo operation was zero.");
2017
2018
2019/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002020 * SystemError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002021 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002022SimpleExtendsException(PyExc_Exception, SystemError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002023 "Internal error in the Python interpreter.\n"
2024 "\n"
2025 "Please report this to the Python maintainer, along with the traceback,\n"
2026 "the Python version, and the hardware/OS platform and version.");
2027
2028
2029/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002030 * ReferenceError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002031 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002032SimpleExtendsException(PyExc_Exception, ReferenceError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002033 "Weak ref proxy used after referent went away.");
2034
2035
2036/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002037 * MemoryError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002038 */
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002039
2040#define MEMERRORS_SAVE 16
2041static PyBaseExceptionObject *memerrors_freelist = NULL;
2042static int memerrors_numfree = 0;
2043
2044static PyObject *
2045MemoryError_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2046{
2047 PyBaseExceptionObject *self;
2048
2049 if (type != (PyTypeObject *) PyExc_MemoryError)
2050 return BaseException_new(type, args, kwds);
2051 if (memerrors_freelist == NULL)
2052 return BaseException_new(type, args, kwds);
2053 /* Fetch object from freelist and revive it */
2054 self = memerrors_freelist;
2055 self->args = PyTuple_New(0);
2056 /* This shouldn't happen since the empty tuple is persistent */
2057 if (self->args == NULL)
2058 return NULL;
2059 memerrors_freelist = (PyBaseExceptionObject *) self->dict;
2060 memerrors_numfree--;
2061 self->dict = NULL;
2062 _Py_NewReference((PyObject *)self);
2063 _PyObject_GC_TRACK(self);
2064 return (PyObject *)self;
2065}
2066
2067static void
2068MemoryError_dealloc(PyBaseExceptionObject *self)
2069{
2070 _PyObject_GC_UNTRACK(self);
2071 BaseException_clear(self);
2072 if (memerrors_numfree >= MEMERRORS_SAVE)
2073 Py_TYPE(self)->tp_free((PyObject *)self);
2074 else {
2075 self->dict = (PyObject *) memerrors_freelist;
2076 memerrors_freelist = self;
2077 memerrors_numfree++;
2078 }
2079}
2080
2081static void
2082preallocate_memerrors(void)
2083{
2084 /* We create enough MemoryErrors and then decref them, which will fill
2085 up the freelist. */
2086 int i;
2087 PyObject *errors[MEMERRORS_SAVE];
2088 for (i = 0; i < MEMERRORS_SAVE; i++) {
2089 errors[i] = MemoryError_new((PyTypeObject *) PyExc_MemoryError,
2090 NULL, NULL);
2091 if (!errors[i])
2092 Py_FatalError("Could not preallocate MemoryError object");
2093 }
2094 for (i = 0; i < MEMERRORS_SAVE; i++) {
2095 Py_DECREF(errors[i]);
2096 }
2097}
2098
2099static void
2100free_preallocated_memerrors(void)
2101{
2102 while (memerrors_freelist != NULL) {
2103 PyObject *self = (PyObject *) memerrors_freelist;
2104 memerrors_freelist = (PyBaseExceptionObject *) memerrors_freelist->dict;
2105 Py_TYPE(self)->tp_free((PyObject *)self);
2106 }
2107}
2108
2109
2110static PyTypeObject _PyExc_MemoryError = {
2111 PyVarObject_HEAD_INIT(NULL, 0)
2112 "MemoryError",
2113 sizeof(PyBaseExceptionObject),
2114 0, (destructor)MemoryError_dealloc, 0, 0, 0, 0, 0, 0, 0,
2115 0, 0, 0, 0, 0, 0, 0,
2116 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
2117 PyDoc_STR("Out of memory."), (traverseproc)BaseException_traverse,
2118 (inquiry)BaseException_clear, 0, 0, 0, 0, 0, 0, 0, &_PyExc_Exception,
2119 0, 0, 0, offsetof(PyBaseExceptionObject, dict),
2120 (initproc)BaseException_init, 0, MemoryError_new
2121};
2122PyObject *PyExc_MemoryError = (PyObject *) &_PyExc_MemoryError;
2123
Thomas Wouters477c8d52006-05-27 19:21:47 +00002124
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002125/*
2126 * BufferError extends Exception
2127 */
2128SimpleExtendsException(PyExc_Exception, BufferError, "Buffer error.");
2129
Thomas Wouters477c8d52006-05-27 19:21:47 +00002130
2131/* Warning category docstrings */
2132
2133/*
2134 * Warning extends Exception
2135 */
2136SimpleExtendsException(PyExc_Exception, Warning,
2137 "Base class for warning categories.");
2138
2139
2140/*
2141 * UserWarning extends Warning
2142 */
2143SimpleExtendsException(PyExc_Warning, UserWarning,
2144 "Base class for warnings generated by user code.");
2145
2146
2147/*
2148 * DeprecationWarning extends Warning
2149 */
2150SimpleExtendsException(PyExc_Warning, DeprecationWarning,
2151 "Base class for warnings about deprecated features.");
2152
2153
2154/*
2155 * PendingDeprecationWarning extends Warning
2156 */
2157SimpleExtendsException(PyExc_Warning, PendingDeprecationWarning,
2158 "Base class for warnings about features which will be deprecated\n"
2159 "in the future.");
2160
2161
2162/*
2163 * SyntaxWarning extends Warning
2164 */
2165SimpleExtendsException(PyExc_Warning, SyntaxWarning,
2166 "Base class for warnings about dubious syntax.");
2167
2168
2169/*
2170 * RuntimeWarning extends Warning
2171 */
2172SimpleExtendsException(PyExc_Warning, RuntimeWarning,
2173 "Base class for warnings about dubious runtime behavior.");
2174
2175
2176/*
2177 * FutureWarning extends Warning
2178 */
2179SimpleExtendsException(PyExc_Warning, FutureWarning,
2180 "Base class for warnings about constructs that will change semantically\n"
2181 "in the future.");
2182
2183
2184/*
2185 * ImportWarning extends Warning
2186 */
2187SimpleExtendsException(PyExc_Warning, ImportWarning,
2188 "Base class for warnings about probable mistakes in module imports");
2189
2190
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002191/*
2192 * UnicodeWarning extends Warning
2193 */
2194SimpleExtendsException(PyExc_Warning, UnicodeWarning,
2195 "Base class for warnings about Unicode related problems, mostly\n"
2196 "related to conversion problems.");
2197
Georg Brandl08be72d2010-10-24 15:11:22 +00002198
Guido van Rossum98297ee2007-11-06 21:34:58 +00002199/*
2200 * BytesWarning extends Warning
2201 */
2202SimpleExtendsException(PyExc_Warning, BytesWarning,
2203 "Base class for warnings about bytes and buffer related problems, mostly\n"
2204 "related to conversion from str or comparing to str.");
2205
2206
Georg Brandl08be72d2010-10-24 15:11:22 +00002207/*
2208 * ResourceWarning extends Warning
2209 */
2210SimpleExtendsException(PyExc_Warning, ResourceWarning,
2211 "Base class for warnings about resource usage.");
2212
2213
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002214
Thomas Wouters89d996e2007-09-08 17:39:28 +00002215/* Pre-computed RuntimeError instance for when recursion depth is reached.
2216 Meant to be used when normalizing the exception for exceeding the recursion
2217 depth will cause its own infinite recursion.
2218*/
2219PyObject *PyExc_RecursionErrorInst = NULL;
2220
Antoine Pitrou55f217f2012-01-18 21:23:13 +01002221#define PRE_INIT(TYPE) \
2222 if (!(_PyExc_ ## TYPE.tp_flags & Py_TPFLAGS_READY)) { \
2223 if (PyType_Ready(&_PyExc_ ## TYPE) < 0) \
2224 Py_FatalError("exceptions bootstrapping error."); \
2225 Py_INCREF(PyExc_ ## TYPE); \
2226 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002227
Antoine Pitrou55f217f2012-01-18 21:23:13 +01002228#define POST_INIT(TYPE) \
Thomas Wouters477c8d52006-05-27 19:21:47 +00002229 if (PyDict_SetItemString(bdict, # TYPE, PyExc_ ## TYPE)) \
2230 Py_FatalError("Module dictionary insertion problem.");
2231
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002232#define INIT_ALIAS(NAME, TYPE) Py_INCREF(PyExc_ ## TYPE); \
Antoine Pitrou8b0a74e2012-01-18 21:29:05 +01002233 Py_XDECREF(PyExc_ ## NAME); \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002234 PyExc_ ## NAME = PyExc_ ## TYPE; \
2235 if (PyDict_SetItemString(bdict, # NAME, PyExc_ ## NAME)) \
2236 Py_FatalError("Module dictionary insertion problem.");
2237
2238#define ADD_ERRNO(TYPE, CODE) { \
2239 PyObject *_code = PyLong_FromLong(CODE); \
2240 assert(_PyObject_RealIsSubclass(PyExc_ ## TYPE, PyExc_OSError)); \
2241 if (!_code || PyDict_SetItem(errnomap, _code, PyExc_ ## TYPE)) \
2242 Py_FatalError("errmap insertion problem."); \
Antoine Pitrou8b0a74e2012-01-18 21:29:05 +01002243 Py_DECREF(_code); \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002244 }
2245
2246#ifdef MS_WINDOWS
2247#include <Winsock2.h>
2248#if defined(WSAEALREADY) && !defined(EALREADY)
2249#define EALREADY WSAEALREADY
2250#endif
2251#if defined(WSAECONNABORTED) && !defined(ECONNABORTED)
2252#define ECONNABORTED WSAECONNABORTED
2253#endif
2254#if defined(WSAECONNREFUSED) && !defined(ECONNREFUSED)
2255#define ECONNREFUSED WSAECONNREFUSED
2256#endif
2257#if defined(WSAECONNRESET) && !defined(ECONNRESET)
2258#define ECONNRESET WSAECONNRESET
2259#endif
2260#if defined(WSAEINPROGRESS) && !defined(EINPROGRESS)
2261#define EINPROGRESS WSAEINPROGRESS
2262#endif
2263#if defined(WSAESHUTDOWN) && !defined(ESHUTDOWN)
2264#define ESHUTDOWN WSAESHUTDOWN
2265#endif
2266#if defined(WSAETIMEDOUT) && !defined(ETIMEDOUT)
2267#define ETIMEDOUT WSAETIMEDOUT
2268#endif
2269#if defined(WSAEWOULDBLOCK) && !defined(EWOULDBLOCK)
2270#define EWOULDBLOCK WSAEWOULDBLOCK
2271#endif
2272#endif /* MS_WINDOWS */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002273
Martin v. Löwis1a214512008-06-11 05:26:20 +00002274void
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002275_PyExc_Init(void)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002276{
Neal Norwitz2633c692007-02-26 22:22:47 +00002277 PyObject *bltinmod, *bdict;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002278
2279 PRE_INIT(BaseException)
2280 PRE_INIT(Exception)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002281 PRE_INIT(TypeError)
2282 PRE_INIT(StopIteration)
2283 PRE_INIT(GeneratorExit)
2284 PRE_INIT(SystemExit)
2285 PRE_INIT(KeyboardInterrupt)
2286 PRE_INIT(ImportError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002287 PRE_INIT(OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002288 PRE_INIT(EOFError)
2289 PRE_INIT(RuntimeError)
2290 PRE_INIT(NotImplementedError)
2291 PRE_INIT(NameError)
2292 PRE_INIT(UnboundLocalError)
2293 PRE_INIT(AttributeError)
2294 PRE_INIT(SyntaxError)
2295 PRE_INIT(IndentationError)
2296 PRE_INIT(TabError)
2297 PRE_INIT(LookupError)
2298 PRE_INIT(IndexError)
2299 PRE_INIT(KeyError)
2300 PRE_INIT(ValueError)
2301 PRE_INIT(UnicodeError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002302 PRE_INIT(UnicodeEncodeError)
2303 PRE_INIT(UnicodeDecodeError)
2304 PRE_INIT(UnicodeTranslateError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002305 PRE_INIT(AssertionError)
2306 PRE_INIT(ArithmeticError)
2307 PRE_INIT(FloatingPointError)
2308 PRE_INIT(OverflowError)
2309 PRE_INIT(ZeroDivisionError)
2310 PRE_INIT(SystemError)
2311 PRE_INIT(ReferenceError)
Neal Norwitzfaa54a32007-08-19 04:23:20 +00002312 PRE_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002313 PRE_INIT(MemoryError)
Benjamin Peterson2b968d62008-07-05 23:38:30 +00002314 PRE_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002315 PRE_INIT(Warning)
2316 PRE_INIT(UserWarning)
2317 PRE_INIT(DeprecationWarning)
2318 PRE_INIT(PendingDeprecationWarning)
2319 PRE_INIT(SyntaxWarning)
2320 PRE_INIT(RuntimeWarning)
2321 PRE_INIT(FutureWarning)
2322 PRE_INIT(ImportWarning)
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002323 PRE_INIT(UnicodeWarning)
Guido van Rossum98297ee2007-11-06 21:34:58 +00002324 PRE_INIT(BytesWarning)
Georg Brandl08be72d2010-10-24 15:11:22 +00002325 PRE_INIT(ResourceWarning)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002326
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002327 /* OSError subclasses */
2328 PRE_INIT(ConnectionError);
2329
2330 PRE_INIT(BlockingIOError);
2331 PRE_INIT(BrokenPipeError);
2332 PRE_INIT(ChildProcessError);
2333 PRE_INIT(ConnectionAbortedError);
2334 PRE_INIT(ConnectionRefusedError);
2335 PRE_INIT(ConnectionResetError);
2336 PRE_INIT(FileExistsError);
2337 PRE_INIT(FileNotFoundError);
2338 PRE_INIT(IsADirectoryError);
2339 PRE_INIT(NotADirectoryError);
2340 PRE_INIT(InterruptedError);
2341 PRE_INIT(PermissionError);
2342 PRE_INIT(ProcessLookupError);
2343 PRE_INIT(TimeoutError);
2344
Georg Brandl1a3284e2007-12-02 09:40:06 +00002345 bltinmod = PyImport_ImportModule("builtins");
Thomas Wouters477c8d52006-05-27 19:21:47 +00002346 if (bltinmod == NULL)
2347 Py_FatalError("exceptions bootstrapping error.");
2348 bdict = PyModule_GetDict(bltinmod);
2349 if (bdict == NULL)
2350 Py_FatalError("exceptions bootstrapping error.");
2351
2352 POST_INIT(BaseException)
2353 POST_INIT(Exception)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002354 POST_INIT(TypeError)
2355 POST_INIT(StopIteration)
2356 POST_INIT(GeneratorExit)
2357 POST_INIT(SystemExit)
2358 POST_INIT(KeyboardInterrupt)
2359 POST_INIT(ImportError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002360 POST_INIT(OSError)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002361 INIT_ALIAS(EnvironmentError, OSError)
2362 INIT_ALIAS(IOError, OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002363#ifdef MS_WINDOWS
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002364 INIT_ALIAS(WindowsError, OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002365#endif
2366#ifdef __VMS
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002367 INIT_ALIAS(VMSError, OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002368#endif
2369 POST_INIT(EOFError)
2370 POST_INIT(RuntimeError)
2371 POST_INIT(NotImplementedError)
2372 POST_INIT(NameError)
2373 POST_INIT(UnboundLocalError)
2374 POST_INIT(AttributeError)
2375 POST_INIT(SyntaxError)
2376 POST_INIT(IndentationError)
2377 POST_INIT(TabError)
2378 POST_INIT(LookupError)
2379 POST_INIT(IndexError)
2380 POST_INIT(KeyError)
2381 POST_INIT(ValueError)
2382 POST_INIT(UnicodeError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002383 POST_INIT(UnicodeEncodeError)
2384 POST_INIT(UnicodeDecodeError)
2385 POST_INIT(UnicodeTranslateError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002386 POST_INIT(AssertionError)
2387 POST_INIT(ArithmeticError)
2388 POST_INIT(FloatingPointError)
2389 POST_INIT(OverflowError)
2390 POST_INIT(ZeroDivisionError)
2391 POST_INIT(SystemError)
2392 POST_INIT(ReferenceError)
Neal Norwitzfaa54a32007-08-19 04:23:20 +00002393 POST_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002394 POST_INIT(MemoryError)
Benjamin Peterson2b968d62008-07-05 23:38:30 +00002395 POST_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002396 POST_INIT(Warning)
2397 POST_INIT(UserWarning)
2398 POST_INIT(DeprecationWarning)
2399 POST_INIT(PendingDeprecationWarning)
2400 POST_INIT(SyntaxWarning)
2401 POST_INIT(RuntimeWarning)
2402 POST_INIT(FutureWarning)
2403 POST_INIT(ImportWarning)
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002404 POST_INIT(UnicodeWarning)
Guido van Rossum98297ee2007-11-06 21:34:58 +00002405 POST_INIT(BytesWarning)
Georg Brandl08be72d2010-10-24 15:11:22 +00002406 POST_INIT(ResourceWarning)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002407
Antoine Pitrouac456a12012-01-18 21:35:21 +01002408 if (!errnomap) {
2409 errnomap = PyDict_New();
2410 if (!errnomap)
2411 Py_FatalError("Cannot allocate map from errnos to OSError subclasses");
2412 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002413
2414 /* OSError subclasses */
2415 POST_INIT(ConnectionError);
2416
2417 POST_INIT(BlockingIOError);
2418 ADD_ERRNO(BlockingIOError, EAGAIN);
2419 ADD_ERRNO(BlockingIOError, EALREADY);
2420 ADD_ERRNO(BlockingIOError, EINPROGRESS);
2421 ADD_ERRNO(BlockingIOError, EWOULDBLOCK);
2422 POST_INIT(BrokenPipeError);
2423 ADD_ERRNO(BrokenPipeError, EPIPE);
2424 ADD_ERRNO(BrokenPipeError, ESHUTDOWN);
2425 POST_INIT(ChildProcessError);
2426 ADD_ERRNO(ChildProcessError, ECHILD);
2427 POST_INIT(ConnectionAbortedError);
2428 ADD_ERRNO(ConnectionAbortedError, ECONNABORTED);
2429 POST_INIT(ConnectionRefusedError);
2430 ADD_ERRNO(ConnectionRefusedError, ECONNREFUSED);
2431 POST_INIT(ConnectionResetError);
2432 ADD_ERRNO(ConnectionResetError, ECONNRESET);
2433 POST_INIT(FileExistsError);
2434 ADD_ERRNO(FileExistsError, EEXIST);
2435 POST_INIT(FileNotFoundError);
2436 ADD_ERRNO(FileNotFoundError, ENOENT);
2437 POST_INIT(IsADirectoryError);
2438 ADD_ERRNO(IsADirectoryError, EISDIR);
2439 POST_INIT(NotADirectoryError);
2440 ADD_ERRNO(NotADirectoryError, ENOTDIR);
2441 POST_INIT(InterruptedError);
2442 ADD_ERRNO(InterruptedError, EINTR);
2443 POST_INIT(PermissionError);
2444 ADD_ERRNO(PermissionError, EACCES);
2445 ADD_ERRNO(PermissionError, EPERM);
2446 POST_INIT(ProcessLookupError);
2447 ADD_ERRNO(ProcessLookupError, ESRCH);
2448 POST_INIT(TimeoutError);
2449 ADD_ERRNO(TimeoutError, ETIMEDOUT);
2450
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002451 preallocate_memerrors();
Thomas Wouters477c8d52006-05-27 19:21:47 +00002452
Antoine Pitrou1c7ade52012-01-18 16:13:31 +01002453 if (!PyExc_RecursionErrorInst) {
2454 PyExc_RecursionErrorInst = BaseException_new(&_PyExc_RuntimeError, NULL, NULL);
2455 if (!PyExc_RecursionErrorInst)
2456 Py_FatalError("Cannot pre-allocate RuntimeError instance for "
2457 "recursion errors");
2458 else {
2459 PyBaseExceptionObject *err_inst =
2460 (PyBaseExceptionObject *)PyExc_RecursionErrorInst;
2461 PyObject *args_tuple;
2462 PyObject *exc_message;
2463 exc_message = PyUnicode_FromString("maximum recursion depth exceeded");
2464 if (!exc_message)
2465 Py_FatalError("cannot allocate argument for RuntimeError "
2466 "pre-allocation");
2467 args_tuple = PyTuple_Pack(1, exc_message);
2468 if (!args_tuple)
2469 Py_FatalError("cannot allocate tuple for RuntimeError "
2470 "pre-allocation");
2471 Py_DECREF(exc_message);
2472 if (BaseException_init(err_inst, args_tuple, NULL))
2473 Py_FatalError("init of pre-allocated RuntimeError failed");
2474 Py_DECREF(args_tuple);
2475 }
Thomas Wouters89d996e2007-09-08 17:39:28 +00002476 }
Benjamin Petersonefe7c9d2012-02-10 08:46:54 -05002477 Py_DECREF(bltinmod);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002478}
2479
2480void
2481_PyExc_Fini(void)
2482{
Benjamin Peterson78565b22009-06-28 19:19:51 +00002483 Py_CLEAR(PyExc_RecursionErrorInst);
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002484 free_preallocated_memerrors();
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002485 Py_CLEAR(errnomap);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002486}