blob: fc299f599e6fdc09f8b08859eac932e3835c20e0 [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);
230 if (!seq) return -1;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000231 Py_CLEAR(self->args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000232 self->args = seq;
233 return 0;
234}
235
Collin Winter828f04a2007-08-31 00:04:24 +0000236static PyObject *
237BaseException_get_tb(PyBaseExceptionObject *self)
238{
239 if (self->traceback == NULL) {
240 Py_INCREF(Py_None);
241 return Py_None;
242 }
243 Py_INCREF(self->traceback);
244 return self->traceback;
245}
246
247static int
248BaseException_set_tb(PyBaseExceptionObject *self, PyObject *tb)
249{
250 if (tb == NULL) {
251 PyErr_SetString(PyExc_TypeError, "__traceback__ may not be deleted");
252 return -1;
253 }
254 else if (!(tb == Py_None || PyTraceBack_Check(tb))) {
255 PyErr_SetString(PyExc_TypeError,
256 "__traceback__ must be a traceback or None");
257 return -1;
258 }
259
260 Py_XINCREF(tb);
261 Py_XDECREF(self->traceback);
262 self->traceback = tb;
263 return 0;
264}
265
Georg Brandlab6f2f62009-03-31 04:16:10 +0000266static PyObject *
267BaseException_get_context(PyObject *self) {
268 PyObject *res = PyException_GetContext(self);
269 if (res) return res; /* new reference already returned above */
270 Py_RETURN_NONE;
271}
272
273static int
274BaseException_set_context(PyObject *self, PyObject *arg) {
275 if (arg == NULL) {
276 PyErr_SetString(PyExc_TypeError, "__context__ may not be deleted");
277 return -1;
278 } else if (arg == Py_None) {
279 arg = NULL;
280 } else if (!PyExceptionInstance_Check(arg)) {
281 PyErr_SetString(PyExc_TypeError, "exception context must be None "
282 "or derive from BaseException");
283 return -1;
284 } else {
285 /* PyException_SetContext steals this reference */
286 Py_INCREF(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000287 }
Georg Brandlab6f2f62009-03-31 04:16:10 +0000288 PyException_SetContext(self, arg);
289 return 0;
290}
291
292static PyObject *
293BaseException_get_cause(PyObject *self) {
294 PyObject *res = PyException_GetCause(self);
295 if (res) return res; /* new reference already returned above */
296 Py_RETURN_NONE;
297}
298
299static int
300BaseException_set_cause(PyObject *self, PyObject *arg) {
301 if (arg == NULL) {
302 PyErr_SetString(PyExc_TypeError, "__cause__ may not be deleted");
303 return -1;
304 } else if (arg == Py_None) {
305 arg = NULL;
306 } else if (!PyExceptionInstance_Check(arg)) {
307 PyErr_SetString(PyExc_TypeError, "exception cause must be None "
308 "or derive from BaseException");
309 return -1;
310 } else {
311 /* PyException_SetCause steals this reference */
312 Py_INCREF(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000313 }
Georg Brandlab6f2f62009-03-31 04:16:10 +0000314 PyException_SetCause(self, arg);
315 return 0;
316}
317
Guido van Rossum360e4b82007-05-14 22:51:27 +0000318
Thomas Wouters477c8d52006-05-27 19:21:47 +0000319static PyGetSetDef BaseException_getset[] = {
320 {"__dict__", (getter)BaseException_get_dict, (setter)BaseException_set_dict},
321 {"args", (getter)BaseException_get_args, (setter)BaseException_set_args},
Collin Winter828f04a2007-08-31 00:04:24 +0000322 {"__traceback__", (getter)BaseException_get_tb, (setter)BaseException_set_tb},
Georg Brandlab6f2f62009-03-31 04:16:10 +0000323 {"__context__", (getter)BaseException_get_context,
324 (setter)BaseException_set_context, PyDoc_STR("exception context")},
325 {"__cause__", (getter)BaseException_get_cause,
326 (setter)BaseException_set_cause, PyDoc_STR("exception cause")},
Thomas Wouters477c8d52006-05-27 19:21:47 +0000327 {NULL},
328};
329
330
Collin Winter828f04a2007-08-31 00:04:24 +0000331PyObject *
332PyException_GetTraceback(PyObject *self) {
333 PyBaseExceptionObject *base_self = (PyBaseExceptionObject *)self;
334 Py_XINCREF(base_self->traceback);
335 return base_self->traceback;
336}
337
338
339int
340PyException_SetTraceback(PyObject *self, PyObject *tb) {
341 return BaseException_set_tb((PyBaseExceptionObject *)self, tb);
342}
343
344PyObject *
345PyException_GetCause(PyObject *self) {
346 PyObject *cause = ((PyBaseExceptionObject *)self)->cause;
347 Py_XINCREF(cause);
348 return cause;
349}
350
351/* Steals a reference to cause */
352void
353PyException_SetCause(PyObject *self, PyObject *cause) {
354 PyObject *old_cause = ((PyBaseExceptionObject *)self)->cause;
355 ((PyBaseExceptionObject *)self)->cause = cause;
356 Py_XDECREF(old_cause);
357}
358
359PyObject *
360PyException_GetContext(PyObject *self) {
361 PyObject *context = ((PyBaseExceptionObject *)self)->context;
362 Py_XINCREF(context);
363 return context;
364}
365
366/* Steals a reference to context */
367void
368PyException_SetContext(PyObject *self, PyObject *context) {
369 PyObject *old_context = ((PyBaseExceptionObject *)self)->context;
370 ((PyBaseExceptionObject *)self)->context = context;
371 Py_XDECREF(old_context);
372}
373
374
Thomas Wouters477c8d52006-05-27 19:21:47 +0000375static PyTypeObject _PyExc_BaseException = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000376 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +0000377 "BaseException", /*tp_name*/
Thomas Wouters477c8d52006-05-27 19:21:47 +0000378 sizeof(PyBaseExceptionObject), /*tp_basicsize*/
379 0, /*tp_itemsize*/
380 (destructor)BaseException_dealloc, /*tp_dealloc*/
381 0, /*tp_print*/
382 0, /*tp_getattr*/
383 0, /*tp_setattr*/
Mark Dickinsone94c6792009-02-02 20:36:42 +0000384 0, /* tp_reserved; */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000385 (reprfunc)BaseException_repr, /*tp_repr*/
386 0, /*tp_as_number*/
Brett Cannonba7bf492007-02-27 00:15:55 +0000387 0, /*tp_as_sequence*/
Thomas Wouters477c8d52006-05-27 19:21:47 +0000388 0, /*tp_as_mapping*/
389 0, /*tp_hash */
390 0, /*tp_call*/
391 (reprfunc)BaseException_str, /*tp_str*/
392 PyObject_GenericGetAttr, /*tp_getattro*/
393 PyObject_GenericSetAttr, /*tp_setattro*/
394 0, /*tp_as_buffer*/
Thomas Wouters27d517b2007-02-25 20:39:11 +0000395 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC |
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000396 Py_TPFLAGS_BASE_EXC_SUBCLASS, /*tp_flags*/
Thomas Wouters477c8d52006-05-27 19:21:47 +0000397 PyDoc_STR("Common base class for all exceptions"), /* tp_doc */
398 (traverseproc)BaseException_traverse, /* tp_traverse */
399 (inquiry)BaseException_clear, /* tp_clear */
400 0, /* tp_richcompare */
401 0, /* tp_weaklistoffset */
402 0, /* tp_iter */
403 0, /* tp_iternext */
404 BaseException_methods, /* tp_methods */
Georg Brandlab6f2f62009-03-31 04:16:10 +0000405 0, /* tp_members */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000406 BaseException_getset, /* tp_getset */
407 0, /* tp_base */
408 0, /* tp_dict */
409 0, /* tp_descr_get */
410 0, /* tp_descr_set */
411 offsetof(PyBaseExceptionObject, dict), /* tp_dictoffset */
412 (initproc)BaseException_init, /* tp_init */
413 0, /* tp_alloc */
414 BaseException_new, /* tp_new */
415};
416/* the CPython API expects exceptions to be (PyObject *) - both a hold-over
417from the previous implmentation and also allowing Python objects to be used
418in the API */
419PyObject *PyExc_BaseException = (PyObject *)&_PyExc_BaseException;
420
421/* note these macros omit the last semicolon so the macro invocation may
422 * include it and not look strange.
423 */
424#define SimpleExtendsException(EXCBASE, EXCNAME, EXCDOC) \
425static PyTypeObject _PyExc_ ## EXCNAME = { \
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000426 PyVarObject_HEAD_INIT(NULL, 0) \
Neal Norwitz2633c692007-02-26 22:22:47 +0000427 # EXCNAME, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000428 sizeof(PyBaseExceptionObject), \
429 0, (destructor)BaseException_dealloc, 0, 0, 0, 0, 0, 0, 0, \
430 0, 0, 0, 0, 0, 0, 0, \
431 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
432 PyDoc_STR(EXCDOC), (traverseproc)BaseException_traverse, \
433 (inquiry)BaseException_clear, 0, 0, 0, 0, 0, 0, 0, &_ ## EXCBASE, \
434 0, 0, 0, offsetof(PyBaseExceptionObject, dict), \
435 (initproc)BaseException_init, 0, BaseException_new,\
436}; \
437PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
438
439#define MiddlingExtendsException(EXCBASE, EXCNAME, EXCSTORE, EXCDOC) \
440static PyTypeObject _PyExc_ ## EXCNAME = { \
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000441 PyVarObject_HEAD_INIT(NULL, 0) \
Neal Norwitz2633c692007-02-26 22:22:47 +0000442 # EXCNAME, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000443 sizeof(Py ## EXCSTORE ## Object), \
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000444 0, (destructor)EXCSTORE ## _dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000445 0, 0, 0, 0, 0, \
446 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000447 PyDoc_STR(EXCDOC), (traverseproc)EXCSTORE ## _traverse, \
448 (inquiry)EXCSTORE ## _clear, 0, 0, 0, 0, 0, 0, 0, &_ ## EXCBASE, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000449 0, 0, 0, offsetof(Py ## EXCSTORE ## Object, dict), \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200450 (initproc)EXCSTORE ## _init, 0, 0, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000451}; \
452PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
453
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200454#define ComplexExtendsException(EXCBASE, EXCNAME, EXCSTORE, EXCNEW, \
455 EXCMETHODS, EXCMEMBERS, EXCGETSET, \
456 EXCSTR, EXCDOC) \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000457static PyTypeObject _PyExc_ ## EXCNAME = { \
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000458 PyVarObject_HEAD_INIT(NULL, 0) \
Neal Norwitz2633c692007-02-26 22:22:47 +0000459 # EXCNAME, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000460 sizeof(Py ## EXCSTORE ## Object), 0, \
461 (destructor)EXCSTORE ## _dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
462 (reprfunc)EXCSTR, 0, 0, 0, \
463 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
464 PyDoc_STR(EXCDOC), (traverseproc)EXCSTORE ## _traverse, \
465 (inquiry)EXCSTORE ## _clear, 0, 0, 0, 0, EXCMETHODS, \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200466 EXCMEMBERS, EXCGETSET, &_ ## EXCBASE, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000467 0, 0, 0, offsetof(Py ## EXCSTORE ## Object, dict), \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200468 (initproc)EXCSTORE ## _init, 0, EXCNEW,\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000469}; \
470PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
471
472
473/*
474 * Exception extends BaseException
475 */
476SimpleExtendsException(PyExc_BaseException, Exception,
477 "Common base class for all non-exit exceptions.");
478
479
480/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000481 * TypeError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +0000482 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000483SimpleExtendsException(PyExc_Exception, TypeError,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000484 "Inappropriate argument type.");
485
486
487/*
488 * StopIteration extends Exception
489 */
Nick Coghlan1f7ce622012-01-13 21:43:40 +1000490
491static PyMemberDef StopIteration_members[] = {
492 {"value", T_OBJECT, offsetof(PyStopIterationObject, value), 0,
493 PyDoc_STR("generator return value")},
494 {NULL} /* Sentinel */
495};
496
497static int
498StopIteration_init(PyStopIterationObject *self, PyObject *args, PyObject *kwds)
499{
500 Py_ssize_t size = PyTuple_GET_SIZE(args);
501 PyObject *value;
502
503 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
504 return -1;
505 Py_CLEAR(self->value);
506 if (size > 0)
507 value = PyTuple_GET_ITEM(args, 0);
508 else
509 value = Py_None;
510 Py_INCREF(value);
511 self->value = value;
512 return 0;
513}
514
515static int
516StopIteration_clear(PyStopIterationObject *self)
517{
518 Py_CLEAR(self->value);
519 return BaseException_clear((PyBaseExceptionObject *)self);
520}
521
522static void
523StopIteration_dealloc(PyStopIterationObject *self)
524{
525 _PyObject_GC_UNTRACK(self);
526 StopIteration_clear(self);
527 Py_TYPE(self)->tp_free((PyObject *)self);
528}
529
530static int
531StopIteration_traverse(PyStopIterationObject *self, visitproc visit, void *arg)
532{
533 Py_VISIT(self->value);
534 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
535}
536
537PyObject *
538PyStopIteration_Create(PyObject *value)
539{
540 return PyObject_CallFunctionObjArgs(PyExc_StopIteration, value, NULL);
541}
542
543ComplexExtendsException(
544 PyExc_Exception, /* base */
545 StopIteration, /* name */
546 StopIteration, /* prefix for *_init, etc */
547 0, /* new */
548 0, /* methods */
549 StopIteration_members, /* members */
550 0, /* getset */
551 0, /* str */
552 "Signal the end from iterator.__next__()."
553);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000554
555
556/*
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000557 * GeneratorExit extends BaseException
Thomas Wouters477c8d52006-05-27 19:21:47 +0000558 */
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000559SimpleExtendsException(PyExc_BaseException, GeneratorExit,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000560 "Request that a generator exit.");
561
562
563/*
564 * SystemExit extends BaseException
565 */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000566
567static int
568SystemExit_init(PySystemExitObject *self, PyObject *args, PyObject *kwds)
569{
570 Py_ssize_t size = PyTuple_GET_SIZE(args);
571
572 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
573 return -1;
574
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000575 if (size == 0)
576 return 0;
577 Py_CLEAR(self->code);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000578 if (size == 1)
579 self->code = PyTuple_GET_ITEM(args, 0);
Victor Stinner92236e52011-05-26 14:25:54 +0200580 else /* size > 1 */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000581 self->code = args;
582 Py_INCREF(self->code);
583 return 0;
584}
585
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000586static int
Thomas Wouters477c8d52006-05-27 19:21:47 +0000587SystemExit_clear(PySystemExitObject *self)
588{
589 Py_CLEAR(self->code);
590 return BaseException_clear((PyBaseExceptionObject *)self);
591}
592
593static void
594SystemExit_dealloc(PySystemExitObject *self)
595{
Thomas Wouters89f507f2006-12-13 04:49:30 +0000596 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000597 SystemExit_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +0000598 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000599}
600
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000601static int
Thomas Wouters477c8d52006-05-27 19:21:47 +0000602SystemExit_traverse(PySystemExitObject *self, visitproc visit, void *arg)
603{
604 Py_VISIT(self->code);
605 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
606}
607
608static PyMemberDef SystemExit_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +0000609 {"code", T_OBJECT, offsetof(PySystemExitObject, code), 0,
610 PyDoc_STR("exception code")},
611 {NULL} /* Sentinel */
612};
613
614ComplexExtendsException(PyExc_BaseException, SystemExit, SystemExit,
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200615 0, 0, SystemExit_members, 0, 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000616 "Request to exit from the interpreter.");
617
618/*
619 * KeyboardInterrupt extends BaseException
620 */
621SimpleExtendsException(PyExc_BaseException, KeyboardInterrupt,
622 "Program interrupted by user.");
623
624
625/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000626 * ImportError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +0000627 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000628SimpleExtendsException(PyExc_Exception, ImportError,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000629 "Import can't find module, or can't find name in module.");
630
631
632/*
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200633 * OSError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +0000634 */
635
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200636#ifdef MS_WINDOWS
637#include "errmap.h"
638#endif
639
Thomas Wouters477c8d52006-05-27 19:21:47 +0000640/* Where a function has a single filename, such as open() or some
641 * of the os module functions, PyErr_SetFromErrnoWithFilename() is
642 * called, giving a third argument which is the filename. But, so
643 * that old code using in-place unpacking doesn't break, e.g.:
644 *
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200645 * except OSError, (errno, strerror):
Thomas Wouters477c8d52006-05-27 19:21:47 +0000646 *
647 * we hack args so that it only contains two items. This also
648 * means we need our own __str__() which prints out the filename
649 * when it was supplied.
650 */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200651
Antoine Pitroue0e27352011-12-15 14:31:28 +0100652/* This function doesn't cleanup on error, the caller should */
653static int
654oserror_parse_args(PyObject **p_args,
655 PyObject **myerrno, PyObject **strerror,
656 PyObject **filename
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200657#ifdef MS_WINDOWS
Antoine Pitroue0e27352011-12-15 14:31:28 +0100658 , PyObject **winerror
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200659#endif
Antoine Pitroue0e27352011-12-15 14:31:28 +0100660 )
661{
662 Py_ssize_t nargs;
663 PyObject *args = *p_args;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000664
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200665 nargs = PyTuple_GET_SIZE(args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000666
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200667#ifdef MS_WINDOWS
668 if (nargs >= 2 && nargs <= 4) {
669 if (!PyArg_UnpackTuple(args, "OSError", 2, 4,
Antoine Pitroue0e27352011-12-15 14:31:28 +0100670 myerrno, strerror, filename, winerror))
671 return -1;
672 if (*winerror && PyLong_Check(*winerror)) {
673 long errcode, winerrcode;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200674 PyObject *newargs;
675 Py_ssize_t i;
676
Antoine Pitroue0e27352011-12-15 14:31:28 +0100677 winerrcode = PyLong_AsLong(*winerror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200678 if (winerrcode == -1 && PyErr_Occurred())
Antoine Pitroue0e27352011-12-15 14:31:28 +0100679 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200680 /* Set errno to the corresponding POSIX errno (overriding
681 first argument). Windows Socket error codes (>= 10000)
682 have the same value as their POSIX counterparts.
683 */
684 if (winerrcode < 10000)
685 errcode = winerror_to_errno(winerrcode);
686 else
687 errcode = winerrcode;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100688 *myerrno = PyLong_FromLong(errcode);
689 if (!*myerrno)
690 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200691 newargs = PyTuple_New(nargs);
692 if (!newargs)
Antoine Pitroue0e27352011-12-15 14:31:28 +0100693 return -1;
694 PyTuple_SET_ITEM(newargs, 0, *myerrno);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200695 for (i = 1; i < nargs; i++) {
696 PyObject *val = PyTuple_GET_ITEM(args, i);
697 Py_INCREF(val);
698 PyTuple_SET_ITEM(newargs, i, val);
699 }
700 Py_DECREF(args);
Antoine Pitroue0e27352011-12-15 14:31:28 +0100701 args = *p_args = newargs;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200702 }
703 }
704#else
705 if (nargs >= 2 && nargs <= 3) {
706 if (!PyArg_UnpackTuple(args, "OSError", 2, 3,
Antoine Pitroue0e27352011-12-15 14:31:28 +0100707 myerrno, strerror, filename))
708 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200709 }
710#endif
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000711
Antoine Pitroue0e27352011-12-15 14:31:28 +0100712 return 0;
713}
Thomas Wouters477c8d52006-05-27 19:21:47 +0000714
Antoine Pitroue0e27352011-12-15 14:31:28 +0100715static int
716oserror_init(PyOSErrorObject *self, PyObject **p_args,
717 PyObject *myerrno, PyObject *strerror,
718 PyObject *filename
719#ifdef MS_WINDOWS
720 , PyObject *winerror
721#endif
722 )
723{
724 PyObject *args = *p_args;
725 Py_ssize_t nargs = PyTuple_GET_SIZE(args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000726
727 /* self->filename will remain Py_None otherwise */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200728 if (filename && filename != Py_None) {
Antoine Pitroue0e27352011-12-15 14:31:28 +0100729 if (Py_TYPE(self) == (PyTypeObject *) PyExc_BlockingIOError &&
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200730 PyNumber_Check(filename)) {
731 /* BlockingIOError's 3rd argument can be the number of
732 * characters written.
733 */
734 self->written = PyNumber_AsSsize_t(filename, PyExc_ValueError);
735 if (self->written == -1 && PyErr_Occurred())
Antoine Pitroue0e27352011-12-15 14:31:28 +0100736 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200737 }
738 else {
739 Py_INCREF(filename);
740 self->filename = filename;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000741
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200742 if (nargs >= 2 && nargs <= 3) {
743 /* filename is removed from the args tuple (for compatibility
744 purposes, see test_exceptions.py) */
Antoine Pitroue0e27352011-12-15 14:31:28 +0100745 PyObject *subslice = PyTuple_GetSlice(args, 0, 2);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200746 if (!subslice)
Antoine Pitroue0e27352011-12-15 14:31:28 +0100747 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000748
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200749 Py_DECREF(args); /* replacing args */
Antoine Pitroue0e27352011-12-15 14:31:28 +0100750 *p_args = args = subslice;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200751 }
752 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000753 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200754 Py_XINCREF(myerrno);
755 self->myerrno = myerrno;
756
757 Py_XINCREF(strerror);
758 self->strerror = strerror;
759
760#ifdef MS_WINDOWS
761 Py_XINCREF(winerror);
762 self->winerror = winerror;
763#endif
764
Antoine Pitroue0e27352011-12-15 14:31:28 +0100765 /* Steals the reference to args */
766 self->args = args;
767 args = NULL;
768
769 return 0;
770}
771
772static PyObject *
773OSError_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
774static int
775OSError_init(PyOSErrorObject *self, PyObject *args, PyObject *kwds);
776
777static int
778oserror_use_init(PyTypeObject *type)
779{
780 /* When __init__ is defined in a OSError subclass, we want any
781 extraneous argument to __new__ to be ignored. The only reasonable
782 solution, given __new__ takes a variable number of arguments,
783 is to defer arg parsing and initialization to __init__.
784
785 But when __new__ is overriden as well, it should call our __new__
786 with the right arguments.
787
788 (see http://bugs.python.org/issue12555#msg148829 )
789 */
790 if (type->tp_init != (initproc) OSError_init &&
791 type->tp_new == (newfunc) OSError_new) {
792 assert((PyObject *) type != PyExc_OSError);
793 return 1;
794 }
795 return 0;
796}
797
798static PyObject *
799OSError_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
800{
801 PyOSErrorObject *self = NULL;
802 PyObject *myerrno = NULL, *strerror = NULL, *filename = NULL;
803#ifdef MS_WINDOWS
804 PyObject *winerror = NULL;
805#endif
806
807 if (!oserror_use_init(type)) {
808 if (!_PyArg_NoKeywords(type->tp_name, kwds))
809 return NULL;
810
811 Py_INCREF(args);
812 if (oserror_parse_args(&args, &myerrno, &strerror, &filename
813#ifdef MS_WINDOWS
814 , &winerror
815#endif
816 ))
817 goto error;
818
819 if (myerrno && PyLong_Check(myerrno) &&
820 errnomap && (PyObject *) type == PyExc_OSError) {
821 PyObject *newtype;
822 newtype = PyDict_GetItem(errnomap, myerrno);
823 if (newtype) {
824 assert(PyType_Check(newtype));
825 type = (PyTypeObject *) newtype;
826 }
827 else if (PyErr_Occurred())
828 goto error;
829 }
830 }
831
832 self = (PyOSErrorObject *) type->tp_alloc(type, 0);
833 if (!self)
834 goto error;
835
836 self->dict = NULL;
837 self->traceback = self->cause = self->context = NULL;
838 self->written = -1;
839
840 if (!oserror_use_init(type)) {
841 if (oserror_init(self, &args, myerrno, strerror, filename
842#ifdef MS_WINDOWS
843 , winerror
844#endif
845 ))
846 goto error;
847 }
848
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200849 return (PyObject *) self;
850
851error:
852 Py_XDECREF(args);
853 Py_XDECREF(self);
854 return NULL;
855}
856
857static int
Antoine Pitroue0e27352011-12-15 14:31:28 +0100858OSError_init(PyOSErrorObject *self, PyObject *args, PyObject *kwds)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200859{
Antoine Pitroue0e27352011-12-15 14:31:28 +0100860 PyObject *myerrno = NULL, *strerror = NULL, *filename = NULL;
861#ifdef MS_WINDOWS
862 PyObject *winerror = NULL;
863#endif
864
865 if (!oserror_use_init(Py_TYPE(self)))
866 /* Everything already done in OSError_new */
867 return 0;
868
869 if (!_PyArg_NoKeywords(Py_TYPE(self)->tp_name, kwds))
870 return -1;
871
872 Py_INCREF(args);
873 if (oserror_parse_args(&args, &myerrno, &strerror, &filename
874#ifdef MS_WINDOWS
875 , &winerror
876#endif
877 ))
878 goto error;
879
880 if (oserror_init(self, &args, myerrno, strerror, filename
881#ifdef MS_WINDOWS
882 , winerror
883#endif
884 ))
885 goto error;
886
Thomas Wouters477c8d52006-05-27 19:21:47 +0000887 return 0;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100888
889error:
890 Py_XDECREF(args);
891 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000892}
893
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000894static int
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200895OSError_clear(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000896{
897 Py_CLEAR(self->myerrno);
898 Py_CLEAR(self->strerror);
899 Py_CLEAR(self->filename);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200900#ifdef MS_WINDOWS
901 Py_CLEAR(self->winerror);
902#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000903 return BaseException_clear((PyBaseExceptionObject *)self);
904}
905
906static void
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200907OSError_dealloc(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000908{
Thomas Wouters89f507f2006-12-13 04:49:30 +0000909 _PyObject_GC_UNTRACK(self);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200910 OSError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +0000911 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000912}
913
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000914static int
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200915OSError_traverse(PyOSErrorObject *self, visitproc visit,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000916 void *arg)
917{
918 Py_VISIT(self->myerrno);
919 Py_VISIT(self->strerror);
920 Py_VISIT(self->filename);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200921#ifdef MS_WINDOWS
922 Py_VISIT(self->winerror);
923#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000924 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
925}
926
927static PyObject *
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200928OSError_str(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000929{
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200930#ifdef MS_WINDOWS
931 /* If available, winerror has the priority over myerrno */
932 if (self->winerror && self->filename)
933 return PyUnicode_FromFormat("[Error %S] %S: %R",
934 self->winerror ? self->winerror: Py_None,
935 self->strerror ? self->strerror: Py_None,
936 self->filename);
937 if (self->winerror && self->strerror)
938 return PyUnicode_FromFormat("[Error %S] %S",
939 self->winerror ? self->winerror: Py_None,
940 self->strerror ? self->strerror: Py_None);
941#endif
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +0000942 if (self->filename)
943 return PyUnicode_FromFormat("[Errno %S] %S: %R",
944 self->myerrno ? self->myerrno: Py_None,
945 self->strerror ? self->strerror: Py_None,
946 self->filename);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200947 if (self->myerrno && self->strerror)
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +0000948 return PyUnicode_FromFormat("[Errno %S] %S",
949 self->myerrno ? self->myerrno: Py_None,
950 self->strerror ? self->strerror: Py_None);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200951 return BaseException_str((PyBaseExceptionObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000952}
953
Thomas Wouters477c8d52006-05-27 19:21:47 +0000954static PyObject *
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200955OSError_reduce(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000956{
957 PyObject *args = self->args;
958 PyObject *res = NULL, *tmp;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000959
Thomas Wouters477c8d52006-05-27 19:21:47 +0000960 /* self->args is only the first two real arguments if there was a
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200961 * file name given to OSError. */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000962 if (PyTuple_GET_SIZE(args) == 2 && self->filename) {
Thomas Wouters477c8d52006-05-27 19:21:47 +0000963 args = PyTuple_New(3);
964 if (!args) return NULL;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000965
966 tmp = PyTuple_GET_ITEM(self->args, 0);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000967 Py_INCREF(tmp);
968 PyTuple_SET_ITEM(args, 0, tmp);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000969
970 tmp = PyTuple_GET_ITEM(self->args, 1);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000971 Py_INCREF(tmp);
972 PyTuple_SET_ITEM(args, 1, tmp);
973
974 Py_INCREF(self->filename);
975 PyTuple_SET_ITEM(args, 2, self->filename);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000976 } else
Thomas Wouters477c8d52006-05-27 19:21:47 +0000977 Py_INCREF(args);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000978
979 if (self->dict)
Christian Heimes90aa7642007-12-19 02:45:37 +0000980 res = PyTuple_Pack(3, Py_TYPE(self), args, self->dict);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000981 else
Christian Heimes90aa7642007-12-19 02:45:37 +0000982 res = PyTuple_Pack(2, Py_TYPE(self), args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000983 Py_DECREF(args);
984 return res;
985}
986
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200987static PyObject *
988OSError_written_get(PyOSErrorObject *self, void *context)
989{
990 if (self->written == -1) {
991 PyErr_SetString(PyExc_AttributeError, "characters_written");
992 return NULL;
993 }
994 return PyLong_FromSsize_t(self->written);
995}
Thomas Wouters477c8d52006-05-27 19:21:47 +0000996
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200997static int
998OSError_written_set(PyOSErrorObject *self, PyObject *arg, void *context)
999{
1000 Py_ssize_t n;
1001 n = PyNumber_AsSsize_t(arg, PyExc_ValueError);
1002 if (n == -1 && PyErr_Occurred())
1003 return -1;
1004 self->written = n;
1005 return 0;
1006}
1007
1008static PyMemberDef OSError_members[] = {
1009 {"errno", T_OBJECT, offsetof(PyOSErrorObject, myerrno), 0,
1010 PyDoc_STR("POSIX exception code")},
1011 {"strerror", T_OBJECT, offsetof(PyOSErrorObject, strerror), 0,
1012 PyDoc_STR("exception strerror")},
1013 {"filename", T_OBJECT, offsetof(PyOSErrorObject, filename), 0,
1014 PyDoc_STR("exception filename")},
1015#ifdef MS_WINDOWS
1016 {"winerror", T_OBJECT, offsetof(PyOSErrorObject, winerror), 0,
1017 PyDoc_STR("Win32 exception code")},
1018#endif
1019 {NULL} /* Sentinel */
1020};
1021
1022static PyMethodDef OSError_methods[] = {
1023 {"__reduce__", (PyCFunction)OSError_reduce, METH_NOARGS},
Thomas Wouters477c8d52006-05-27 19:21:47 +00001024 {NULL}
1025};
1026
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001027static PyGetSetDef OSError_getset[] = {
1028 {"characters_written", (getter) OSError_written_get,
1029 (setter) OSError_written_set, NULL},
1030 {NULL}
1031};
1032
1033
1034ComplexExtendsException(PyExc_Exception, OSError,
1035 OSError, OSError_new,
1036 OSError_methods, OSError_members, OSError_getset,
1037 OSError_str,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001038 "Base class for I/O related errors.");
1039
1040
1041/*
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001042 * Various OSError subclasses
Thomas Wouters477c8d52006-05-27 19:21:47 +00001043 */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001044MiddlingExtendsException(PyExc_OSError, BlockingIOError, OSError,
1045 "I/O operation would block.");
1046MiddlingExtendsException(PyExc_OSError, ConnectionError, OSError,
1047 "Connection error.");
1048MiddlingExtendsException(PyExc_OSError, ChildProcessError, OSError,
1049 "Child process error.");
1050MiddlingExtendsException(PyExc_ConnectionError, BrokenPipeError, OSError,
1051 "Broken pipe.");
1052MiddlingExtendsException(PyExc_ConnectionError, ConnectionAbortedError, OSError,
1053 "Connection aborted.");
1054MiddlingExtendsException(PyExc_ConnectionError, ConnectionRefusedError, OSError,
1055 "Connection refused.");
1056MiddlingExtendsException(PyExc_ConnectionError, ConnectionResetError, OSError,
1057 "Connection reset.");
1058MiddlingExtendsException(PyExc_OSError, FileExistsError, OSError,
1059 "File already exists.");
1060MiddlingExtendsException(PyExc_OSError, FileNotFoundError, OSError,
1061 "File not found.");
1062MiddlingExtendsException(PyExc_OSError, IsADirectoryError, OSError,
1063 "Operation doesn't work on directories.");
1064MiddlingExtendsException(PyExc_OSError, NotADirectoryError, OSError,
1065 "Operation only works on directories.");
1066MiddlingExtendsException(PyExc_OSError, InterruptedError, OSError,
1067 "Interrupted by signal.");
1068MiddlingExtendsException(PyExc_OSError, PermissionError, OSError,
1069 "Not enough permissions.");
1070MiddlingExtendsException(PyExc_OSError, ProcessLookupError, OSError,
1071 "Process not found.");
1072MiddlingExtendsException(PyExc_OSError, TimeoutError, OSError,
1073 "Timeout expired.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001074
1075/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001076 * EOFError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001077 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001078SimpleExtendsException(PyExc_Exception, EOFError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001079 "Read beyond end of file.");
1080
1081
1082/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001083 * RuntimeError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001084 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001085SimpleExtendsException(PyExc_Exception, RuntimeError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001086 "Unspecified run-time error.");
1087
1088
1089/*
1090 * NotImplementedError extends RuntimeError
1091 */
1092SimpleExtendsException(PyExc_RuntimeError, NotImplementedError,
1093 "Method or function hasn't been implemented yet.");
1094
1095/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001096 * NameError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001097 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001098SimpleExtendsException(PyExc_Exception, NameError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001099 "Name not found globally.");
1100
1101/*
1102 * UnboundLocalError extends NameError
1103 */
1104SimpleExtendsException(PyExc_NameError, UnboundLocalError,
1105 "Local name referenced but not bound to a value.");
1106
1107/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001108 * AttributeError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001109 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001110SimpleExtendsException(PyExc_Exception, AttributeError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001111 "Attribute not found.");
1112
1113
1114/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001115 * SyntaxError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001116 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001117
1118static int
1119SyntaxError_init(PySyntaxErrorObject *self, PyObject *args, PyObject *kwds)
1120{
1121 PyObject *info = NULL;
1122 Py_ssize_t lenargs = PyTuple_GET_SIZE(args);
1123
1124 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1125 return -1;
1126
1127 if (lenargs >= 1) {
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001128 Py_CLEAR(self->msg);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001129 self->msg = PyTuple_GET_ITEM(args, 0);
1130 Py_INCREF(self->msg);
1131 }
1132 if (lenargs == 2) {
1133 info = PyTuple_GET_ITEM(args, 1);
1134 info = PySequence_Tuple(info);
1135 if (!info) return -1;
1136
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001137 if (PyTuple_GET_SIZE(info) != 4) {
1138 /* not a very good error message, but it's what Python 2.4 gives */
1139 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
1140 Py_DECREF(info);
1141 return -1;
1142 }
1143
1144 Py_CLEAR(self->filename);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001145 self->filename = PyTuple_GET_ITEM(info, 0);
1146 Py_INCREF(self->filename);
1147
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001148 Py_CLEAR(self->lineno);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001149 self->lineno = PyTuple_GET_ITEM(info, 1);
1150 Py_INCREF(self->lineno);
1151
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001152 Py_CLEAR(self->offset);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001153 self->offset = PyTuple_GET_ITEM(info, 2);
1154 Py_INCREF(self->offset);
1155
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001156 Py_CLEAR(self->text);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001157 self->text = PyTuple_GET_ITEM(info, 3);
1158 Py_INCREF(self->text);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001159
1160 Py_DECREF(info);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001161 }
1162 return 0;
1163}
1164
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001165static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001166SyntaxError_clear(PySyntaxErrorObject *self)
1167{
1168 Py_CLEAR(self->msg);
1169 Py_CLEAR(self->filename);
1170 Py_CLEAR(self->lineno);
1171 Py_CLEAR(self->offset);
1172 Py_CLEAR(self->text);
1173 Py_CLEAR(self->print_file_and_line);
1174 return BaseException_clear((PyBaseExceptionObject *)self);
1175}
1176
1177static void
1178SyntaxError_dealloc(PySyntaxErrorObject *self)
1179{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001180 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001181 SyntaxError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +00001182 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001183}
1184
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001185static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001186SyntaxError_traverse(PySyntaxErrorObject *self, visitproc visit, void *arg)
1187{
1188 Py_VISIT(self->msg);
1189 Py_VISIT(self->filename);
1190 Py_VISIT(self->lineno);
1191 Py_VISIT(self->offset);
1192 Py_VISIT(self->text);
1193 Py_VISIT(self->print_file_and_line);
1194 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1195}
1196
1197/* This is called "my_basename" instead of just "basename" to avoid name
1198 conflicts with glibc; basename is already prototyped if _GNU_SOURCE is
1199 defined, and Python does define that. */
Victor Stinner6237daf2010-04-28 17:26:19 +00001200static PyObject*
1201my_basename(PyObject *name)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001202{
Victor Stinner6237daf2010-04-28 17:26:19 +00001203 Py_ssize_t i, size, offset;
Victor Stinner31392e72011-10-05 20:14:23 +02001204 int kind;
1205 void *data;
1206
1207 if (PyUnicode_READY(name))
1208 return NULL;
1209 kind = PyUnicode_KIND(name);
1210 data = PyUnicode_DATA(name);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001211 size = PyUnicode_GET_LENGTH(name);
Victor Stinner6237daf2010-04-28 17:26:19 +00001212 offset = 0;
1213 for(i=0; i < size; i++) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001214 if (PyUnicode_READ(kind, data, i) == SEP)
Victor Stinner6237daf2010-04-28 17:26:19 +00001215 offset = i + 1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001216 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001217 if (offset != 0)
1218 return PyUnicode_Substring(name, offset, size);
1219 else {
Victor Stinner6237daf2010-04-28 17:26:19 +00001220 Py_INCREF(name);
1221 return name;
1222 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001223}
1224
1225
1226static PyObject *
1227SyntaxError_str(PySyntaxErrorObject *self)
1228{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001229 int have_lineno = 0;
Victor Stinner6237daf2010-04-28 17:26:19 +00001230 PyObject *filename;
1231 PyObject *result;
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001232 /* Below, we always ignore overflow errors, just printing -1.
1233 Still, we cannot allow an OverflowError to be raised, so
1234 we need to call PyLong_AsLongAndOverflow. */
1235 int overflow;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001236
1237 /* XXX -- do all the additional formatting with filename and
1238 lineno here */
1239
Neal Norwitzed2b7392007-08-26 04:51:10 +00001240 if (self->filename && PyUnicode_Check(self->filename)) {
Victor Stinner6237daf2010-04-28 17:26:19 +00001241 filename = my_basename(self->filename);
1242 if (filename == NULL)
1243 return NULL;
1244 } else {
1245 filename = NULL;
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001246 }
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001247 have_lineno = (self->lineno != NULL) && PyLong_CheckExact(self->lineno);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001248
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001249 if (!filename && !have_lineno)
Thomas Heller519a0422007-11-15 20:48:54 +00001250 return PyObject_Str(self->msg ? self->msg : Py_None);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001251
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001252 if (filename && have_lineno)
Victor Stinner6237daf2010-04-28 17:26:19 +00001253 result = PyUnicode_FromFormat("%S (%U, line %ld)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001254 self->msg ? self->msg : Py_None,
Victor Stinner6237daf2010-04-28 17:26:19 +00001255 filename,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001256 PyLong_AsLongAndOverflow(self->lineno, &overflow));
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001257 else if (filename)
Victor Stinner6237daf2010-04-28 17:26:19 +00001258 result = PyUnicode_FromFormat("%S (%U)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001259 self->msg ? self->msg : Py_None,
Victor Stinner6237daf2010-04-28 17:26:19 +00001260 filename);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001261 else /* only have_lineno */
Victor Stinner6237daf2010-04-28 17:26:19 +00001262 result = PyUnicode_FromFormat("%S (line %ld)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001263 self->msg ? self->msg : Py_None,
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001264 PyLong_AsLongAndOverflow(self->lineno, &overflow));
Victor Stinner6237daf2010-04-28 17:26:19 +00001265 Py_XDECREF(filename);
1266 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001267}
1268
1269static PyMemberDef SyntaxError_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +00001270 {"msg", T_OBJECT, offsetof(PySyntaxErrorObject, msg), 0,
1271 PyDoc_STR("exception msg")},
1272 {"filename", T_OBJECT, offsetof(PySyntaxErrorObject, filename), 0,
1273 PyDoc_STR("exception filename")},
1274 {"lineno", T_OBJECT, offsetof(PySyntaxErrorObject, lineno), 0,
1275 PyDoc_STR("exception lineno")},
1276 {"offset", T_OBJECT, offsetof(PySyntaxErrorObject, offset), 0,
1277 PyDoc_STR("exception offset")},
1278 {"text", T_OBJECT, offsetof(PySyntaxErrorObject, text), 0,
1279 PyDoc_STR("exception text")},
1280 {"print_file_and_line", T_OBJECT,
1281 offsetof(PySyntaxErrorObject, print_file_and_line), 0,
1282 PyDoc_STR("exception print_file_and_line")},
1283 {NULL} /* Sentinel */
1284};
1285
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001286ComplexExtendsException(PyExc_Exception, SyntaxError, SyntaxError,
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001287 0, 0, SyntaxError_members, 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001288 SyntaxError_str, "Invalid syntax.");
1289
1290
1291/*
1292 * IndentationError extends SyntaxError
1293 */
1294MiddlingExtendsException(PyExc_SyntaxError, IndentationError, SyntaxError,
1295 "Improper indentation.");
1296
1297
1298/*
1299 * TabError extends IndentationError
1300 */
1301MiddlingExtendsException(PyExc_IndentationError, TabError, SyntaxError,
1302 "Improper mixture of spaces and tabs.");
1303
1304
1305/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001306 * LookupError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001307 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001308SimpleExtendsException(PyExc_Exception, LookupError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001309 "Base class for lookup errors.");
1310
1311
1312/*
1313 * IndexError extends LookupError
1314 */
1315SimpleExtendsException(PyExc_LookupError, IndexError,
1316 "Sequence index out of range.");
1317
1318
1319/*
1320 * KeyError extends LookupError
1321 */
1322static PyObject *
1323KeyError_str(PyBaseExceptionObject *self)
1324{
1325 /* If args is a tuple of exactly one item, apply repr to args[0].
1326 This is done so that e.g. the exception raised by {}[''] prints
1327 KeyError: ''
1328 rather than the confusing
1329 KeyError
1330 alone. The downside is that if KeyError is raised with an explanatory
1331 string, that string will be displayed in quotes. Too bad.
1332 If args is anything else, use the default BaseException__str__().
1333 */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001334 if (PyTuple_GET_SIZE(self->args) == 1) {
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001335 return PyObject_Repr(PyTuple_GET_ITEM(self->args, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001336 }
1337 return BaseException_str(self);
1338}
1339
1340ComplexExtendsException(PyExc_LookupError, KeyError, BaseException,
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001341 0, 0, 0, 0, KeyError_str, "Mapping key not found.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001342
1343
1344/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001345 * ValueError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001346 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001347SimpleExtendsException(PyExc_Exception, ValueError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001348 "Inappropriate argument value (of correct type).");
1349
1350/*
1351 * UnicodeError extends ValueError
1352 */
1353
1354SimpleExtendsException(PyExc_ValueError, UnicodeError,
1355 "Unicode related error.");
1356
Thomas Wouters477c8d52006-05-27 19:21:47 +00001357static PyObject *
Guido van Rossum98297ee2007-11-06 21:34:58 +00001358get_string(PyObject *attr, const char *name)
Walter Dörwald612344f2007-05-04 19:28:21 +00001359{
1360 if (!attr) {
1361 PyErr_Format(PyExc_TypeError, "%.200s attribute not set", name);
1362 return NULL;
1363 }
1364
Christian Heimes72b710a2008-05-26 13:28:38 +00001365 if (!PyBytes_Check(attr)) {
Walter Dörwald612344f2007-05-04 19:28:21 +00001366 PyErr_Format(PyExc_TypeError, "%.200s attribute must be bytes", name);
1367 return NULL;
1368 }
1369 Py_INCREF(attr);
1370 return attr;
1371}
1372
1373static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00001374get_unicode(PyObject *attr, const char *name)
1375{
1376 if (!attr) {
1377 PyErr_Format(PyExc_TypeError, "%.200s attribute not set", name);
1378 return NULL;
1379 }
1380
1381 if (!PyUnicode_Check(attr)) {
1382 PyErr_Format(PyExc_TypeError,
1383 "%.200s attribute must be unicode", name);
1384 return NULL;
1385 }
1386 Py_INCREF(attr);
1387 return attr;
1388}
1389
Walter Dörwaldd2034312007-05-18 16:29:38 +00001390static int
1391set_unicodefromstring(PyObject **attr, const char *value)
1392{
1393 PyObject *obj = PyUnicode_FromString(value);
1394 if (!obj)
1395 return -1;
1396 Py_CLEAR(*attr);
1397 *attr = obj;
1398 return 0;
1399}
1400
Thomas Wouters477c8d52006-05-27 19:21:47 +00001401PyObject *
1402PyUnicodeEncodeError_GetEncoding(PyObject *exc)
1403{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001404 return get_unicode(((PyUnicodeErrorObject *)exc)->encoding, "encoding");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001405}
1406
1407PyObject *
1408PyUnicodeDecodeError_GetEncoding(PyObject *exc)
1409{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001410 return get_unicode(((PyUnicodeErrorObject *)exc)->encoding, "encoding");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001411}
1412
1413PyObject *
1414PyUnicodeEncodeError_GetObject(PyObject *exc)
1415{
1416 return get_unicode(((PyUnicodeErrorObject *)exc)->object, "object");
1417}
1418
1419PyObject *
1420PyUnicodeDecodeError_GetObject(PyObject *exc)
1421{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001422 return get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001423}
1424
1425PyObject *
1426PyUnicodeTranslateError_GetObject(PyObject *exc)
1427{
1428 return get_unicode(((PyUnicodeErrorObject *)exc)->object, "object");
1429}
1430
1431int
1432PyUnicodeEncodeError_GetStart(PyObject *exc, Py_ssize_t *start)
1433{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001434 Py_ssize_t size;
1435 PyObject *obj = get_unicode(((PyUnicodeErrorObject *)exc)->object,
1436 "object");
1437 if (!obj)
1438 return -1;
1439 *start = ((PyUnicodeErrorObject *)exc)->start;
Victor Stinner9e30aa52011-11-21 02:49:52 +01001440 size = PyUnicode_GET_LENGTH(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001441 if (*start<0)
1442 *start = 0; /*XXX check for values <0*/
1443 if (*start>=size)
1444 *start = size-1;
1445 Py_DECREF(obj);
1446 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001447}
1448
1449
1450int
1451PyUnicodeDecodeError_GetStart(PyObject *exc, Py_ssize_t *start)
1452{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001453 Py_ssize_t size;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001454 PyObject *obj = get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001455 if (!obj)
1456 return -1;
Christian Heimes72b710a2008-05-26 13:28:38 +00001457 size = PyBytes_GET_SIZE(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001458 *start = ((PyUnicodeErrorObject *)exc)->start;
1459 if (*start<0)
1460 *start = 0;
1461 if (*start>=size)
1462 *start = size-1;
1463 Py_DECREF(obj);
1464 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001465}
1466
1467
1468int
1469PyUnicodeTranslateError_GetStart(PyObject *exc, Py_ssize_t *start)
1470{
1471 return PyUnicodeEncodeError_GetStart(exc, start);
1472}
1473
1474
1475int
1476PyUnicodeEncodeError_SetStart(PyObject *exc, Py_ssize_t start)
1477{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001478 ((PyUnicodeErrorObject *)exc)->start = start;
1479 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001480}
1481
1482
1483int
1484PyUnicodeDecodeError_SetStart(PyObject *exc, Py_ssize_t start)
1485{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001486 ((PyUnicodeErrorObject *)exc)->start = start;
1487 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001488}
1489
1490
1491int
1492PyUnicodeTranslateError_SetStart(PyObject *exc, Py_ssize_t start)
1493{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001494 ((PyUnicodeErrorObject *)exc)->start = start;
1495 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001496}
1497
1498
1499int
1500PyUnicodeEncodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
1501{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001502 Py_ssize_t size;
1503 PyObject *obj = get_unicode(((PyUnicodeErrorObject *)exc)->object,
1504 "object");
1505 if (!obj)
1506 return -1;
1507 *end = ((PyUnicodeErrorObject *)exc)->end;
Victor Stinner9e30aa52011-11-21 02:49:52 +01001508 size = PyUnicode_GET_LENGTH(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001509 if (*end<1)
1510 *end = 1;
1511 if (*end>size)
1512 *end = size;
1513 Py_DECREF(obj);
1514 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001515}
1516
1517
1518int
1519PyUnicodeDecodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
1520{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001521 Py_ssize_t size;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001522 PyObject *obj = get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001523 if (!obj)
1524 return -1;
Christian Heimes72b710a2008-05-26 13:28:38 +00001525 size = PyBytes_GET_SIZE(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001526 *end = ((PyUnicodeErrorObject *)exc)->end;
1527 if (*end<1)
1528 *end = 1;
1529 if (*end>size)
1530 *end = size;
1531 Py_DECREF(obj);
1532 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001533}
1534
1535
1536int
1537PyUnicodeTranslateError_GetEnd(PyObject *exc, Py_ssize_t *start)
1538{
1539 return PyUnicodeEncodeError_GetEnd(exc, start);
1540}
1541
1542
1543int
1544PyUnicodeEncodeError_SetEnd(PyObject *exc, Py_ssize_t end)
1545{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001546 ((PyUnicodeErrorObject *)exc)->end = end;
1547 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001548}
1549
1550
1551int
1552PyUnicodeDecodeError_SetEnd(PyObject *exc, Py_ssize_t end)
1553{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001554 ((PyUnicodeErrorObject *)exc)->end = end;
1555 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001556}
1557
1558
1559int
1560PyUnicodeTranslateError_SetEnd(PyObject *exc, Py_ssize_t end)
1561{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001562 ((PyUnicodeErrorObject *)exc)->end = end;
1563 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001564}
1565
1566PyObject *
1567PyUnicodeEncodeError_GetReason(PyObject *exc)
1568{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001569 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001570}
1571
1572
1573PyObject *
1574PyUnicodeDecodeError_GetReason(PyObject *exc)
1575{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001576 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001577}
1578
1579
1580PyObject *
1581PyUnicodeTranslateError_GetReason(PyObject *exc)
1582{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001583 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001584}
1585
1586
1587int
1588PyUnicodeEncodeError_SetReason(PyObject *exc, const char *reason)
1589{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001590 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1591 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001592}
1593
1594
1595int
1596PyUnicodeDecodeError_SetReason(PyObject *exc, const char *reason)
1597{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001598 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1599 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001600}
1601
1602
1603int
1604PyUnicodeTranslateError_SetReason(PyObject *exc, const char *reason)
1605{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001606 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1607 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001608}
1609
1610
Thomas Wouters477c8d52006-05-27 19:21:47 +00001611static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001612UnicodeError_clear(PyUnicodeErrorObject *self)
1613{
1614 Py_CLEAR(self->encoding);
1615 Py_CLEAR(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001616 Py_CLEAR(self->reason);
1617 return BaseException_clear((PyBaseExceptionObject *)self);
1618}
1619
1620static void
1621UnicodeError_dealloc(PyUnicodeErrorObject *self)
1622{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001623 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001624 UnicodeError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +00001625 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001626}
1627
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001628static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001629UnicodeError_traverse(PyUnicodeErrorObject *self, visitproc visit, void *arg)
1630{
1631 Py_VISIT(self->encoding);
1632 Py_VISIT(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001633 Py_VISIT(self->reason);
1634 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1635}
1636
1637static PyMemberDef UnicodeError_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +00001638 {"encoding", T_OBJECT, offsetof(PyUnicodeErrorObject, encoding), 0,
1639 PyDoc_STR("exception encoding")},
1640 {"object", T_OBJECT, offsetof(PyUnicodeErrorObject, object), 0,
1641 PyDoc_STR("exception object")},
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001642 {"start", T_PYSSIZET, offsetof(PyUnicodeErrorObject, start), 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001643 PyDoc_STR("exception start")},
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001644 {"end", T_PYSSIZET, offsetof(PyUnicodeErrorObject, end), 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001645 PyDoc_STR("exception end")},
1646 {"reason", T_OBJECT, offsetof(PyUnicodeErrorObject, reason), 0,
1647 PyDoc_STR("exception reason")},
1648 {NULL} /* Sentinel */
1649};
1650
1651
1652/*
1653 * UnicodeEncodeError extends UnicodeError
1654 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001655
1656static int
1657UnicodeEncodeError_init(PyObject *self, PyObject *args, PyObject *kwds)
1658{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001659 PyUnicodeErrorObject *err;
1660
Thomas Wouters477c8d52006-05-27 19:21:47 +00001661 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1662 return -1;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001663
1664 err = (PyUnicodeErrorObject *)self;
1665
1666 Py_CLEAR(err->encoding);
1667 Py_CLEAR(err->object);
1668 Py_CLEAR(err->reason);
1669
1670 if (!PyArg_ParseTuple(args, "O!O!nnO!",
1671 &PyUnicode_Type, &err->encoding,
1672 &PyUnicode_Type, &err->object,
1673 &err->start,
1674 &err->end,
1675 &PyUnicode_Type, &err->reason)) {
1676 err->encoding = err->object = err->reason = NULL;
1677 return -1;
1678 }
1679
Martin v. Löwisb09af032011-11-04 11:16:41 +01001680 if (PyUnicode_READY(err->object) < -1) {
1681 err->encoding = NULL;
1682 return -1;
1683 }
1684
Guido van Rossum98297ee2007-11-06 21:34:58 +00001685 Py_INCREF(err->encoding);
1686 Py_INCREF(err->object);
1687 Py_INCREF(err->reason);
1688
1689 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001690}
1691
1692static PyObject *
1693UnicodeEncodeError_str(PyObject *self)
1694{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001695 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00001696 PyObject *result = NULL;
1697 PyObject *reason_str = NULL;
1698 PyObject *encoding_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001699
Eric Smith0facd772010-02-24 15:42:29 +00001700 /* Get reason and encoding as strings, which they might not be if
1701 they've been modified after we were contructed. */
1702 reason_str = PyObject_Str(uself->reason);
1703 if (reason_str == NULL)
1704 goto done;
1705 encoding_str = PyObject_Str(uself->encoding);
1706 if (encoding_str == NULL)
1707 goto done;
1708
Victor Stinnerda1ddf32011-11-20 22:50:23 +01001709 if (uself->start < PyUnicode_GET_LENGTH(uself->object) && uself->end == uself->start+1) {
1710 Py_UCS4 badchar = PyUnicode_ReadChar(uself->object, uself->start);
Walter Dörwald787b03b2007-06-05 13:29:29 +00001711 const char *fmt;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001712 if (badchar <= 0xff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00001713 fmt = "'%U' codec can't encode character '\\x%02x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001714 else if (badchar <= 0xffff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00001715 fmt = "'%U' codec can't encode character '\\u%04x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001716 else
Walter Dörwald32a4c712007-06-20 09:25:34 +00001717 fmt = "'%U' codec can't encode character '\\U%08x' in position %zd: %U";
Eric Smith0facd772010-02-24 15:42:29 +00001718 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00001719 fmt,
Eric Smith0facd772010-02-24 15:42:29 +00001720 encoding_str,
Victor Stinnerda1ddf32011-11-20 22:50:23 +01001721 (int)badchar,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001722 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00001723 reason_str);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001724 }
Eric Smith0facd772010-02-24 15:42:29 +00001725 else {
1726 result = PyUnicode_FromFormat(
1727 "'%U' codec can't encode characters in position %zd-%zd: %U",
1728 encoding_str,
1729 uself->start,
1730 uself->end-1,
1731 reason_str);
1732 }
1733done:
1734 Py_XDECREF(reason_str);
1735 Py_XDECREF(encoding_str);
1736 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001737}
1738
1739static PyTypeObject _PyExc_UnicodeEncodeError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001740 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00001741 "UnicodeEncodeError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00001742 sizeof(PyUnicodeErrorObject), 0,
1743 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1744 (reprfunc)UnicodeEncodeError_str, 0, 0, 0,
1745 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001746 PyDoc_STR("Unicode encoding error."), (traverseproc)UnicodeError_traverse,
1747 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001748 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001749 (initproc)UnicodeEncodeError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001750};
1751PyObject *PyExc_UnicodeEncodeError = (PyObject *)&_PyExc_UnicodeEncodeError;
1752
1753PyObject *
1754PyUnicodeEncodeError_Create(
1755 const char *encoding, const Py_UNICODE *object, Py_ssize_t length,
1756 Py_ssize_t start, Py_ssize_t end, const char *reason)
1757{
Victor Stinner7eeb5b52010-06-07 19:57:46 +00001758 return PyObject_CallFunction(PyExc_UnicodeEncodeError, "su#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001759 encoding, object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001760}
1761
1762
1763/*
1764 * UnicodeDecodeError extends UnicodeError
1765 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001766
1767static int
1768UnicodeDecodeError_init(PyObject *self, PyObject *args, PyObject *kwds)
1769{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001770 PyUnicodeErrorObject *ude;
1771 const char *data;
1772 Py_ssize_t size;
1773
Thomas Wouters477c8d52006-05-27 19:21:47 +00001774 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1775 return -1;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001776
1777 ude = (PyUnicodeErrorObject *)self;
1778
1779 Py_CLEAR(ude->encoding);
1780 Py_CLEAR(ude->object);
1781 Py_CLEAR(ude->reason);
1782
1783 if (!PyArg_ParseTuple(args, "O!OnnO!",
1784 &PyUnicode_Type, &ude->encoding,
1785 &ude->object,
1786 &ude->start,
1787 &ude->end,
1788 &PyUnicode_Type, &ude->reason)) {
1789 ude->encoding = ude->object = ude->reason = NULL;
1790 return -1;
1791 }
1792
Christian Heimes72b710a2008-05-26 13:28:38 +00001793 if (!PyBytes_Check(ude->object)) {
Guido van Rossum98297ee2007-11-06 21:34:58 +00001794 if (PyObject_AsReadBuffer(ude->object, (const void **)&data, &size)) {
1795 ude->encoding = ude->object = ude->reason = NULL;
1796 return -1;
1797 }
Christian Heimes72b710a2008-05-26 13:28:38 +00001798 ude->object = PyBytes_FromStringAndSize(data, size);
Guido van Rossum98297ee2007-11-06 21:34:58 +00001799 }
1800 else {
1801 Py_INCREF(ude->object);
1802 }
1803
1804 Py_INCREF(ude->encoding);
1805 Py_INCREF(ude->reason);
1806
1807 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001808}
1809
1810static PyObject *
1811UnicodeDecodeError_str(PyObject *self)
1812{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001813 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00001814 PyObject *result = NULL;
1815 PyObject *reason_str = NULL;
1816 PyObject *encoding_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001817
Eric Smith0facd772010-02-24 15:42:29 +00001818 /* Get reason and encoding as strings, which they might not be if
1819 they've been modified after we were contructed. */
1820 reason_str = PyObject_Str(uself->reason);
1821 if (reason_str == NULL)
1822 goto done;
1823 encoding_str = PyObject_Str(uself->encoding);
1824 if (encoding_str == NULL)
1825 goto done;
1826
1827 if (uself->start < PyBytes_GET_SIZE(uself->object) && uself->end == uself->start+1) {
Christian Heimes72b710a2008-05-26 13:28:38 +00001828 int byte = (int)(PyBytes_AS_STRING(((PyUnicodeErrorObject *)self)->object)[uself->start]&0xff);
Eric Smith0facd772010-02-24 15:42:29 +00001829 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00001830 "'%U' codec can't decode byte 0x%02x in position %zd: %U",
Eric Smith0facd772010-02-24 15:42:29 +00001831 encoding_str,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001832 byte,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001833 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00001834 reason_str);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001835 }
Eric Smith0facd772010-02-24 15:42:29 +00001836 else {
1837 result = PyUnicode_FromFormat(
1838 "'%U' codec can't decode bytes in position %zd-%zd: %U",
1839 encoding_str,
1840 uself->start,
1841 uself->end-1,
1842 reason_str
1843 );
1844 }
1845done:
1846 Py_XDECREF(reason_str);
1847 Py_XDECREF(encoding_str);
1848 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001849}
1850
1851static PyTypeObject _PyExc_UnicodeDecodeError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001852 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00001853 "UnicodeDecodeError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00001854 sizeof(PyUnicodeErrorObject), 0,
1855 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1856 (reprfunc)UnicodeDecodeError_str, 0, 0, 0,
1857 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001858 PyDoc_STR("Unicode decoding error."), (traverseproc)UnicodeError_traverse,
1859 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001860 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001861 (initproc)UnicodeDecodeError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001862};
1863PyObject *PyExc_UnicodeDecodeError = (PyObject *)&_PyExc_UnicodeDecodeError;
1864
1865PyObject *
1866PyUnicodeDecodeError_Create(
1867 const char *encoding, const char *object, Py_ssize_t length,
1868 Py_ssize_t start, Py_ssize_t end, const char *reason)
1869{
Victor Stinner7eeb5b52010-06-07 19:57:46 +00001870 return PyObject_CallFunction(PyExc_UnicodeDecodeError, "sy#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001871 encoding, object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001872}
1873
1874
1875/*
1876 * UnicodeTranslateError extends UnicodeError
1877 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001878
1879static int
1880UnicodeTranslateError_init(PyUnicodeErrorObject *self, PyObject *args,
1881 PyObject *kwds)
1882{
1883 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1884 return -1;
1885
1886 Py_CLEAR(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001887 Py_CLEAR(self->reason);
1888
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001889 if (!PyArg_ParseTuple(args, "O!nnO!",
Thomas Wouters477c8d52006-05-27 19:21:47 +00001890 &PyUnicode_Type, &self->object,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001891 &self->start,
1892 &self->end,
Walter Dörwaldd2034312007-05-18 16:29:38 +00001893 &PyUnicode_Type, &self->reason)) {
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001894 self->object = self->reason = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001895 return -1;
1896 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001897
Thomas Wouters477c8d52006-05-27 19:21:47 +00001898 Py_INCREF(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001899 Py_INCREF(self->reason);
1900
1901 return 0;
1902}
1903
1904
1905static PyObject *
1906UnicodeTranslateError_str(PyObject *self)
1907{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001908 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00001909 PyObject *result = NULL;
1910 PyObject *reason_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001911
Eric Smith0facd772010-02-24 15:42:29 +00001912 /* Get reason as a string, which it might not be if it's been
1913 modified after we were contructed. */
1914 reason_str = PyObject_Str(uself->reason);
1915 if (reason_str == NULL)
1916 goto done;
1917
Victor Stinner53b33e72011-11-21 01:17:27 +01001918 if (uself->start < PyUnicode_GET_LENGTH(uself->object) && uself->end == uself->start+1) {
1919 Py_UCS4 badchar = PyUnicode_ReadChar(uself->object, uself->start);
Walter Dörwald787b03b2007-06-05 13:29:29 +00001920 const char *fmt;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001921 if (badchar <= 0xff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00001922 fmt = "can't translate character '\\x%02x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001923 else if (badchar <= 0xffff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00001924 fmt = "can't translate character '\\u%04x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001925 else
Walter Dörwald32a4c712007-06-20 09:25:34 +00001926 fmt = "can't translate character '\\U%08x' in position %zd: %U";
Benjamin Petersonc5f4e1e2010-02-25 01:22:28 +00001927 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00001928 fmt,
Victor Stinner53b33e72011-11-21 01:17:27 +01001929 (int)badchar,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001930 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00001931 reason_str
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001932 );
Eric Smith0facd772010-02-24 15:42:29 +00001933 } else {
1934 result = PyUnicode_FromFormat(
1935 "can't translate characters in position %zd-%zd: %U",
1936 uself->start,
1937 uself->end-1,
1938 reason_str
1939 );
Thomas Wouters477c8d52006-05-27 19:21:47 +00001940 }
Eric Smith0facd772010-02-24 15:42:29 +00001941done:
1942 Py_XDECREF(reason_str);
1943 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001944}
1945
1946static PyTypeObject _PyExc_UnicodeTranslateError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001947 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00001948 "UnicodeTranslateError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00001949 sizeof(PyUnicodeErrorObject), 0,
1950 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1951 (reprfunc)UnicodeTranslateError_str, 0, 0, 0,
1952 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters89f507f2006-12-13 04:49:30 +00001953 PyDoc_STR("Unicode translation error."), (traverseproc)UnicodeError_traverse,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001954 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
1955 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001956 (initproc)UnicodeTranslateError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001957};
1958PyObject *PyExc_UnicodeTranslateError = (PyObject *)&_PyExc_UnicodeTranslateError;
1959
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001960/* Deprecated. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001961PyObject *
1962PyUnicodeTranslateError_Create(
1963 const Py_UNICODE *object, Py_ssize_t length,
1964 Py_ssize_t start, Py_ssize_t end, const char *reason)
1965{
1966 return PyObject_CallFunction(PyExc_UnicodeTranslateError, "u#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001967 object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001968}
Thomas Wouters477c8d52006-05-27 19:21:47 +00001969
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001970PyObject *
1971_PyUnicodeTranslateError_Create(
1972 PyObject *object,
1973 Py_ssize_t start, Py_ssize_t end, const char *reason)
1974{
1975 return PyObject_CallFunction(PyExc_UnicodeTranslateError, "Ons",
1976 object, start, end, reason);
1977}
Thomas Wouters477c8d52006-05-27 19:21:47 +00001978
1979/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001980 * AssertionError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001981 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001982SimpleExtendsException(PyExc_Exception, AssertionError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001983 "Assertion failed.");
1984
1985
1986/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001987 * ArithmeticError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001988 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001989SimpleExtendsException(PyExc_Exception, ArithmeticError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001990 "Base class for arithmetic errors.");
1991
1992
1993/*
1994 * FloatingPointError extends ArithmeticError
1995 */
1996SimpleExtendsException(PyExc_ArithmeticError, FloatingPointError,
1997 "Floating point operation failed.");
1998
1999
2000/*
2001 * OverflowError extends ArithmeticError
2002 */
2003SimpleExtendsException(PyExc_ArithmeticError, OverflowError,
2004 "Result too large to be represented.");
2005
2006
2007/*
2008 * ZeroDivisionError extends ArithmeticError
2009 */
2010SimpleExtendsException(PyExc_ArithmeticError, ZeroDivisionError,
2011 "Second argument to a division or modulo operation was zero.");
2012
2013
2014/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002015 * SystemError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002016 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002017SimpleExtendsException(PyExc_Exception, SystemError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002018 "Internal error in the Python interpreter.\n"
2019 "\n"
2020 "Please report this to the Python maintainer, along with the traceback,\n"
2021 "the Python version, and the hardware/OS platform and version.");
2022
2023
2024/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002025 * ReferenceError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002026 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002027SimpleExtendsException(PyExc_Exception, ReferenceError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002028 "Weak ref proxy used after referent went away.");
2029
2030
2031/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002032 * MemoryError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002033 */
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002034
2035#define MEMERRORS_SAVE 16
2036static PyBaseExceptionObject *memerrors_freelist = NULL;
2037static int memerrors_numfree = 0;
2038
2039static PyObject *
2040MemoryError_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2041{
2042 PyBaseExceptionObject *self;
2043
2044 if (type != (PyTypeObject *) PyExc_MemoryError)
2045 return BaseException_new(type, args, kwds);
2046 if (memerrors_freelist == NULL)
2047 return BaseException_new(type, args, kwds);
2048 /* Fetch object from freelist and revive it */
2049 self = memerrors_freelist;
2050 self->args = PyTuple_New(0);
2051 /* This shouldn't happen since the empty tuple is persistent */
2052 if (self->args == NULL)
2053 return NULL;
2054 memerrors_freelist = (PyBaseExceptionObject *) self->dict;
2055 memerrors_numfree--;
2056 self->dict = NULL;
2057 _Py_NewReference((PyObject *)self);
2058 _PyObject_GC_TRACK(self);
2059 return (PyObject *)self;
2060}
2061
2062static void
2063MemoryError_dealloc(PyBaseExceptionObject *self)
2064{
2065 _PyObject_GC_UNTRACK(self);
2066 BaseException_clear(self);
2067 if (memerrors_numfree >= MEMERRORS_SAVE)
2068 Py_TYPE(self)->tp_free((PyObject *)self);
2069 else {
2070 self->dict = (PyObject *) memerrors_freelist;
2071 memerrors_freelist = self;
2072 memerrors_numfree++;
2073 }
2074}
2075
2076static void
2077preallocate_memerrors(void)
2078{
2079 /* We create enough MemoryErrors and then decref them, which will fill
2080 up the freelist. */
2081 int i;
2082 PyObject *errors[MEMERRORS_SAVE];
2083 for (i = 0; i < MEMERRORS_SAVE; i++) {
2084 errors[i] = MemoryError_new((PyTypeObject *) PyExc_MemoryError,
2085 NULL, NULL);
2086 if (!errors[i])
2087 Py_FatalError("Could not preallocate MemoryError object");
2088 }
2089 for (i = 0; i < MEMERRORS_SAVE; i++) {
2090 Py_DECREF(errors[i]);
2091 }
2092}
2093
2094static void
2095free_preallocated_memerrors(void)
2096{
2097 while (memerrors_freelist != NULL) {
2098 PyObject *self = (PyObject *) memerrors_freelist;
2099 memerrors_freelist = (PyBaseExceptionObject *) memerrors_freelist->dict;
2100 Py_TYPE(self)->tp_free((PyObject *)self);
2101 }
2102}
2103
2104
2105static PyTypeObject _PyExc_MemoryError = {
2106 PyVarObject_HEAD_INIT(NULL, 0)
2107 "MemoryError",
2108 sizeof(PyBaseExceptionObject),
2109 0, (destructor)MemoryError_dealloc, 0, 0, 0, 0, 0, 0, 0,
2110 0, 0, 0, 0, 0, 0, 0,
2111 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
2112 PyDoc_STR("Out of memory."), (traverseproc)BaseException_traverse,
2113 (inquiry)BaseException_clear, 0, 0, 0, 0, 0, 0, 0, &_PyExc_Exception,
2114 0, 0, 0, offsetof(PyBaseExceptionObject, dict),
2115 (initproc)BaseException_init, 0, MemoryError_new
2116};
2117PyObject *PyExc_MemoryError = (PyObject *) &_PyExc_MemoryError;
2118
Thomas Wouters477c8d52006-05-27 19:21:47 +00002119
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002120/*
2121 * BufferError extends Exception
2122 */
2123SimpleExtendsException(PyExc_Exception, BufferError, "Buffer error.");
2124
Thomas Wouters477c8d52006-05-27 19:21:47 +00002125
2126/* Warning category docstrings */
2127
2128/*
2129 * Warning extends Exception
2130 */
2131SimpleExtendsException(PyExc_Exception, Warning,
2132 "Base class for warning categories.");
2133
2134
2135/*
2136 * UserWarning extends Warning
2137 */
2138SimpleExtendsException(PyExc_Warning, UserWarning,
2139 "Base class for warnings generated by user code.");
2140
2141
2142/*
2143 * DeprecationWarning extends Warning
2144 */
2145SimpleExtendsException(PyExc_Warning, DeprecationWarning,
2146 "Base class for warnings about deprecated features.");
2147
2148
2149/*
2150 * PendingDeprecationWarning extends Warning
2151 */
2152SimpleExtendsException(PyExc_Warning, PendingDeprecationWarning,
2153 "Base class for warnings about features which will be deprecated\n"
2154 "in the future.");
2155
2156
2157/*
2158 * SyntaxWarning extends Warning
2159 */
2160SimpleExtendsException(PyExc_Warning, SyntaxWarning,
2161 "Base class for warnings about dubious syntax.");
2162
2163
2164/*
2165 * RuntimeWarning extends Warning
2166 */
2167SimpleExtendsException(PyExc_Warning, RuntimeWarning,
2168 "Base class for warnings about dubious runtime behavior.");
2169
2170
2171/*
2172 * FutureWarning extends Warning
2173 */
2174SimpleExtendsException(PyExc_Warning, FutureWarning,
2175 "Base class for warnings about constructs that will change semantically\n"
2176 "in the future.");
2177
2178
2179/*
2180 * ImportWarning extends Warning
2181 */
2182SimpleExtendsException(PyExc_Warning, ImportWarning,
2183 "Base class for warnings about probable mistakes in module imports");
2184
2185
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002186/*
2187 * UnicodeWarning extends Warning
2188 */
2189SimpleExtendsException(PyExc_Warning, UnicodeWarning,
2190 "Base class for warnings about Unicode related problems, mostly\n"
2191 "related to conversion problems.");
2192
Georg Brandl08be72d2010-10-24 15:11:22 +00002193
Guido van Rossum98297ee2007-11-06 21:34:58 +00002194/*
2195 * BytesWarning extends Warning
2196 */
2197SimpleExtendsException(PyExc_Warning, BytesWarning,
2198 "Base class for warnings about bytes and buffer related problems, mostly\n"
2199 "related to conversion from str or comparing to str.");
2200
2201
Georg Brandl08be72d2010-10-24 15:11:22 +00002202/*
2203 * ResourceWarning extends Warning
2204 */
2205SimpleExtendsException(PyExc_Warning, ResourceWarning,
2206 "Base class for warnings about resource usage.");
2207
2208
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002209
Thomas Wouters89d996e2007-09-08 17:39:28 +00002210/* Pre-computed RuntimeError instance for when recursion depth is reached.
2211 Meant to be used when normalizing the exception for exceeding the recursion
2212 depth will cause its own infinite recursion.
2213*/
2214PyObject *PyExc_RecursionErrorInst = NULL;
2215
Antoine Pitrou55f217f2012-01-18 21:23:13 +01002216#define PRE_INIT(TYPE) \
2217 if (!(_PyExc_ ## TYPE.tp_flags & Py_TPFLAGS_READY)) { \
2218 if (PyType_Ready(&_PyExc_ ## TYPE) < 0) \
2219 Py_FatalError("exceptions bootstrapping error."); \
2220 Py_INCREF(PyExc_ ## TYPE); \
2221 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002222
Antoine Pitrou55f217f2012-01-18 21:23:13 +01002223#define POST_INIT(TYPE) \
Thomas Wouters477c8d52006-05-27 19:21:47 +00002224 if (PyDict_SetItemString(bdict, # TYPE, PyExc_ ## TYPE)) \
2225 Py_FatalError("Module dictionary insertion problem.");
2226
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002227#define INIT_ALIAS(NAME, TYPE) Py_INCREF(PyExc_ ## TYPE); \
Antoine Pitrou8b0a74e2012-01-18 21:29:05 +01002228 Py_XDECREF(PyExc_ ## NAME); \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002229 PyExc_ ## NAME = PyExc_ ## TYPE; \
2230 if (PyDict_SetItemString(bdict, # NAME, PyExc_ ## NAME)) \
2231 Py_FatalError("Module dictionary insertion problem.");
2232
2233#define ADD_ERRNO(TYPE, CODE) { \
2234 PyObject *_code = PyLong_FromLong(CODE); \
2235 assert(_PyObject_RealIsSubclass(PyExc_ ## TYPE, PyExc_OSError)); \
2236 if (!_code || PyDict_SetItem(errnomap, _code, PyExc_ ## TYPE)) \
2237 Py_FatalError("errmap insertion problem."); \
Antoine Pitrou8b0a74e2012-01-18 21:29:05 +01002238 Py_DECREF(_code); \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002239 }
2240
2241#ifdef MS_WINDOWS
2242#include <Winsock2.h>
2243#if defined(WSAEALREADY) && !defined(EALREADY)
2244#define EALREADY WSAEALREADY
2245#endif
2246#if defined(WSAECONNABORTED) && !defined(ECONNABORTED)
2247#define ECONNABORTED WSAECONNABORTED
2248#endif
2249#if defined(WSAECONNREFUSED) && !defined(ECONNREFUSED)
2250#define ECONNREFUSED WSAECONNREFUSED
2251#endif
2252#if defined(WSAECONNRESET) && !defined(ECONNRESET)
2253#define ECONNRESET WSAECONNRESET
2254#endif
2255#if defined(WSAEINPROGRESS) && !defined(EINPROGRESS)
2256#define EINPROGRESS WSAEINPROGRESS
2257#endif
2258#if defined(WSAESHUTDOWN) && !defined(ESHUTDOWN)
2259#define ESHUTDOWN WSAESHUTDOWN
2260#endif
2261#if defined(WSAETIMEDOUT) && !defined(ETIMEDOUT)
2262#define ETIMEDOUT WSAETIMEDOUT
2263#endif
2264#if defined(WSAEWOULDBLOCK) && !defined(EWOULDBLOCK)
2265#define EWOULDBLOCK WSAEWOULDBLOCK
2266#endif
2267#endif /* MS_WINDOWS */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002268
Martin v. Löwis1a214512008-06-11 05:26:20 +00002269void
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002270_PyExc_Init(void)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002271{
Neal Norwitz2633c692007-02-26 22:22:47 +00002272 PyObject *bltinmod, *bdict;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002273
2274 PRE_INIT(BaseException)
2275 PRE_INIT(Exception)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002276 PRE_INIT(TypeError)
2277 PRE_INIT(StopIteration)
2278 PRE_INIT(GeneratorExit)
2279 PRE_INIT(SystemExit)
2280 PRE_INIT(KeyboardInterrupt)
2281 PRE_INIT(ImportError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002282 PRE_INIT(OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002283 PRE_INIT(EOFError)
2284 PRE_INIT(RuntimeError)
2285 PRE_INIT(NotImplementedError)
2286 PRE_INIT(NameError)
2287 PRE_INIT(UnboundLocalError)
2288 PRE_INIT(AttributeError)
2289 PRE_INIT(SyntaxError)
2290 PRE_INIT(IndentationError)
2291 PRE_INIT(TabError)
2292 PRE_INIT(LookupError)
2293 PRE_INIT(IndexError)
2294 PRE_INIT(KeyError)
2295 PRE_INIT(ValueError)
2296 PRE_INIT(UnicodeError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002297 PRE_INIT(UnicodeEncodeError)
2298 PRE_INIT(UnicodeDecodeError)
2299 PRE_INIT(UnicodeTranslateError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002300 PRE_INIT(AssertionError)
2301 PRE_INIT(ArithmeticError)
2302 PRE_INIT(FloatingPointError)
2303 PRE_INIT(OverflowError)
2304 PRE_INIT(ZeroDivisionError)
2305 PRE_INIT(SystemError)
2306 PRE_INIT(ReferenceError)
Neal Norwitzfaa54a32007-08-19 04:23:20 +00002307 PRE_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002308 PRE_INIT(MemoryError)
Benjamin Peterson2b968d62008-07-05 23:38:30 +00002309 PRE_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002310 PRE_INIT(Warning)
2311 PRE_INIT(UserWarning)
2312 PRE_INIT(DeprecationWarning)
2313 PRE_INIT(PendingDeprecationWarning)
2314 PRE_INIT(SyntaxWarning)
2315 PRE_INIT(RuntimeWarning)
2316 PRE_INIT(FutureWarning)
2317 PRE_INIT(ImportWarning)
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002318 PRE_INIT(UnicodeWarning)
Guido van Rossum98297ee2007-11-06 21:34:58 +00002319 PRE_INIT(BytesWarning)
Georg Brandl08be72d2010-10-24 15:11:22 +00002320 PRE_INIT(ResourceWarning)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002321
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002322 /* OSError subclasses */
2323 PRE_INIT(ConnectionError);
2324
2325 PRE_INIT(BlockingIOError);
2326 PRE_INIT(BrokenPipeError);
2327 PRE_INIT(ChildProcessError);
2328 PRE_INIT(ConnectionAbortedError);
2329 PRE_INIT(ConnectionRefusedError);
2330 PRE_INIT(ConnectionResetError);
2331 PRE_INIT(FileExistsError);
2332 PRE_INIT(FileNotFoundError);
2333 PRE_INIT(IsADirectoryError);
2334 PRE_INIT(NotADirectoryError);
2335 PRE_INIT(InterruptedError);
2336 PRE_INIT(PermissionError);
2337 PRE_INIT(ProcessLookupError);
2338 PRE_INIT(TimeoutError);
2339
Georg Brandl1a3284e2007-12-02 09:40:06 +00002340 bltinmod = PyImport_ImportModule("builtins");
Thomas Wouters477c8d52006-05-27 19:21:47 +00002341 if (bltinmod == NULL)
2342 Py_FatalError("exceptions bootstrapping error.");
2343 bdict = PyModule_GetDict(bltinmod);
2344 if (bdict == NULL)
2345 Py_FatalError("exceptions bootstrapping error.");
2346
2347 POST_INIT(BaseException)
2348 POST_INIT(Exception)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002349 POST_INIT(TypeError)
2350 POST_INIT(StopIteration)
2351 POST_INIT(GeneratorExit)
2352 POST_INIT(SystemExit)
2353 POST_INIT(KeyboardInterrupt)
2354 POST_INIT(ImportError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002355 POST_INIT(OSError)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002356 INIT_ALIAS(EnvironmentError, OSError)
2357 INIT_ALIAS(IOError, OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002358#ifdef MS_WINDOWS
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002359 INIT_ALIAS(WindowsError, OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002360#endif
2361#ifdef __VMS
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002362 INIT_ALIAS(VMSError, OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002363#endif
2364 POST_INIT(EOFError)
2365 POST_INIT(RuntimeError)
2366 POST_INIT(NotImplementedError)
2367 POST_INIT(NameError)
2368 POST_INIT(UnboundLocalError)
2369 POST_INIT(AttributeError)
2370 POST_INIT(SyntaxError)
2371 POST_INIT(IndentationError)
2372 POST_INIT(TabError)
2373 POST_INIT(LookupError)
2374 POST_INIT(IndexError)
2375 POST_INIT(KeyError)
2376 POST_INIT(ValueError)
2377 POST_INIT(UnicodeError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002378 POST_INIT(UnicodeEncodeError)
2379 POST_INIT(UnicodeDecodeError)
2380 POST_INIT(UnicodeTranslateError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002381 POST_INIT(AssertionError)
2382 POST_INIT(ArithmeticError)
2383 POST_INIT(FloatingPointError)
2384 POST_INIT(OverflowError)
2385 POST_INIT(ZeroDivisionError)
2386 POST_INIT(SystemError)
2387 POST_INIT(ReferenceError)
Neal Norwitzfaa54a32007-08-19 04:23:20 +00002388 POST_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002389 POST_INIT(MemoryError)
Benjamin Peterson2b968d62008-07-05 23:38:30 +00002390 POST_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002391 POST_INIT(Warning)
2392 POST_INIT(UserWarning)
2393 POST_INIT(DeprecationWarning)
2394 POST_INIT(PendingDeprecationWarning)
2395 POST_INIT(SyntaxWarning)
2396 POST_INIT(RuntimeWarning)
2397 POST_INIT(FutureWarning)
2398 POST_INIT(ImportWarning)
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002399 POST_INIT(UnicodeWarning)
Guido van Rossum98297ee2007-11-06 21:34:58 +00002400 POST_INIT(BytesWarning)
Georg Brandl08be72d2010-10-24 15:11:22 +00002401 POST_INIT(ResourceWarning)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002402
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002403 errnomap = PyDict_New();
2404 if (!errnomap)
2405 Py_FatalError("Cannot allocate map from errnos to OSError subclasses");
2406
2407 /* OSError subclasses */
2408 POST_INIT(ConnectionError);
2409
2410 POST_INIT(BlockingIOError);
2411 ADD_ERRNO(BlockingIOError, EAGAIN);
2412 ADD_ERRNO(BlockingIOError, EALREADY);
2413 ADD_ERRNO(BlockingIOError, EINPROGRESS);
2414 ADD_ERRNO(BlockingIOError, EWOULDBLOCK);
2415 POST_INIT(BrokenPipeError);
2416 ADD_ERRNO(BrokenPipeError, EPIPE);
2417 ADD_ERRNO(BrokenPipeError, ESHUTDOWN);
2418 POST_INIT(ChildProcessError);
2419 ADD_ERRNO(ChildProcessError, ECHILD);
2420 POST_INIT(ConnectionAbortedError);
2421 ADD_ERRNO(ConnectionAbortedError, ECONNABORTED);
2422 POST_INIT(ConnectionRefusedError);
2423 ADD_ERRNO(ConnectionRefusedError, ECONNREFUSED);
2424 POST_INIT(ConnectionResetError);
2425 ADD_ERRNO(ConnectionResetError, ECONNRESET);
2426 POST_INIT(FileExistsError);
2427 ADD_ERRNO(FileExistsError, EEXIST);
2428 POST_INIT(FileNotFoundError);
2429 ADD_ERRNO(FileNotFoundError, ENOENT);
2430 POST_INIT(IsADirectoryError);
2431 ADD_ERRNO(IsADirectoryError, EISDIR);
2432 POST_INIT(NotADirectoryError);
2433 ADD_ERRNO(NotADirectoryError, ENOTDIR);
2434 POST_INIT(InterruptedError);
2435 ADD_ERRNO(InterruptedError, EINTR);
2436 POST_INIT(PermissionError);
2437 ADD_ERRNO(PermissionError, EACCES);
2438 ADD_ERRNO(PermissionError, EPERM);
2439 POST_INIT(ProcessLookupError);
2440 ADD_ERRNO(ProcessLookupError, ESRCH);
2441 POST_INIT(TimeoutError);
2442 ADD_ERRNO(TimeoutError, ETIMEDOUT);
2443
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002444 preallocate_memerrors();
Thomas Wouters477c8d52006-05-27 19:21:47 +00002445
Antoine Pitrou1c7ade52012-01-18 16:13:31 +01002446 if (!PyExc_RecursionErrorInst) {
2447 PyExc_RecursionErrorInst = BaseException_new(&_PyExc_RuntimeError, NULL, NULL);
2448 if (!PyExc_RecursionErrorInst)
2449 Py_FatalError("Cannot pre-allocate RuntimeError instance for "
2450 "recursion errors");
2451 else {
2452 PyBaseExceptionObject *err_inst =
2453 (PyBaseExceptionObject *)PyExc_RecursionErrorInst;
2454 PyObject *args_tuple;
2455 PyObject *exc_message;
2456 exc_message = PyUnicode_FromString("maximum recursion depth exceeded");
2457 if (!exc_message)
2458 Py_FatalError("cannot allocate argument for RuntimeError "
2459 "pre-allocation");
2460 args_tuple = PyTuple_Pack(1, exc_message);
2461 if (!args_tuple)
2462 Py_FatalError("cannot allocate tuple for RuntimeError "
2463 "pre-allocation");
2464 Py_DECREF(exc_message);
2465 if (BaseException_init(err_inst, args_tuple, NULL))
2466 Py_FatalError("init of pre-allocated RuntimeError failed");
2467 Py_DECREF(args_tuple);
2468 }
Thomas Wouters89d996e2007-09-08 17:39:28 +00002469 }
2470
Thomas Wouters477c8d52006-05-27 19:21:47 +00002471 Py_DECREF(bltinmod);
2472}
2473
2474void
2475_PyExc_Fini(void)
2476{
Benjamin Peterson78565b22009-06-28 19:19:51 +00002477 Py_CLEAR(PyExc_RecursionErrorInst);
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002478 free_preallocated_memerrors();
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002479 Py_CLEAR(errnomap);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002480}