blob: 9e10b7e30763641b360d29b556a42a8202d6d380 [file] [log] [blame]
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001/*
2 * New exceptions.c written in Iceland by Richard Jones and Georg Brandl.
3 *
4 * Thanks go to Tim Peters and Michael Hudson for debugging.
5 */
6
Thomas Wouters477c8d52006-05-27 19:21:47 +00007#define PY_SSIZE_T_CLEAN
8#include <Python.h>
9#include "structmember.h"
10#include "osdefs.h"
11
Thomas Wouters477c8d52006-05-27 19:21:47 +000012
Antoine Pitrou6b4883d2011-10-12 02:54:14 +020013/* Compatibility aliases */
14PyObject *PyExc_EnvironmentError = NULL;
15PyObject *PyExc_IOError = NULL;
16#ifdef MS_WINDOWS
17PyObject *PyExc_WindowsError = NULL;
18#endif
19#ifdef __VMS
20PyObject *PyExc_VMSError = NULL;
21#endif
22
23/* The dict map from errno codes to OSError subclasses */
24static PyObject *errnomap = NULL;
25
26
Thomas Wouters477c8d52006-05-27 19:21:47 +000027/* NOTE: If the exception class hierarchy changes, don't forget to update
28 * Lib/test/exception_hierarchy.txt
29 */
30
Thomas Wouters477c8d52006-05-27 19:21:47 +000031/*
32 * BaseException
33 */
34static PyObject *
35BaseException_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
36{
37 PyBaseExceptionObject *self;
38
39 self = (PyBaseExceptionObject *)type->tp_alloc(type, 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +000040 if (!self)
41 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +000042 /* the dict is created on the fly in PyObject_GenericSetAttr */
Guido van Rossumebe3e162007-05-17 18:20:34 +000043 self->dict = NULL;
Collin Winter1966f1c2007-09-01 20:26:44 +000044 self->traceback = self->cause = self->context = NULL;
Benjamin Petersond5a1c442012-05-14 22:09:31 -070045 self->suppress_context = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +000046
47 self->args = PyTuple_New(0);
48 if (!self->args) {
49 Py_DECREF(self);
50 return NULL;
51 }
52
Thomas Wouters477c8d52006-05-27 19:21:47 +000053 return (PyObject *)self;
54}
55
56static int
57BaseException_init(PyBaseExceptionObject *self, PyObject *args, PyObject *kwds)
58{
Christian Heimes90aa7642007-12-19 02:45:37 +000059 if (!_PyArg_NoKeywords(Py_TYPE(self)->tp_name, kwds))
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000060 return -1;
61
Antoine Pitroue0e27352011-12-15 14:31:28 +010062 Py_XDECREF(self->args);
Thomas Wouters477c8d52006-05-27 19:21:47 +000063 self->args = args;
64 Py_INCREF(self->args);
65
Thomas Wouters477c8d52006-05-27 19:21:47 +000066 return 0;
67}
68
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000069static int
Thomas Wouters477c8d52006-05-27 19:21:47 +000070BaseException_clear(PyBaseExceptionObject *self)
71{
72 Py_CLEAR(self->dict);
73 Py_CLEAR(self->args);
Collin Winter828f04a2007-08-31 00:04:24 +000074 Py_CLEAR(self->traceback);
Collin Winter1966f1c2007-09-01 20:26:44 +000075 Py_CLEAR(self->cause);
76 Py_CLEAR(self->context);
Thomas Wouters477c8d52006-05-27 19:21:47 +000077 return 0;
78}
79
80static void
81BaseException_dealloc(PyBaseExceptionObject *self)
82{
Thomas Wouters89f507f2006-12-13 04:49:30 +000083 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +000084 BaseException_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +000085 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +000086}
87
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000088static int
Thomas Wouters477c8d52006-05-27 19:21:47 +000089BaseException_traverse(PyBaseExceptionObject *self, visitproc visit, void *arg)
90{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000091 Py_VISIT(self->dict);
Thomas Wouters477c8d52006-05-27 19:21:47 +000092 Py_VISIT(self->args);
Collin Winter828f04a2007-08-31 00:04:24 +000093 Py_VISIT(self->traceback);
Collin Winter1966f1c2007-09-01 20:26:44 +000094 Py_VISIT(self->cause);
95 Py_VISIT(self->context);
Thomas Wouters477c8d52006-05-27 19:21:47 +000096 return 0;
97}
98
99static PyObject *
100BaseException_str(PyBaseExceptionObject *self)
101{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000102 switch (PyTuple_GET_SIZE(self->args)) {
Thomas Wouters477c8d52006-05-27 19:21:47 +0000103 case 0:
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +0000104 return PyUnicode_FromString("");
Thomas Wouters477c8d52006-05-27 19:21:47 +0000105 case 1:
Thomas Heller519a0422007-11-15 20:48:54 +0000106 return PyObject_Str(PyTuple_GET_ITEM(self->args, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +0000107 default:
Thomas Heller519a0422007-11-15 20:48:54 +0000108 return PyObject_Str(self->args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000109 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000110}
111
112static PyObject *
113BaseException_repr(PyBaseExceptionObject *self)
114{
Thomas Wouters477c8d52006-05-27 19:21:47 +0000115 char *name;
116 char *dot;
117
Christian Heimes90aa7642007-12-19 02:45:37 +0000118 name = (char *)Py_TYPE(self)->tp_name;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000119 dot = strrchr(name, '.');
120 if (dot != NULL) name = dot+1;
121
Walter Dörwald7569dfe2007-05-19 21:49:49 +0000122 return PyUnicode_FromFormat("%s%R", name, self->args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000123}
124
125/* Pickling support */
126static PyObject *
127BaseException_reduce(PyBaseExceptionObject *self)
128{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000129 if (self->args && self->dict)
Christian Heimes90aa7642007-12-19 02:45:37 +0000130 return PyTuple_Pack(3, Py_TYPE(self), self->args, self->dict);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000131 else
Christian Heimes90aa7642007-12-19 02:45:37 +0000132 return PyTuple_Pack(2, Py_TYPE(self), self->args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000133}
134
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000135/*
136 * Needed for backward compatibility, since exceptions used to store
137 * all their attributes in the __dict__. Code is taken from cPickle's
138 * load_build function.
139 */
140static PyObject *
141BaseException_setstate(PyObject *self, PyObject *state)
142{
143 PyObject *d_key, *d_value;
144 Py_ssize_t i = 0;
145
146 if (state != Py_None) {
147 if (!PyDict_Check(state)) {
148 PyErr_SetString(PyExc_TypeError, "state is not a dictionary");
149 return NULL;
150 }
151 while (PyDict_Next(state, &i, &d_key, &d_value)) {
152 if (PyObject_SetAttr(self, d_key, d_value) < 0)
153 return NULL;
154 }
155 }
156 Py_RETURN_NONE;
157}
Thomas Wouters477c8d52006-05-27 19:21:47 +0000158
Collin Winter828f04a2007-08-31 00:04:24 +0000159static PyObject *
160BaseException_with_traceback(PyObject *self, PyObject *tb) {
161 if (PyException_SetTraceback(self, tb))
162 return NULL;
163
164 Py_INCREF(self);
165 return self;
166}
167
Georg Brandl76941002008-05-05 21:38:47 +0000168PyDoc_STRVAR(with_traceback_doc,
169"Exception.with_traceback(tb) --\n\
170 set self.__traceback__ to tb and return self.");
171
Thomas Wouters477c8d52006-05-27 19:21:47 +0000172
173static PyMethodDef BaseException_methods[] = {
174 {"__reduce__", (PyCFunction)BaseException_reduce, METH_NOARGS },
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000175 {"__setstate__", (PyCFunction)BaseException_setstate, METH_O },
Georg Brandl76941002008-05-05 21:38:47 +0000176 {"with_traceback", (PyCFunction)BaseException_with_traceback, METH_O,
177 with_traceback_doc},
Thomas Wouters477c8d52006-05-27 19:21:47 +0000178 {NULL, NULL, 0, NULL},
179};
180
Thomas Wouters477c8d52006-05-27 19:21:47 +0000181static PyObject *
182BaseException_get_args(PyBaseExceptionObject *self)
183{
184 if (self->args == NULL) {
185 Py_INCREF(Py_None);
186 return Py_None;
187 }
188 Py_INCREF(self->args);
189 return self->args;
190}
191
192static int
193BaseException_set_args(PyBaseExceptionObject *self, PyObject *val)
194{
195 PyObject *seq;
196 if (val == NULL) {
197 PyErr_SetString(PyExc_TypeError, "args may not be deleted");
198 return -1;
199 }
200 seq = PySequence_Tuple(val);
Benjamin Peterson90b13582012-02-03 19:22:31 -0500201 if (!seq)
202 return -1;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000203 Py_CLEAR(self->args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000204 self->args = seq;
205 return 0;
206}
207
Collin Winter828f04a2007-08-31 00:04:24 +0000208static PyObject *
209BaseException_get_tb(PyBaseExceptionObject *self)
210{
211 if (self->traceback == NULL) {
212 Py_INCREF(Py_None);
213 return Py_None;
214 }
215 Py_INCREF(self->traceback);
216 return self->traceback;
217}
218
219static int
220BaseException_set_tb(PyBaseExceptionObject *self, PyObject *tb)
221{
222 if (tb == NULL) {
223 PyErr_SetString(PyExc_TypeError, "__traceback__ may not be deleted");
224 return -1;
225 }
226 else if (!(tb == Py_None || PyTraceBack_Check(tb))) {
227 PyErr_SetString(PyExc_TypeError,
228 "__traceback__ must be a traceback or None");
229 return -1;
230 }
231
232 Py_XINCREF(tb);
233 Py_XDECREF(self->traceback);
234 self->traceback = tb;
235 return 0;
236}
237
Georg Brandlab6f2f62009-03-31 04:16:10 +0000238static PyObject *
239BaseException_get_context(PyObject *self) {
240 PyObject *res = PyException_GetContext(self);
Benjamin Peterson90b13582012-02-03 19:22:31 -0500241 if (res)
242 return res; /* new reference already returned above */
Georg Brandlab6f2f62009-03-31 04:16:10 +0000243 Py_RETURN_NONE;
244}
245
246static int
247BaseException_set_context(PyObject *self, PyObject *arg) {
248 if (arg == NULL) {
249 PyErr_SetString(PyExc_TypeError, "__context__ may not be deleted");
250 return -1;
251 } else if (arg == Py_None) {
252 arg = NULL;
253 } else if (!PyExceptionInstance_Check(arg)) {
254 PyErr_SetString(PyExc_TypeError, "exception context must be None "
255 "or derive from BaseException");
256 return -1;
257 } else {
258 /* PyException_SetContext steals this reference */
259 Py_INCREF(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000260 }
Georg Brandlab6f2f62009-03-31 04:16:10 +0000261 PyException_SetContext(self, arg);
262 return 0;
263}
264
265static PyObject *
266BaseException_get_cause(PyObject *self) {
267 PyObject *res = PyException_GetCause(self);
Benjamin Peterson90b13582012-02-03 19:22:31 -0500268 if (res)
269 return res; /* new reference already returned above */
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700270 Py_RETURN_NONE;
Georg Brandlab6f2f62009-03-31 04:16:10 +0000271}
272
273static int
274BaseException_set_cause(PyObject *self, PyObject *arg) {
275 if (arg == NULL) {
276 PyErr_SetString(PyExc_TypeError, "__cause__ may not be deleted");
277 return -1;
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700278 } else if (arg == Py_None) {
279 arg = NULL;
280 } else if (!PyExceptionInstance_Check(arg)) {
281 PyErr_SetString(PyExc_TypeError, "exception cause must be None "
282 "or derive from BaseException");
283 return -1;
284 } else {
285 /* PyException_SetCause steals this reference */
286 Py_INCREF(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000287 }
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700288 PyException_SetCause(self, arg);
289 return 0;
Georg Brandlab6f2f62009-03-31 04:16:10 +0000290}
291
Guido van Rossum360e4b82007-05-14 22:51:27 +0000292
Thomas Wouters477c8d52006-05-27 19:21:47 +0000293static PyGetSetDef BaseException_getset[] = {
Benjamin Peterson23d7f122012-02-19 20:02:57 -0500294 {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict},
Thomas Wouters477c8d52006-05-27 19:21:47 +0000295 {"args", (getter)BaseException_get_args, (setter)BaseException_set_args},
Collin Winter828f04a2007-08-31 00:04:24 +0000296 {"__traceback__", (getter)BaseException_get_tb, (setter)BaseException_set_tb},
Georg Brandlab6f2f62009-03-31 04:16:10 +0000297 {"__context__", (getter)BaseException_get_context,
298 (setter)BaseException_set_context, PyDoc_STR("exception context")},
299 {"__cause__", (getter)BaseException_get_cause,
300 (setter)BaseException_set_cause, PyDoc_STR("exception cause")},
Thomas Wouters477c8d52006-05-27 19:21:47 +0000301 {NULL},
302};
303
304
Collin Winter828f04a2007-08-31 00:04:24 +0000305PyObject *
306PyException_GetTraceback(PyObject *self) {
307 PyBaseExceptionObject *base_self = (PyBaseExceptionObject *)self;
308 Py_XINCREF(base_self->traceback);
309 return base_self->traceback;
310}
311
312
313int
314PyException_SetTraceback(PyObject *self, PyObject *tb) {
315 return BaseException_set_tb((PyBaseExceptionObject *)self, tb);
316}
317
318PyObject *
319PyException_GetCause(PyObject *self) {
320 PyObject *cause = ((PyBaseExceptionObject *)self)->cause;
321 Py_XINCREF(cause);
322 return cause;
323}
324
325/* Steals a reference to cause */
326void
327PyException_SetCause(PyObject *self, PyObject *cause) {
328 PyObject *old_cause = ((PyBaseExceptionObject *)self)->cause;
329 ((PyBaseExceptionObject *)self)->cause = cause;
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700330 ((PyBaseExceptionObject *)self)->suppress_context = 1;
Collin Winter828f04a2007-08-31 00:04:24 +0000331 Py_XDECREF(old_cause);
332}
333
334PyObject *
335PyException_GetContext(PyObject *self) {
336 PyObject *context = ((PyBaseExceptionObject *)self)->context;
337 Py_XINCREF(context);
338 return context;
339}
340
341/* Steals a reference to context */
342void
343PyException_SetContext(PyObject *self, PyObject *context) {
344 PyObject *old_context = ((PyBaseExceptionObject *)self)->context;
345 ((PyBaseExceptionObject *)self)->context = context;
346 Py_XDECREF(old_context);
347}
348
349
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700350static struct PyMemberDef BaseException_members[] = {
351 {"__suppress_context__", T_BOOL,
Antoine Pitrou32bc80c2012-05-16 12:51:55 +0200352 offsetof(PyBaseExceptionObject, suppress_context)},
353 {NULL}
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700354};
355
356
Thomas Wouters477c8d52006-05-27 19:21:47 +0000357static PyTypeObject _PyExc_BaseException = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000358 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +0000359 "BaseException", /*tp_name*/
Thomas Wouters477c8d52006-05-27 19:21:47 +0000360 sizeof(PyBaseExceptionObject), /*tp_basicsize*/
361 0, /*tp_itemsize*/
362 (destructor)BaseException_dealloc, /*tp_dealloc*/
363 0, /*tp_print*/
364 0, /*tp_getattr*/
365 0, /*tp_setattr*/
Mark Dickinsone94c6792009-02-02 20:36:42 +0000366 0, /* tp_reserved; */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000367 (reprfunc)BaseException_repr, /*tp_repr*/
368 0, /*tp_as_number*/
Brett Cannonba7bf492007-02-27 00:15:55 +0000369 0, /*tp_as_sequence*/
Thomas Wouters477c8d52006-05-27 19:21:47 +0000370 0, /*tp_as_mapping*/
371 0, /*tp_hash */
372 0, /*tp_call*/
373 (reprfunc)BaseException_str, /*tp_str*/
374 PyObject_GenericGetAttr, /*tp_getattro*/
375 PyObject_GenericSetAttr, /*tp_setattro*/
376 0, /*tp_as_buffer*/
Thomas Wouters27d517b2007-02-25 20:39:11 +0000377 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC |
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000378 Py_TPFLAGS_BASE_EXC_SUBCLASS, /*tp_flags*/
Thomas Wouters477c8d52006-05-27 19:21:47 +0000379 PyDoc_STR("Common base class for all exceptions"), /* tp_doc */
380 (traverseproc)BaseException_traverse, /* tp_traverse */
381 (inquiry)BaseException_clear, /* tp_clear */
382 0, /* tp_richcompare */
383 0, /* tp_weaklistoffset */
384 0, /* tp_iter */
385 0, /* tp_iternext */
386 BaseException_methods, /* tp_methods */
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700387 BaseException_members, /* tp_members */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000388 BaseException_getset, /* tp_getset */
389 0, /* tp_base */
390 0, /* tp_dict */
391 0, /* tp_descr_get */
392 0, /* tp_descr_set */
393 offsetof(PyBaseExceptionObject, dict), /* tp_dictoffset */
394 (initproc)BaseException_init, /* tp_init */
395 0, /* tp_alloc */
396 BaseException_new, /* tp_new */
397};
398/* the CPython API expects exceptions to be (PyObject *) - both a hold-over
399from the previous implmentation and also allowing Python objects to be used
400in the API */
401PyObject *PyExc_BaseException = (PyObject *)&_PyExc_BaseException;
402
403/* note these macros omit the last semicolon so the macro invocation may
404 * include it and not look strange.
405 */
406#define SimpleExtendsException(EXCBASE, EXCNAME, EXCDOC) \
407static PyTypeObject _PyExc_ ## EXCNAME = { \
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000408 PyVarObject_HEAD_INIT(NULL, 0) \
Neal Norwitz2633c692007-02-26 22:22:47 +0000409 # EXCNAME, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000410 sizeof(PyBaseExceptionObject), \
411 0, (destructor)BaseException_dealloc, 0, 0, 0, 0, 0, 0, 0, \
412 0, 0, 0, 0, 0, 0, 0, \
413 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
414 PyDoc_STR(EXCDOC), (traverseproc)BaseException_traverse, \
415 (inquiry)BaseException_clear, 0, 0, 0, 0, 0, 0, 0, &_ ## EXCBASE, \
416 0, 0, 0, offsetof(PyBaseExceptionObject, dict), \
417 (initproc)BaseException_init, 0, BaseException_new,\
418}; \
419PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
420
421#define MiddlingExtendsException(EXCBASE, EXCNAME, EXCSTORE, EXCDOC) \
422static PyTypeObject _PyExc_ ## EXCNAME = { \
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000423 PyVarObject_HEAD_INIT(NULL, 0) \
Neal Norwitz2633c692007-02-26 22:22:47 +0000424 # EXCNAME, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000425 sizeof(Py ## EXCSTORE ## Object), \
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000426 0, (destructor)EXCSTORE ## _dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000427 0, 0, 0, 0, 0, \
428 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000429 PyDoc_STR(EXCDOC), (traverseproc)EXCSTORE ## _traverse, \
430 (inquiry)EXCSTORE ## _clear, 0, 0, 0, 0, 0, 0, 0, &_ ## EXCBASE, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000431 0, 0, 0, offsetof(Py ## EXCSTORE ## Object, dict), \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200432 (initproc)EXCSTORE ## _init, 0, 0, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000433}; \
434PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
435
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200436#define ComplexExtendsException(EXCBASE, EXCNAME, EXCSTORE, EXCNEW, \
437 EXCMETHODS, EXCMEMBERS, EXCGETSET, \
438 EXCSTR, EXCDOC) \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000439static PyTypeObject _PyExc_ ## EXCNAME = { \
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000440 PyVarObject_HEAD_INIT(NULL, 0) \
Neal Norwitz2633c692007-02-26 22:22:47 +0000441 # EXCNAME, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000442 sizeof(Py ## EXCSTORE ## Object), 0, \
443 (destructor)EXCSTORE ## _dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
444 (reprfunc)EXCSTR, 0, 0, 0, \
445 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
446 PyDoc_STR(EXCDOC), (traverseproc)EXCSTORE ## _traverse, \
447 (inquiry)EXCSTORE ## _clear, 0, 0, 0, 0, EXCMETHODS, \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200448 EXCMEMBERS, EXCGETSET, &_ ## 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, EXCNEW,\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000451}; \
452PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
453
454
455/*
456 * Exception extends BaseException
457 */
458SimpleExtendsException(PyExc_BaseException, Exception,
459 "Common base class for all non-exit exceptions.");
460
461
462/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000463 * TypeError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +0000464 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000465SimpleExtendsException(PyExc_Exception, TypeError,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000466 "Inappropriate argument type.");
467
468
469/*
470 * StopIteration extends Exception
471 */
Nick Coghlan1f7ce622012-01-13 21:43:40 +1000472
473static PyMemberDef StopIteration_members[] = {
474 {"value", T_OBJECT, offsetof(PyStopIterationObject, value), 0,
475 PyDoc_STR("generator return value")},
476 {NULL} /* Sentinel */
477};
478
479static int
480StopIteration_init(PyStopIterationObject *self, PyObject *args, PyObject *kwds)
481{
482 Py_ssize_t size = PyTuple_GET_SIZE(args);
483 PyObject *value;
484
485 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
486 return -1;
487 Py_CLEAR(self->value);
488 if (size > 0)
489 value = PyTuple_GET_ITEM(args, 0);
490 else
491 value = Py_None;
492 Py_INCREF(value);
493 self->value = value;
494 return 0;
495}
496
497static int
498StopIteration_clear(PyStopIterationObject *self)
499{
500 Py_CLEAR(self->value);
501 return BaseException_clear((PyBaseExceptionObject *)self);
502}
503
504static void
505StopIteration_dealloc(PyStopIterationObject *self)
506{
507 _PyObject_GC_UNTRACK(self);
508 StopIteration_clear(self);
509 Py_TYPE(self)->tp_free((PyObject *)self);
510}
511
512static int
513StopIteration_traverse(PyStopIterationObject *self, visitproc visit, void *arg)
514{
515 Py_VISIT(self->value);
516 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
517}
518
519PyObject *
520PyStopIteration_Create(PyObject *value)
521{
522 return PyObject_CallFunctionObjArgs(PyExc_StopIteration, value, NULL);
523}
524
525ComplexExtendsException(
526 PyExc_Exception, /* base */
527 StopIteration, /* name */
528 StopIteration, /* prefix for *_init, etc */
529 0, /* new */
530 0, /* methods */
531 StopIteration_members, /* members */
532 0, /* getset */
533 0, /* str */
534 "Signal the end from iterator.__next__()."
535);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000536
537
538/*
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000539 * GeneratorExit extends BaseException
Thomas Wouters477c8d52006-05-27 19:21:47 +0000540 */
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000541SimpleExtendsException(PyExc_BaseException, GeneratorExit,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000542 "Request that a generator exit.");
543
544
545/*
546 * SystemExit extends BaseException
547 */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000548
549static int
550SystemExit_init(PySystemExitObject *self, PyObject *args, PyObject *kwds)
551{
552 Py_ssize_t size = PyTuple_GET_SIZE(args);
553
554 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
555 return -1;
556
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000557 if (size == 0)
558 return 0;
559 Py_CLEAR(self->code);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000560 if (size == 1)
561 self->code = PyTuple_GET_ITEM(args, 0);
Victor Stinner92236e52011-05-26 14:25:54 +0200562 else /* size > 1 */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000563 self->code = args;
564 Py_INCREF(self->code);
565 return 0;
566}
567
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000568static int
Thomas Wouters477c8d52006-05-27 19:21:47 +0000569SystemExit_clear(PySystemExitObject *self)
570{
571 Py_CLEAR(self->code);
572 return BaseException_clear((PyBaseExceptionObject *)self);
573}
574
575static void
576SystemExit_dealloc(PySystemExitObject *self)
577{
Thomas Wouters89f507f2006-12-13 04:49:30 +0000578 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000579 SystemExit_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +0000580 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000581}
582
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000583static int
Thomas Wouters477c8d52006-05-27 19:21:47 +0000584SystemExit_traverse(PySystemExitObject *self, visitproc visit, void *arg)
585{
586 Py_VISIT(self->code);
587 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
588}
589
590static PyMemberDef SystemExit_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +0000591 {"code", T_OBJECT, offsetof(PySystemExitObject, code), 0,
592 PyDoc_STR("exception code")},
593 {NULL} /* Sentinel */
594};
595
596ComplexExtendsException(PyExc_BaseException, SystemExit, SystemExit,
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200597 0, 0, SystemExit_members, 0, 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000598 "Request to exit from the interpreter.");
599
600/*
601 * KeyboardInterrupt extends BaseException
602 */
603SimpleExtendsException(PyExc_BaseException, KeyboardInterrupt,
604 "Program interrupted by user.");
605
606
607/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000608 * ImportError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +0000609 */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000610
Brett Cannon79ec55e2012-04-12 20:24:54 -0400611static int
612ImportError_init(PyImportErrorObject *self, PyObject *args, PyObject *kwds)
613{
614 PyObject *msg = NULL;
615 PyObject *name = NULL;
616 PyObject *path = NULL;
617
618/* Macro replacement doesn't allow ## to start the first line of a macro,
619 so we move the assignment and NULL check into the if-statement. */
620#define GET_KWD(kwd) { \
621 kwd = PyDict_GetItemString(kwds, #kwd); \
622 if (kwd) { \
623 Py_CLEAR(self->kwd); \
624 self->kwd = kwd; \
625 Py_INCREF(self->kwd);\
626 if (PyDict_DelItemString(kwds, #kwd)) \
627 return -1; \
628 } \
629 }
630
631 if (kwds) {
632 GET_KWD(name);
633 GET_KWD(path);
634 }
635
636 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
637 return -1;
638 if (PyTuple_GET_SIZE(args) != 1)
639 return 0;
640 if (!PyArg_UnpackTuple(args, "ImportError", 1, 1, &msg))
641 return -1;
642
643 Py_CLEAR(self->msg); /* replacing */
644 self->msg = msg;
645 Py_INCREF(self->msg);
646
647 return 0;
648}
649
650static int
651ImportError_clear(PyImportErrorObject *self)
652{
653 Py_CLEAR(self->msg);
654 Py_CLEAR(self->name);
655 Py_CLEAR(self->path);
656 return BaseException_clear((PyBaseExceptionObject *)self);
657}
658
659static void
660ImportError_dealloc(PyImportErrorObject *self)
661{
662 _PyObject_GC_UNTRACK(self);
663 ImportError_clear(self);
664 Py_TYPE(self)->tp_free((PyObject *)self);
665}
666
667static int
668ImportError_traverse(PyImportErrorObject *self, visitproc visit, void *arg)
669{
670 Py_VISIT(self->msg);
671 Py_VISIT(self->name);
672 Py_VISIT(self->path);
673 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
674}
675
676static PyObject *
677ImportError_str(PyImportErrorObject *self)
678{
679 if (self->msg) {
680 Py_INCREF(self->msg);
681 return self->msg;
682 }
683 else {
684 return BaseException_str((PyBaseExceptionObject *)self);
685 }
686}
687
688static PyMemberDef ImportError_members[] = {
689 {"msg", T_OBJECT, offsetof(PyImportErrorObject, msg), 0,
690 PyDoc_STR("exception message")},
691 {"name", T_OBJECT, offsetof(PyImportErrorObject, name), 0,
692 PyDoc_STR("module name")},
693 {"path", T_OBJECT, offsetof(PyImportErrorObject, path), 0,
694 PyDoc_STR("module path")},
695 {NULL} /* Sentinel */
696};
697
698static PyMethodDef ImportError_methods[] = {
699 {NULL}
700};
701
702ComplexExtendsException(PyExc_Exception, ImportError,
703 ImportError, 0 /* new */,
704 ImportError_methods, ImportError_members,
705 0 /* getset */, ImportError_str,
706 "Import can't find module, or can't find name in "
707 "module.");
Thomas Wouters477c8d52006-05-27 19:21:47 +0000708
709/*
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200710 * OSError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +0000711 */
712
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200713#ifdef MS_WINDOWS
714#include "errmap.h"
715#endif
716
Thomas Wouters477c8d52006-05-27 19:21:47 +0000717/* Where a function has a single filename, such as open() or some
718 * of the os module functions, PyErr_SetFromErrnoWithFilename() is
719 * called, giving a third argument which is the filename. But, so
720 * that old code using in-place unpacking doesn't break, e.g.:
721 *
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200722 * except OSError, (errno, strerror):
Thomas Wouters477c8d52006-05-27 19:21:47 +0000723 *
724 * we hack args so that it only contains two items. This also
725 * means we need our own __str__() which prints out the filename
726 * when it was supplied.
727 */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200728
Antoine Pitroue0e27352011-12-15 14:31:28 +0100729/* This function doesn't cleanup on error, the caller should */
730static int
731oserror_parse_args(PyObject **p_args,
732 PyObject **myerrno, PyObject **strerror,
733 PyObject **filename
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200734#ifdef MS_WINDOWS
Antoine Pitroue0e27352011-12-15 14:31:28 +0100735 , PyObject **winerror
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200736#endif
Antoine Pitroue0e27352011-12-15 14:31:28 +0100737 )
738{
739 Py_ssize_t nargs;
740 PyObject *args = *p_args;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000741
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200742 nargs = PyTuple_GET_SIZE(args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000743
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200744#ifdef MS_WINDOWS
745 if (nargs >= 2 && nargs <= 4) {
746 if (!PyArg_UnpackTuple(args, "OSError", 2, 4,
Antoine Pitroue0e27352011-12-15 14:31:28 +0100747 myerrno, strerror, filename, winerror))
748 return -1;
749 if (*winerror && PyLong_Check(*winerror)) {
750 long errcode, winerrcode;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200751 PyObject *newargs;
752 Py_ssize_t i;
753
Antoine Pitroue0e27352011-12-15 14:31:28 +0100754 winerrcode = PyLong_AsLong(*winerror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200755 if (winerrcode == -1 && PyErr_Occurred())
Antoine Pitroue0e27352011-12-15 14:31:28 +0100756 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200757 /* Set errno to the corresponding POSIX errno (overriding
758 first argument). Windows Socket error codes (>= 10000)
759 have the same value as their POSIX counterparts.
760 */
761 if (winerrcode < 10000)
762 errcode = winerror_to_errno(winerrcode);
763 else
764 errcode = winerrcode;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100765 *myerrno = PyLong_FromLong(errcode);
766 if (!*myerrno)
767 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200768 newargs = PyTuple_New(nargs);
769 if (!newargs)
Antoine Pitroue0e27352011-12-15 14:31:28 +0100770 return -1;
771 PyTuple_SET_ITEM(newargs, 0, *myerrno);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200772 for (i = 1; i < nargs; i++) {
773 PyObject *val = PyTuple_GET_ITEM(args, i);
774 Py_INCREF(val);
775 PyTuple_SET_ITEM(newargs, i, val);
776 }
777 Py_DECREF(args);
Antoine Pitroue0e27352011-12-15 14:31:28 +0100778 args = *p_args = newargs;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200779 }
780 }
781#else
782 if (nargs >= 2 && nargs <= 3) {
783 if (!PyArg_UnpackTuple(args, "OSError", 2, 3,
Antoine Pitroue0e27352011-12-15 14:31:28 +0100784 myerrno, strerror, filename))
785 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200786 }
787#endif
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000788
Antoine Pitroue0e27352011-12-15 14:31:28 +0100789 return 0;
790}
Thomas Wouters477c8d52006-05-27 19:21:47 +0000791
Antoine Pitroue0e27352011-12-15 14:31:28 +0100792static int
793oserror_init(PyOSErrorObject *self, PyObject **p_args,
794 PyObject *myerrno, PyObject *strerror,
795 PyObject *filename
796#ifdef MS_WINDOWS
797 , PyObject *winerror
798#endif
799 )
800{
801 PyObject *args = *p_args;
802 Py_ssize_t nargs = PyTuple_GET_SIZE(args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000803
804 /* self->filename will remain Py_None otherwise */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200805 if (filename && filename != Py_None) {
Antoine Pitroue0e27352011-12-15 14:31:28 +0100806 if (Py_TYPE(self) == (PyTypeObject *) PyExc_BlockingIOError &&
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200807 PyNumber_Check(filename)) {
808 /* BlockingIOError's 3rd argument can be the number of
809 * characters written.
810 */
811 self->written = PyNumber_AsSsize_t(filename, PyExc_ValueError);
812 if (self->written == -1 && PyErr_Occurred())
Antoine Pitroue0e27352011-12-15 14:31:28 +0100813 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200814 }
815 else {
816 Py_INCREF(filename);
817 self->filename = filename;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000818
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200819 if (nargs >= 2 && nargs <= 3) {
820 /* filename is removed from the args tuple (for compatibility
821 purposes, see test_exceptions.py) */
Antoine Pitroue0e27352011-12-15 14:31:28 +0100822 PyObject *subslice = PyTuple_GetSlice(args, 0, 2);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200823 if (!subslice)
Antoine Pitroue0e27352011-12-15 14:31:28 +0100824 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000825
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200826 Py_DECREF(args); /* replacing args */
Antoine Pitroue0e27352011-12-15 14:31:28 +0100827 *p_args = args = subslice;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200828 }
829 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000830 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200831 Py_XINCREF(myerrno);
832 self->myerrno = myerrno;
833
834 Py_XINCREF(strerror);
835 self->strerror = strerror;
836
837#ifdef MS_WINDOWS
838 Py_XINCREF(winerror);
839 self->winerror = winerror;
840#endif
841
Antoine Pitroue0e27352011-12-15 14:31:28 +0100842 /* Steals the reference to args */
843 self->args = args;
844 args = NULL;
845
846 return 0;
847}
848
849static PyObject *
850OSError_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
851static int
852OSError_init(PyOSErrorObject *self, PyObject *args, PyObject *kwds);
853
854static int
855oserror_use_init(PyTypeObject *type)
856{
857 /* When __init__ is defined in a OSError subclass, we want any
858 extraneous argument to __new__ to be ignored. The only reasonable
859 solution, given __new__ takes a variable number of arguments,
860 is to defer arg parsing and initialization to __init__.
861
862 But when __new__ is overriden as well, it should call our __new__
863 with the right arguments.
864
865 (see http://bugs.python.org/issue12555#msg148829 )
866 */
867 if (type->tp_init != (initproc) OSError_init &&
868 type->tp_new == (newfunc) OSError_new) {
869 assert((PyObject *) type != PyExc_OSError);
870 return 1;
871 }
872 return 0;
873}
874
875static PyObject *
876OSError_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
877{
878 PyOSErrorObject *self = NULL;
879 PyObject *myerrno = NULL, *strerror = NULL, *filename = NULL;
880#ifdef MS_WINDOWS
881 PyObject *winerror = NULL;
882#endif
883
884 if (!oserror_use_init(type)) {
885 if (!_PyArg_NoKeywords(type->tp_name, kwds))
886 return NULL;
887
888 Py_INCREF(args);
889 if (oserror_parse_args(&args, &myerrno, &strerror, &filename
890#ifdef MS_WINDOWS
891 , &winerror
892#endif
893 ))
894 goto error;
895
896 if (myerrno && PyLong_Check(myerrno) &&
897 errnomap && (PyObject *) type == PyExc_OSError) {
898 PyObject *newtype;
899 newtype = PyDict_GetItem(errnomap, myerrno);
900 if (newtype) {
901 assert(PyType_Check(newtype));
902 type = (PyTypeObject *) newtype;
903 }
904 else if (PyErr_Occurred())
905 goto error;
906 }
907 }
908
909 self = (PyOSErrorObject *) type->tp_alloc(type, 0);
910 if (!self)
911 goto error;
912
913 self->dict = NULL;
914 self->traceback = self->cause = self->context = NULL;
915 self->written = -1;
916
917 if (!oserror_use_init(type)) {
918 if (oserror_init(self, &args, myerrno, strerror, filename
919#ifdef MS_WINDOWS
920 , winerror
921#endif
922 ))
923 goto error;
924 }
925
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200926 return (PyObject *) self;
927
928error:
929 Py_XDECREF(args);
930 Py_XDECREF(self);
931 return NULL;
932}
933
934static int
Antoine Pitroue0e27352011-12-15 14:31:28 +0100935OSError_init(PyOSErrorObject *self, PyObject *args, PyObject *kwds)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200936{
Antoine Pitroue0e27352011-12-15 14:31:28 +0100937 PyObject *myerrno = NULL, *strerror = NULL, *filename = NULL;
938#ifdef MS_WINDOWS
939 PyObject *winerror = NULL;
940#endif
941
942 if (!oserror_use_init(Py_TYPE(self)))
943 /* Everything already done in OSError_new */
944 return 0;
945
946 if (!_PyArg_NoKeywords(Py_TYPE(self)->tp_name, kwds))
947 return -1;
948
949 Py_INCREF(args);
950 if (oserror_parse_args(&args, &myerrno, &strerror, &filename
951#ifdef MS_WINDOWS
952 , &winerror
953#endif
954 ))
955 goto error;
956
957 if (oserror_init(self, &args, myerrno, strerror, filename
958#ifdef MS_WINDOWS
959 , winerror
960#endif
961 ))
962 goto error;
963
Thomas Wouters477c8d52006-05-27 19:21:47 +0000964 return 0;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100965
966error:
967 Py_XDECREF(args);
968 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000969}
970
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000971static int
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200972OSError_clear(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000973{
974 Py_CLEAR(self->myerrno);
975 Py_CLEAR(self->strerror);
976 Py_CLEAR(self->filename);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200977#ifdef MS_WINDOWS
978 Py_CLEAR(self->winerror);
979#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000980 return BaseException_clear((PyBaseExceptionObject *)self);
981}
982
983static void
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200984OSError_dealloc(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000985{
Thomas Wouters89f507f2006-12-13 04:49:30 +0000986 _PyObject_GC_UNTRACK(self);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200987 OSError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +0000988 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000989}
990
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000991static int
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200992OSError_traverse(PyOSErrorObject *self, visitproc visit,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000993 void *arg)
994{
995 Py_VISIT(self->myerrno);
996 Py_VISIT(self->strerror);
997 Py_VISIT(self->filename);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200998#ifdef MS_WINDOWS
999 Py_VISIT(self->winerror);
1000#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00001001 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1002}
1003
1004static PyObject *
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001005OSError_str(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001006{
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001007#ifdef MS_WINDOWS
1008 /* If available, winerror has the priority over myerrno */
1009 if (self->winerror && self->filename)
1010 return PyUnicode_FromFormat("[Error %S] %S: %R",
1011 self->winerror ? self->winerror: Py_None,
1012 self->strerror ? self->strerror: Py_None,
1013 self->filename);
1014 if (self->winerror && self->strerror)
1015 return PyUnicode_FromFormat("[Error %S] %S",
1016 self->winerror ? self->winerror: Py_None,
1017 self->strerror ? self->strerror: Py_None);
1018#endif
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001019 if (self->filename)
1020 return PyUnicode_FromFormat("[Errno %S] %S: %R",
1021 self->myerrno ? self->myerrno: Py_None,
1022 self->strerror ? self->strerror: Py_None,
1023 self->filename);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001024 if (self->myerrno && self->strerror)
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001025 return PyUnicode_FromFormat("[Errno %S] %S",
1026 self->myerrno ? self->myerrno: Py_None,
1027 self->strerror ? self->strerror: Py_None);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001028 return BaseException_str((PyBaseExceptionObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001029}
1030
Thomas Wouters477c8d52006-05-27 19:21:47 +00001031static PyObject *
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001032OSError_reduce(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001033{
1034 PyObject *args = self->args;
1035 PyObject *res = NULL, *tmp;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001036
Thomas Wouters477c8d52006-05-27 19:21:47 +00001037 /* self->args is only the first two real arguments if there was a
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001038 * file name given to OSError. */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001039 if (PyTuple_GET_SIZE(args) == 2 && self->filename) {
Thomas Wouters477c8d52006-05-27 19:21:47 +00001040 args = PyTuple_New(3);
Benjamin Peterson90b13582012-02-03 19:22:31 -05001041 if (!args)
1042 return NULL;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001043
1044 tmp = PyTuple_GET_ITEM(self->args, 0);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001045 Py_INCREF(tmp);
1046 PyTuple_SET_ITEM(args, 0, tmp);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001047
1048 tmp = PyTuple_GET_ITEM(self->args, 1);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001049 Py_INCREF(tmp);
1050 PyTuple_SET_ITEM(args, 1, tmp);
1051
1052 Py_INCREF(self->filename);
1053 PyTuple_SET_ITEM(args, 2, self->filename);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001054 } else
Thomas Wouters477c8d52006-05-27 19:21:47 +00001055 Py_INCREF(args);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001056
1057 if (self->dict)
Christian Heimes90aa7642007-12-19 02:45:37 +00001058 res = PyTuple_Pack(3, Py_TYPE(self), args, self->dict);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001059 else
Christian Heimes90aa7642007-12-19 02:45:37 +00001060 res = PyTuple_Pack(2, Py_TYPE(self), args);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001061 Py_DECREF(args);
1062 return res;
1063}
1064
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001065static PyObject *
1066OSError_written_get(PyOSErrorObject *self, void *context)
1067{
1068 if (self->written == -1) {
1069 PyErr_SetString(PyExc_AttributeError, "characters_written");
1070 return NULL;
1071 }
1072 return PyLong_FromSsize_t(self->written);
1073}
Thomas Wouters477c8d52006-05-27 19:21:47 +00001074
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001075static int
1076OSError_written_set(PyOSErrorObject *self, PyObject *arg, void *context)
1077{
1078 Py_ssize_t n;
1079 n = PyNumber_AsSsize_t(arg, PyExc_ValueError);
1080 if (n == -1 && PyErr_Occurred())
1081 return -1;
1082 self->written = n;
1083 return 0;
1084}
1085
1086static PyMemberDef OSError_members[] = {
1087 {"errno", T_OBJECT, offsetof(PyOSErrorObject, myerrno), 0,
1088 PyDoc_STR("POSIX exception code")},
1089 {"strerror", T_OBJECT, offsetof(PyOSErrorObject, strerror), 0,
1090 PyDoc_STR("exception strerror")},
1091 {"filename", T_OBJECT, offsetof(PyOSErrorObject, filename), 0,
1092 PyDoc_STR("exception filename")},
1093#ifdef MS_WINDOWS
1094 {"winerror", T_OBJECT, offsetof(PyOSErrorObject, winerror), 0,
1095 PyDoc_STR("Win32 exception code")},
1096#endif
1097 {NULL} /* Sentinel */
1098};
1099
1100static PyMethodDef OSError_methods[] = {
1101 {"__reduce__", (PyCFunction)OSError_reduce, METH_NOARGS},
Thomas Wouters477c8d52006-05-27 19:21:47 +00001102 {NULL}
1103};
1104
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001105static PyGetSetDef OSError_getset[] = {
1106 {"characters_written", (getter) OSError_written_get,
1107 (setter) OSError_written_set, NULL},
1108 {NULL}
1109};
1110
1111
1112ComplexExtendsException(PyExc_Exception, OSError,
1113 OSError, OSError_new,
1114 OSError_methods, OSError_members, OSError_getset,
1115 OSError_str,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001116 "Base class for I/O related errors.");
1117
1118
1119/*
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001120 * Various OSError subclasses
Thomas Wouters477c8d52006-05-27 19:21:47 +00001121 */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001122MiddlingExtendsException(PyExc_OSError, BlockingIOError, OSError,
1123 "I/O operation would block.");
1124MiddlingExtendsException(PyExc_OSError, ConnectionError, OSError,
1125 "Connection error.");
1126MiddlingExtendsException(PyExc_OSError, ChildProcessError, OSError,
1127 "Child process error.");
1128MiddlingExtendsException(PyExc_ConnectionError, BrokenPipeError, OSError,
1129 "Broken pipe.");
1130MiddlingExtendsException(PyExc_ConnectionError, ConnectionAbortedError, OSError,
1131 "Connection aborted.");
1132MiddlingExtendsException(PyExc_ConnectionError, ConnectionRefusedError, OSError,
1133 "Connection refused.");
1134MiddlingExtendsException(PyExc_ConnectionError, ConnectionResetError, OSError,
1135 "Connection reset.");
1136MiddlingExtendsException(PyExc_OSError, FileExistsError, OSError,
1137 "File already exists.");
1138MiddlingExtendsException(PyExc_OSError, FileNotFoundError, OSError,
1139 "File not found.");
1140MiddlingExtendsException(PyExc_OSError, IsADirectoryError, OSError,
1141 "Operation doesn't work on directories.");
1142MiddlingExtendsException(PyExc_OSError, NotADirectoryError, OSError,
1143 "Operation only works on directories.");
1144MiddlingExtendsException(PyExc_OSError, InterruptedError, OSError,
1145 "Interrupted by signal.");
1146MiddlingExtendsException(PyExc_OSError, PermissionError, OSError,
1147 "Not enough permissions.");
1148MiddlingExtendsException(PyExc_OSError, ProcessLookupError, OSError,
1149 "Process not found.");
1150MiddlingExtendsException(PyExc_OSError, TimeoutError, OSError,
1151 "Timeout expired.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001152
1153/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001154 * EOFError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001155 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001156SimpleExtendsException(PyExc_Exception, EOFError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001157 "Read beyond end of file.");
1158
1159
1160/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001161 * RuntimeError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001162 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001163SimpleExtendsException(PyExc_Exception, RuntimeError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001164 "Unspecified run-time error.");
1165
1166
1167/*
1168 * NotImplementedError extends RuntimeError
1169 */
1170SimpleExtendsException(PyExc_RuntimeError, NotImplementedError,
1171 "Method or function hasn't been implemented yet.");
1172
1173/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001174 * NameError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001175 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001176SimpleExtendsException(PyExc_Exception, NameError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001177 "Name not found globally.");
1178
1179/*
1180 * UnboundLocalError extends NameError
1181 */
1182SimpleExtendsException(PyExc_NameError, UnboundLocalError,
1183 "Local name referenced but not bound to a value.");
1184
1185/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001186 * AttributeError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001187 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001188SimpleExtendsException(PyExc_Exception, AttributeError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001189 "Attribute not found.");
1190
1191
1192/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001193 * SyntaxError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001194 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001195
1196static int
1197SyntaxError_init(PySyntaxErrorObject *self, PyObject *args, PyObject *kwds)
1198{
1199 PyObject *info = NULL;
1200 Py_ssize_t lenargs = PyTuple_GET_SIZE(args);
1201
1202 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1203 return -1;
1204
1205 if (lenargs >= 1) {
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001206 Py_CLEAR(self->msg);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001207 self->msg = PyTuple_GET_ITEM(args, 0);
1208 Py_INCREF(self->msg);
1209 }
1210 if (lenargs == 2) {
1211 info = PyTuple_GET_ITEM(args, 1);
1212 info = PySequence_Tuple(info);
Benjamin Peterson90b13582012-02-03 19:22:31 -05001213 if (!info)
1214 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001215
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001216 if (PyTuple_GET_SIZE(info) != 4) {
1217 /* not a very good error message, but it's what Python 2.4 gives */
1218 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
1219 Py_DECREF(info);
1220 return -1;
1221 }
1222
1223 Py_CLEAR(self->filename);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001224 self->filename = PyTuple_GET_ITEM(info, 0);
1225 Py_INCREF(self->filename);
1226
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001227 Py_CLEAR(self->lineno);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001228 self->lineno = PyTuple_GET_ITEM(info, 1);
1229 Py_INCREF(self->lineno);
1230
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001231 Py_CLEAR(self->offset);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001232 self->offset = PyTuple_GET_ITEM(info, 2);
1233 Py_INCREF(self->offset);
1234
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001235 Py_CLEAR(self->text);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001236 self->text = PyTuple_GET_ITEM(info, 3);
1237 Py_INCREF(self->text);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001238
1239 Py_DECREF(info);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001240 }
1241 return 0;
1242}
1243
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001244static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001245SyntaxError_clear(PySyntaxErrorObject *self)
1246{
1247 Py_CLEAR(self->msg);
1248 Py_CLEAR(self->filename);
1249 Py_CLEAR(self->lineno);
1250 Py_CLEAR(self->offset);
1251 Py_CLEAR(self->text);
1252 Py_CLEAR(self->print_file_and_line);
1253 return BaseException_clear((PyBaseExceptionObject *)self);
1254}
1255
1256static void
1257SyntaxError_dealloc(PySyntaxErrorObject *self)
1258{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001259 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001260 SyntaxError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +00001261 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001262}
1263
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001264static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001265SyntaxError_traverse(PySyntaxErrorObject *self, visitproc visit, void *arg)
1266{
1267 Py_VISIT(self->msg);
1268 Py_VISIT(self->filename);
1269 Py_VISIT(self->lineno);
1270 Py_VISIT(self->offset);
1271 Py_VISIT(self->text);
1272 Py_VISIT(self->print_file_and_line);
1273 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1274}
1275
1276/* This is called "my_basename" instead of just "basename" to avoid name
1277 conflicts with glibc; basename is already prototyped if _GNU_SOURCE is
1278 defined, and Python does define that. */
Victor Stinner6237daf2010-04-28 17:26:19 +00001279static PyObject*
1280my_basename(PyObject *name)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001281{
Victor Stinner6237daf2010-04-28 17:26:19 +00001282 Py_ssize_t i, size, offset;
Victor Stinner31392e72011-10-05 20:14:23 +02001283 int kind;
1284 void *data;
1285
1286 if (PyUnicode_READY(name))
1287 return NULL;
1288 kind = PyUnicode_KIND(name);
1289 data = PyUnicode_DATA(name);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001290 size = PyUnicode_GET_LENGTH(name);
Victor Stinner6237daf2010-04-28 17:26:19 +00001291 offset = 0;
1292 for(i=0; i < size; i++) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001293 if (PyUnicode_READ(kind, data, i) == SEP)
Victor Stinner6237daf2010-04-28 17:26:19 +00001294 offset = i + 1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001295 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001296 if (offset != 0)
1297 return PyUnicode_Substring(name, offset, size);
1298 else {
Victor Stinner6237daf2010-04-28 17:26:19 +00001299 Py_INCREF(name);
1300 return name;
1301 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001302}
1303
1304
1305static PyObject *
1306SyntaxError_str(PySyntaxErrorObject *self)
1307{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001308 int have_lineno = 0;
Victor Stinner6237daf2010-04-28 17:26:19 +00001309 PyObject *filename;
1310 PyObject *result;
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001311 /* Below, we always ignore overflow errors, just printing -1.
1312 Still, we cannot allow an OverflowError to be raised, so
1313 we need to call PyLong_AsLongAndOverflow. */
1314 int overflow;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001315
1316 /* XXX -- do all the additional formatting with filename and
1317 lineno here */
1318
Neal Norwitzed2b7392007-08-26 04:51:10 +00001319 if (self->filename && PyUnicode_Check(self->filename)) {
Victor Stinner6237daf2010-04-28 17:26:19 +00001320 filename = my_basename(self->filename);
1321 if (filename == NULL)
1322 return NULL;
1323 } else {
1324 filename = NULL;
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001325 }
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001326 have_lineno = (self->lineno != NULL) && PyLong_CheckExact(self->lineno);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001327
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001328 if (!filename && !have_lineno)
Thomas Heller519a0422007-11-15 20:48:54 +00001329 return PyObject_Str(self->msg ? self->msg : Py_None);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001330
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001331 if (filename && have_lineno)
Victor Stinner6237daf2010-04-28 17:26:19 +00001332 result = PyUnicode_FromFormat("%S (%U, line %ld)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001333 self->msg ? self->msg : Py_None,
Victor Stinner6237daf2010-04-28 17:26:19 +00001334 filename,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001335 PyLong_AsLongAndOverflow(self->lineno, &overflow));
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001336 else if (filename)
Victor Stinner6237daf2010-04-28 17:26:19 +00001337 result = PyUnicode_FromFormat("%S (%U)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001338 self->msg ? self->msg : Py_None,
Victor Stinner6237daf2010-04-28 17:26:19 +00001339 filename);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001340 else /* only have_lineno */
Victor Stinner6237daf2010-04-28 17:26:19 +00001341 result = PyUnicode_FromFormat("%S (line %ld)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001342 self->msg ? self->msg : Py_None,
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001343 PyLong_AsLongAndOverflow(self->lineno, &overflow));
Victor Stinner6237daf2010-04-28 17:26:19 +00001344 Py_XDECREF(filename);
1345 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001346}
1347
1348static PyMemberDef SyntaxError_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +00001349 {"msg", T_OBJECT, offsetof(PySyntaxErrorObject, msg), 0,
1350 PyDoc_STR("exception msg")},
1351 {"filename", T_OBJECT, offsetof(PySyntaxErrorObject, filename), 0,
1352 PyDoc_STR("exception filename")},
1353 {"lineno", T_OBJECT, offsetof(PySyntaxErrorObject, lineno), 0,
1354 PyDoc_STR("exception lineno")},
1355 {"offset", T_OBJECT, offsetof(PySyntaxErrorObject, offset), 0,
1356 PyDoc_STR("exception offset")},
1357 {"text", T_OBJECT, offsetof(PySyntaxErrorObject, text), 0,
1358 PyDoc_STR("exception text")},
1359 {"print_file_and_line", T_OBJECT,
1360 offsetof(PySyntaxErrorObject, print_file_and_line), 0,
1361 PyDoc_STR("exception print_file_and_line")},
1362 {NULL} /* Sentinel */
1363};
1364
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001365ComplexExtendsException(PyExc_Exception, SyntaxError, SyntaxError,
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001366 0, 0, SyntaxError_members, 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001367 SyntaxError_str, "Invalid syntax.");
1368
1369
1370/*
1371 * IndentationError extends SyntaxError
1372 */
1373MiddlingExtendsException(PyExc_SyntaxError, IndentationError, SyntaxError,
1374 "Improper indentation.");
1375
1376
1377/*
1378 * TabError extends IndentationError
1379 */
1380MiddlingExtendsException(PyExc_IndentationError, TabError, SyntaxError,
1381 "Improper mixture of spaces and tabs.");
1382
1383
1384/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001385 * LookupError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001386 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001387SimpleExtendsException(PyExc_Exception, LookupError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001388 "Base class for lookup errors.");
1389
1390
1391/*
1392 * IndexError extends LookupError
1393 */
1394SimpleExtendsException(PyExc_LookupError, IndexError,
1395 "Sequence index out of range.");
1396
1397
1398/*
1399 * KeyError extends LookupError
1400 */
1401static PyObject *
1402KeyError_str(PyBaseExceptionObject *self)
1403{
1404 /* If args is a tuple of exactly one item, apply repr to args[0].
1405 This is done so that e.g. the exception raised by {}[''] prints
1406 KeyError: ''
1407 rather than the confusing
1408 KeyError
1409 alone. The downside is that if KeyError is raised with an explanatory
1410 string, that string will be displayed in quotes. Too bad.
1411 If args is anything else, use the default BaseException__str__().
1412 */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001413 if (PyTuple_GET_SIZE(self->args) == 1) {
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001414 return PyObject_Repr(PyTuple_GET_ITEM(self->args, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001415 }
1416 return BaseException_str(self);
1417}
1418
1419ComplexExtendsException(PyExc_LookupError, KeyError, BaseException,
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001420 0, 0, 0, 0, KeyError_str, "Mapping key not found.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001421
1422
1423/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001424 * ValueError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001425 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001426SimpleExtendsException(PyExc_Exception, ValueError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001427 "Inappropriate argument value (of correct type).");
1428
1429/*
1430 * UnicodeError extends ValueError
1431 */
1432
1433SimpleExtendsException(PyExc_ValueError, UnicodeError,
1434 "Unicode related error.");
1435
Thomas Wouters477c8d52006-05-27 19:21:47 +00001436static PyObject *
Guido van Rossum98297ee2007-11-06 21:34:58 +00001437get_string(PyObject *attr, const char *name)
Walter Dörwald612344f2007-05-04 19:28:21 +00001438{
1439 if (!attr) {
1440 PyErr_Format(PyExc_TypeError, "%.200s attribute not set", name);
1441 return NULL;
1442 }
1443
Christian Heimes72b710a2008-05-26 13:28:38 +00001444 if (!PyBytes_Check(attr)) {
Walter Dörwald612344f2007-05-04 19:28:21 +00001445 PyErr_Format(PyExc_TypeError, "%.200s attribute must be bytes", name);
1446 return NULL;
1447 }
1448 Py_INCREF(attr);
1449 return attr;
1450}
1451
1452static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00001453get_unicode(PyObject *attr, const char *name)
1454{
1455 if (!attr) {
1456 PyErr_Format(PyExc_TypeError, "%.200s attribute not set", name);
1457 return NULL;
1458 }
1459
1460 if (!PyUnicode_Check(attr)) {
1461 PyErr_Format(PyExc_TypeError,
1462 "%.200s attribute must be unicode", name);
1463 return NULL;
1464 }
1465 Py_INCREF(attr);
1466 return attr;
1467}
1468
Walter Dörwaldd2034312007-05-18 16:29:38 +00001469static int
1470set_unicodefromstring(PyObject **attr, const char *value)
1471{
1472 PyObject *obj = PyUnicode_FromString(value);
1473 if (!obj)
1474 return -1;
1475 Py_CLEAR(*attr);
1476 *attr = obj;
1477 return 0;
1478}
1479
Thomas Wouters477c8d52006-05-27 19:21:47 +00001480PyObject *
1481PyUnicodeEncodeError_GetEncoding(PyObject *exc)
1482{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001483 return get_unicode(((PyUnicodeErrorObject *)exc)->encoding, "encoding");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001484}
1485
1486PyObject *
1487PyUnicodeDecodeError_GetEncoding(PyObject *exc)
1488{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001489 return get_unicode(((PyUnicodeErrorObject *)exc)->encoding, "encoding");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001490}
1491
1492PyObject *
1493PyUnicodeEncodeError_GetObject(PyObject *exc)
1494{
1495 return get_unicode(((PyUnicodeErrorObject *)exc)->object, "object");
1496}
1497
1498PyObject *
1499PyUnicodeDecodeError_GetObject(PyObject *exc)
1500{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001501 return get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001502}
1503
1504PyObject *
1505PyUnicodeTranslateError_GetObject(PyObject *exc)
1506{
1507 return get_unicode(((PyUnicodeErrorObject *)exc)->object, "object");
1508}
1509
1510int
1511PyUnicodeEncodeError_GetStart(PyObject *exc, Py_ssize_t *start)
1512{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001513 Py_ssize_t size;
1514 PyObject *obj = get_unicode(((PyUnicodeErrorObject *)exc)->object,
1515 "object");
1516 if (!obj)
1517 return -1;
1518 *start = ((PyUnicodeErrorObject *)exc)->start;
Victor Stinner9e30aa52011-11-21 02:49:52 +01001519 size = PyUnicode_GET_LENGTH(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001520 if (*start<0)
1521 *start = 0; /*XXX check for values <0*/
1522 if (*start>=size)
1523 *start = size-1;
1524 Py_DECREF(obj);
1525 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001526}
1527
1528
1529int
1530PyUnicodeDecodeError_GetStart(PyObject *exc, Py_ssize_t *start)
1531{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001532 Py_ssize_t size;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001533 PyObject *obj = get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001534 if (!obj)
1535 return -1;
Christian Heimes72b710a2008-05-26 13:28:38 +00001536 size = PyBytes_GET_SIZE(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001537 *start = ((PyUnicodeErrorObject *)exc)->start;
1538 if (*start<0)
1539 *start = 0;
1540 if (*start>=size)
1541 *start = size-1;
1542 Py_DECREF(obj);
1543 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001544}
1545
1546
1547int
1548PyUnicodeTranslateError_GetStart(PyObject *exc, Py_ssize_t *start)
1549{
1550 return PyUnicodeEncodeError_GetStart(exc, start);
1551}
1552
1553
1554int
1555PyUnicodeEncodeError_SetStart(PyObject *exc, Py_ssize_t start)
1556{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001557 ((PyUnicodeErrorObject *)exc)->start = start;
1558 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001559}
1560
1561
1562int
1563PyUnicodeDecodeError_SetStart(PyObject *exc, Py_ssize_t start)
1564{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001565 ((PyUnicodeErrorObject *)exc)->start = start;
1566 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001567}
1568
1569
1570int
1571PyUnicodeTranslateError_SetStart(PyObject *exc, Py_ssize_t start)
1572{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001573 ((PyUnicodeErrorObject *)exc)->start = start;
1574 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001575}
1576
1577
1578int
1579PyUnicodeEncodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
1580{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001581 Py_ssize_t size;
1582 PyObject *obj = get_unicode(((PyUnicodeErrorObject *)exc)->object,
1583 "object");
1584 if (!obj)
1585 return -1;
1586 *end = ((PyUnicodeErrorObject *)exc)->end;
Victor Stinner9e30aa52011-11-21 02:49:52 +01001587 size = PyUnicode_GET_LENGTH(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001588 if (*end<1)
1589 *end = 1;
1590 if (*end>size)
1591 *end = size;
1592 Py_DECREF(obj);
1593 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001594}
1595
1596
1597int
1598PyUnicodeDecodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
1599{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001600 Py_ssize_t size;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001601 PyObject *obj = get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001602 if (!obj)
1603 return -1;
Christian Heimes72b710a2008-05-26 13:28:38 +00001604 size = PyBytes_GET_SIZE(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001605 *end = ((PyUnicodeErrorObject *)exc)->end;
1606 if (*end<1)
1607 *end = 1;
1608 if (*end>size)
1609 *end = size;
1610 Py_DECREF(obj);
1611 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001612}
1613
1614
1615int
1616PyUnicodeTranslateError_GetEnd(PyObject *exc, Py_ssize_t *start)
1617{
1618 return PyUnicodeEncodeError_GetEnd(exc, start);
1619}
1620
1621
1622int
1623PyUnicodeEncodeError_SetEnd(PyObject *exc, Py_ssize_t end)
1624{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001625 ((PyUnicodeErrorObject *)exc)->end = end;
1626 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001627}
1628
1629
1630int
1631PyUnicodeDecodeError_SetEnd(PyObject *exc, Py_ssize_t end)
1632{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001633 ((PyUnicodeErrorObject *)exc)->end = end;
1634 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001635}
1636
1637
1638int
1639PyUnicodeTranslateError_SetEnd(PyObject *exc, Py_ssize_t end)
1640{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001641 ((PyUnicodeErrorObject *)exc)->end = end;
1642 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001643}
1644
1645PyObject *
1646PyUnicodeEncodeError_GetReason(PyObject *exc)
1647{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001648 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001649}
1650
1651
1652PyObject *
1653PyUnicodeDecodeError_GetReason(PyObject *exc)
1654{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001655 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001656}
1657
1658
1659PyObject *
1660PyUnicodeTranslateError_GetReason(PyObject *exc)
1661{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001662 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001663}
1664
1665
1666int
1667PyUnicodeEncodeError_SetReason(PyObject *exc, const char *reason)
1668{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001669 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1670 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001671}
1672
1673
1674int
1675PyUnicodeDecodeError_SetReason(PyObject *exc, const char *reason)
1676{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001677 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1678 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001679}
1680
1681
1682int
1683PyUnicodeTranslateError_SetReason(PyObject *exc, const char *reason)
1684{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001685 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1686 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001687}
1688
1689
Thomas Wouters477c8d52006-05-27 19:21:47 +00001690static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001691UnicodeError_clear(PyUnicodeErrorObject *self)
1692{
1693 Py_CLEAR(self->encoding);
1694 Py_CLEAR(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001695 Py_CLEAR(self->reason);
1696 return BaseException_clear((PyBaseExceptionObject *)self);
1697}
1698
1699static void
1700UnicodeError_dealloc(PyUnicodeErrorObject *self)
1701{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001702 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001703 UnicodeError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +00001704 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001705}
1706
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001707static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001708UnicodeError_traverse(PyUnicodeErrorObject *self, visitproc visit, void *arg)
1709{
1710 Py_VISIT(self->encoding);
1711 Py_VISIT(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001712 Py_VISIT(self->reason);
1713 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1714}
1715
1716static PyMemberDef UnicodeError_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +00001717 {"encoding", T_OBJECT, offsetof(PyUnicodeErrorObject, encoding), 0,
1718 PyDoc_STR("exception encoding")},
1719 {"object", T_OBJECT, offsetof(PyUnicodeErrorObject, object), 0,
1720 PyDoc_STR("exception object")},
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001721 {"start", T_PYSSIZET, offsetof(PyUnicodeErrorObject, start), 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001722 PyDoc_STR("exception start")},
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001723 {"end", T_PYSSIZET, offsetof(PyUnicodeErrorObject, end), 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001724 PyDoc_STR("exception end")},
1725 {"reason", T_OBJECT, offsetof(PyUnicodeErrorObject, reason), 0,
1726 PyDoc_STR("exception reason")},
1727 {NULL} /* Sentinel */
1728};
1729
1730
1731/*
1732 * UnicodeEncodeError extends UnicodeError
1733 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001734
1735static int
1736UnicodeEncodeError_init(PyObject *self, PyObject *args, PyObject *kwds)
1737{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001738 PyUnicodeErrorObject *err;
1739
Thomas Wouters477c8d52006-05-27 19:21:47 +00001740 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1741 return -1;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001742
1743 err = (PyUnicodeErrorObject *)self;
1744
1745 Py_CLEAR(err->encoding);
1746 Py_CLEAR(err->object);
1747 Py_CLEAR(err->reason);
1748
1749 if (!PyArg_ParseTuple(args, "O!O!nnO!",
1750 &PyUnicode_Type, &err->encoding,
1751 &PyUnicode_Type, &err->object,
1752 &err->start,
1753 &err->end,
1754 &PyUnicode_Type, &err->reason)) {
1755 err->encoding = err->object = err->reason = NULL;
1756 return -1;
1757 }
1758
Martin v. Löwisb09af032011-11-04 11:16:41 +01001759 if (PyUnicode_READY(err->object) < -1) {
1760 err->encoding = NULL;
1761 return -1;
1762 }
1763
Guido van Rossum98297ee2007-11-06 21:34:58 +00001764 Py_INCREF(err->encoding);
1765 Py_INCREF(err->object);
1766 Py_INCREF(err->reason);
1767
1768 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001769}
1770
1771static PyObject *
1772UnicodeEncodeError_str(PyObject *self)
1773{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001774 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00001775 PyObject *result = NULL;
1776 PyObject *reason_str = NULL;
1777 PyObject *encoding_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001778
Eric Smith0facd772010-02-24 15:42:29 +00001779 /* Get reason and encoding as strings, which they might not be if
1780 they've been modified after we were contructed. */
1781 reason_str = PyObject_Str(uself->reason);
1782 if (reason_str == NULL)
1783 goto done;
1784 encoding_str = PyObject_Str(uself->encoding);
1785 if (encoding_str == NULL)
1786 goto done;
1787
Victor Stinnerda1ddf32011-11-20 22:50:23 +01001788 if (uself->start < PyUnicode_GET_LENGTH(uself->object) && uself->end == uself->start+1) {
1789 Py_UCS4 badchar = PyUnicode_ReadChar(uself->object, uself->start);
Walter Dörwald787b03b2007-06-05 13:29:29 +00001790 const char *fmt;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001791 if (badchar <= 0xff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00001792 fmt = "'%U' codec can't encode character '\\x%02x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001793 else if (badchar <= 0xffff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00001794 fmt = "'%U' codec can't encode character '\\u%04x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001795 else
Walter Dörwald32a4c712007-06-20 09:25:34 +00001796 fmt = "'%U' codec can't encode character '\\U%08x' in position %zd: %U";
Eric Smith0facd772010-02-24 15:42:29 +00001797 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00001798 fmt,
Eric Smith0facd772010-02-24 15:42:29 +00001799 encoding_str,
Victor Stinnerda1ddf32011-11-20 22:50:23 +01001800 (int)badchar,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001801 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00001802 reason_str);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001803 }
Eric Smith0facd772010-02-24 15:42:29 +00001804 else {
1805 result = PyUnicode_FromFormat(
1806 "'%U' codec can't encode characters in position %zd-%zd: %U",
1807 encoding_str,
1808 uself->start,
1809 uself->end-1,
1810 reason_str);
1811 }
1812done:
1813 Py_XDECREF(reason_str);
1814 Py_XDECREF(encoding_str);
1815 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001816}
1817
1818static PyTypeObject _PyExc_UnicodeEncodeError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001819 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00001820 "UnicodeEncodeError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00001821 sizeof(PyUnicodeErrorObject), 0,
1822 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1823 (reprfunc)UnicodeEncodeError_str, 0, 0, 0,
1824 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001825 PyDoc_STR("Unicode encoding error."), (traverseproc)UnicodeError_traverse,
1826 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001827 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001828 (initproc)UnicodeEncodeError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001829};
1830PyObject *PyExc_UnicodeEncodeError = (PyObject *)&_PyExc_UnicodeEncodeError;
1831
1832PyObject *
1833PyUnicodeEncodeError_Create(
1834 const char *encoding, const Py_UNICODE *object, Py_ssize_t length,
1835 Py_ssize_t start, Py_ssize_t end, const char *reason)
1836{
Victor Stinner7eeb5b52010-06-07 19:57:46 +00001837 return PyObject_CallFunction(PyExc_UnicodeEncodeError, "su#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001838 encoding, object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001839}
1840
1841
1842/*
1843 * UnicodeDecodeError extends UnicodeError
1844 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001845
1846static int
1847UnicodeDecodeError_init(PyObject *self, PyObject *args, PyObject *kwds)
1848{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001849 PyUnicodeErrorObject *ude;
1850 const char *data;
1851 Py_ssize_t size;
1852
Thomas Wouters477c8d52006-05-27 19:21:47 +00001853 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1854 return -1;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001855
1856 ude = (PyUnicodeErrorObject *)self;
1857
1858 Py_CLEAR(ude->encoding);
1859 Py_CLEAR(ude->object);
1860 Py_CLEAR(ude->reason);
1861
1862 if (!PyArg_ParseTuple(args, "O!OnnO!",
1863 &PyUnicode_Type, &ude->encoding,
1864 &ude->object,
1865 &ude->start,
1866 &ude->end,
1867 &PyUnicode_Type, &ude->reason)) {
1868 ude->encoding = ude->object = ude->reason = NULL;
1869 return -1;
1870 }
1871
Christian Heimes72b710a2008-05-26 13:28:38 +00001872 if (!PyBytes_Check(ude->object)) {
Guido van Rossum98297ee2007-11-06 21:34:58 +00001873 if (PyObject_AsReadBuffer(ude->object, (const void **)&data, &size)) {
1874 ude->encoding = ude->object = ude->reason = NULL;
1875 return -1;
1876 }
Christian Heimes72b710a2008-05-26 13:28:38 +00001877 ude->object = PyBytes_FromStringAndSize(data, size);
Guido van Rossum98297ee2007-11-06 21:34:58 +00001878 }
1879 else {
1880 Py_INCREF(ude->object);
1881 }
1882
1883 Py_INCREF(ude->encoding);
1884 Py_INCREF(ude->reason);
1885
1886 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001887}
1888
1889static PyObject *
1890UnicodeDecodeError_str(PyObject *self)
1891{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001892 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00001893 PyObject *result = NULL;
1894 PyObject *reason_str = NULL;
1895 PyObject *encoding_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001896
Eric Smith0facd772010-02-24 15:42:29 +00001897 /* Get reason and encoding as strings, which they might not be if
1898 they've been modified after we were contructed. */
1899 reason_str = PyObject_Str(uself->reason);
1900 if (reason_str == NULL)
1901 goto done;
1902 encoding_str = PyObject_Str(uself->encoding);
1903 if (encoding_str == NULL)
1904 goto done;
1905
1906 if (uself->start < PyBytes_GET_SIZE(uself->object) && uself->end == uself->start+1) {
Christian Heimes72b710a2008-05-26 13:28:38 +00001907 int byte = (int)(PyBytes_AS_STRING(((PyUnicodeErrorObject *)self)->object)[uself->start]&0xff);
Eric Smith0facd772010-02-24 15:42:29 +00001908 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00001909 "'%U' codec can't decode byte 0x%02x in position %zd: %U",
Eric Smith0facd772010-02-24 15:42:29 +00001910 encoding_str,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001911 byte,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001912 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00001913 reason_str);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001914 }
Eric Smith0facd772010-02-24 15:42:29 +00001915 else {
1916 result = PyUnicode_FromFormat(
1917 "'%U' codec can't decode bytes in position %zd-%zd: %U",
1918 encoding_str,
1919 uself->start,
1920 uself->end-1,
1921 reason_str
1922 );
1923 }
1924done:
1925 Py_XDECREF(reason_str);
1926 Py_XDECREF(encoding_str);
1927 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001928}
1929
1930static PyTypeObject _PyExc_UnicodeDecodeError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001931 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00001932 "UnicodeDecodeError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00001933 sizeof(PyUnicodeErrorObject), 0,
1934 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1935 (reprfunc)UnicodeDecodeError_str, 0, 0, 0,
1936 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001937 PyDoc_STR("Unicode decoding error."), (traverseproc)UnicodeError_traverse,
1938 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001939 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001940 (initproc)UnicodeDecodeError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001941};
1942PyObject *PyExc_UnicodeDecodeError = (PyObject *)&_PyExc_UnicodeDecodeError;
1943
1944PyObject *
1945PyUnicodeDecodeError_Create(
1946 const char *encoding, const char *object, Py_ssize_t length,
1947 Py_ssize_t start, Py_ssize_t end, const char *reason)
1948{
Victor Stinner7eeb5b52010-06-07 19:57:46 +00001949 return PyObject_CallFunction(PyExc_UnicodeDecodeError, "sy#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001950 encoding, object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001951}
1952
1953
1954/*
1955 * UnicodeTranslateError extends UnicodeError
1956 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001957
1958static int
1959UnicodeTranslateError_init(PyUnicodeErrorObject *self, PyObject *args,
1960 PyObject *kwds)
1961{
1962 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1963 return -1;
1964
1965 Py_CLEAR(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001966 Py_CLEAR(self->reason);
1967
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001968 if (!PyArg_ParseTuple(args, "O!nnO!",
Thomas Wouters477c8d52006-05-27 19:21:47 +00001969 &PyUnicode_Type, &self->object,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001970 &self->start,
1971 &self->end,
Walter Dörwaldd2034312007-05-18 16:29:38 +00001972 &PyUnicode_Type, &self->reason)) {
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001973 self->object = self->reason = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001974 return -1;
1975 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001976
Thomas Wouters477c8d52006-05-27 19:21:47 +00001977 Py_INCREF(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001978 Py_INCREF(self->reason);
1979
1980 return 0;
1981}
1982
1983
1984static PyObject *
1985UnicodeTranslateError_str(PyObject *self)
1986{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001987 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00001988 PyObject *result = NULL;
1989 PyObject *reason_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001990
Eric Smith0facd772010-02-24 15:42:29 +00001991 /* Get reason as a string, which it might not be if it's been
1992 modified after we were contructed. */
1993 reason_str = PyObject_Str(uself->reason);
1994 if (reason_str == NULL)
1995 goto done;
1996
Victor Stinner53b33e72011-11-21 01:17:27 +01001997 if (uself->start < PyUnicode_GET_LENGTH(uself->object) && uself->end == uself->start+1) {
1998 Py_UCS4 badchar = PyUnicode_ReadChar(uself->object, uself->start);
Walter Dörwald787b03b2007-06-05 13:29:29 +00001999 const char *fmt;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002000 if (badchar <= 0xff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00002001 fmt = "can't translate character '\\x%02x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002002 else if (badchar <= 0xffff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00002003 fmt = "can't translate character '\\u%04x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002004 else
Walter Dörwald32a4c712007-06-20 09:25:34 +00002005 fmt = "can't translate character '\\U%08x' in position %zd: %U";
Benjamin Petersonc5f4e1e2010-02-25 01:22:28 +00002006 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00002007 fmt,
Victor Stinner53b33e72011-11-21 01:17:27 +01002008 (int)badchar,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002009 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00002010 reason_str
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002011 );
Eric Smith0facd772010-02-24 15:42:29 +00002012 } else {
2013 result = PyUnicode_FromFormat(
2014 "can't translate characters in position %zd-%zd: %U",
2015 uself->start,
2016 uself->end-1,
2017 reason_str
2018 );
Thomas Wouters477c8d52006-05-27 19:21:47 +00002019 }
Eric Smith0facd772010-02-24 15:42:29 +00002020done:
2021 Py_XDECREF(reason_str);
2022 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002023}
2024
2025static PyTypeObject _PyExc_UnicodeTranslateError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002026 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00002027 "UnicodeTranslateError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00002028 sizeof(PyUnicodeErrorObject), 0,
2029 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2030 (reprfunc)UnicodeTranslateError_str, 0, 0, 0,
2031 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters89f507f2006-12-13 04:49:30 +00002032 PyDoc_STR("Unicode translation error."), (traverseproc)UnicodeError_traverse,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002033 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
2034 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002035 (initproc)UnicodeTranslateError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002036};
2037PyObject *PyExc_UnicodeTranslateError = (PyObject *)&_PyExc_UnicodeTranslateError;
2038
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002039/* Deprecated. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002040PyObject *
2041PyUnicodeTranslateError_Create(
2042 const Py_UNICODE *object, Py_ssize_t length,
2043 Py_ssize_t start, Py_ssize_t end, const char *reason)
2044{
2045 return PyObject_CallFunction(PyExc_UnicodeTranslateError, "u#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002046 object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002047}
Thomas Wouters477c8d52006-05-27 19:21:47 +00002048
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002049PyObject *
2050_PyUnicodeTranslateError_Create(
2051 PyObject *object,
2052 Py_ssize_t start, Py_ssize_t end, const char *reason)
2053{
2054 return PyObject_CallFunction(PyExc_UnicodeTranslateError, "Ons",
2055 object, start, end, reason);
2056}
Thomas Wouters477c8d52006-05-27 19:21:47 +00002057
2058/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002059 * AssertionError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002060 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002061SimpleExtendsException(PyExc_Exception, AssertionError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002062 "Assertion failed.");
2063
2064
2065/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002066 * ArithmeticError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002067 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002068SimpleExtendsException(PyExc_Exception, ArithmeticError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002069 "Base class for arithmetic errors.");
2070
2071
2072/*
2073 * FloatingPointError extends ArithmeticError
2074 */
2075SimpleExtendsException(PyExc_ArithmeticError, FloatingPointError,
2076 "Floating point operation failed.");
2077
2078
2079/*
2080 * OverflowError extends ArithmeticError
2081 */
2082SimpleExtendsException(PyExc_ArithmeticError, OverflowError,
2083 "Result too large to be represented.");
2084
2085
2086/*
2087 * ZeroDivisionError extends ArithmeticError
2088 */
2089SimpleExtendsException(PyExc_ArithmeticError, ZeroDivisionError,
2090 "Second argument to a division or modulo operation was zero.");
2091
2092
2093/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002094 * SystemError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002095 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002096SimpleExtendsException(PyExc_Exception, SystemError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002097 "Internal error in the Python interpreter.\n"
2098 "\n"
2099 "Please report this to the Python maintainer, along with the traceback,\n"
2100 "the Python version, and the hardware/OS platform and version.");
2101
2102
2103/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002104 * ReferenceError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002105 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002106SimpleExtendsException(PyExc_Exception, ReferenceError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002107 "Weak ref proxy used after referent went away.");
2108
2109
2110/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002111 * MemoryError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002112 */
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002113
2114#define MEMERRORS_SAVE 16
2115static PyBaseExceptionObject *memerrors_freelist = NULL;
2116static int memerrors_numfree = 0;
2117
2118static PyObject *
2119MemoryError_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2120{
2121 PyBaseExceptionObject *self;
2122
2123 if (type != (PyTypeObject *) PyExc_MemoryError)
2124 return BaseException_new(type, args, kwds);
2125 if (memerrors_freelist == NULL)
2126 return BaseException_new(type, args, kwds);
2127 /* Fetch object from freelist and revive it */
2128 self = memerrors_freelist;
2129 self->args = PyTuple_New(0);
2130 /* This shouldn't happen since the empty tuple is persistent */
2131 if (self->args == NULL)
2132 return NULL;
2133 memerrors_freelist = (PyBaseExceptionObject *) self->dict;
2134 memerrors_numfree--;
2135 self->dict = NULL;
2136 _Py_NewReference((PyObject *)self);
2137 _PyObject_GC_TRACK(self);
2138 return (PyObject *)self;
2139}
2140
2141static void
2142MemoryError_dealloc(PyBaseExceptionObject *self)
2143{
2144 _PyObject_GC_UNTRACK(self);
2145 BaseException_clear(self);
2146 if (memerrors_numfree >= MEMERRORS_SAVE)
2147 Py_TYPE(self)->tp_free((PyObject *)self);
2148 else {
2149 self->dict = (PyObject *) memerrors_freelist;
2150 memerrors_freelist = self;
2151 memerrors_numfree++;
2152 }
2153}
2154
2155static void
2156preallocate_memerrors(void)
2157{
2158 /* We create enough MemoryErrors and then decref them, which will fill
2159 up the freelist. */
2160 int i;
2161 PyObject *errors[MEMERRORS_SAVE];
2162 for (i = 0; i < MEMERRORS_SAVE; i++) {
2163 errors[i] = MemoryError_new((PyTypeObject *) PyExc_MemoryError,
2164 NULL, NULL);
2165 if (!errors[i])
2166 Py_FatalError("Could not preallocate MemoryError object");
2167 }
2168 for (i = 0; i < MEMERRORS_SAVE; i++) {
2169 Py_DECREF(errors[i]);
2170 }
2171}
2172
2173static void
2174free_preallocated_memerrors(void)
2175{
2176 while (memerrors_freelist != NULL) {
2177 PyObject *self = (PyObject *) memerrors_freelist;
2178 memerrors_freelist = (PyBaseExceptionObject *) memerrors_freelist->dict;
2179 Py_TYPE(self)->tp_free((PyObject *)self);
2180 }
2181}
2182
2183
2184static PyTypeObject _PyExc_MemoryError = {
2185 PyVarObject_HEAD_INIT(NULL, 0)
2186 "MemoryError",
2187 sizeof(PyBaseExceptionObject),
2188 0, (destructor)MemoryError_dealloc, 0, 0, 0, 0, 0, 0, 0,
2189 0, 0, 0, 0, 0, 0, 0,
2190 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
2191 PyDoc_STR("Out of memory."), (traverseproc)BaseException_traverse,
2192 (inquiry)BaseException_clear, 0, 0, 0, 0, 0, 0, 0, &_PyExc_Exception,
2193 0, 0, 0, offsetof(PyBaseExceptionObject, dict),
2194 (initproc)BaseException_init, 0, MemoryError_new
2195};
2196PyObject *PyExc_MemoryError = (PyObject *) &_PyExc_MemoryError;
2197
Thomas Wouters477c8d52006-05-27 19:21:47 +00002198
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002199/*
2200 * BufferError extends Exception
2201 */
2202SimpleExtendsException(PyExc_Exception, BufferError, "Buffer error.");
2203
Thomas Wouters477c8d52006-05-27 19:21:47 +00002204
2205/* Warning category docstrings */
2206
2207/*
2208 * Warning extends Exception
2209 */
2210SimpleExtendsException(PyExc_Exception, Warning,
2211 "Base class for warning categories.");
2212
2213
2214/*
2215 * UserWarning extends Warning
2216 */
2217SimpleExtendsException(PyExc_Warning, UserWarning,
2218 "Base class for warnings generated by user code.");
2219
2220
2221/*
2222 * DeprecationWarning extends Warning
2223 */
2224SimpleExtendsException(PyExc_Warning, DeprecationWarning,
2225 "Base class for warnings about deprecated features.");
2226
2227
2228/*
2229 * PendingDeprecationWarning extends Warning
2230 */
2231SimpleExtendsException(PyExc_Warning, PendingDeprecationWarning,
2232 "Base class for warnings about features which will be deprecated\n"
2233 "in the future.");
2234
2235
2236/*
2237 * SyntaxWarning extends Warning
2238 */
2239SimpleExtendsException(PyExc_Warning, SyntaxWarning,
2240 "Base class for warnings about dubious syntax.");
2241
2242
2243/*
2244 * RuntimeWarning extends Warning
2245 */
2246SimpleExtendsException(PyExc_Warning, RuntimeWarning,
2247 "Base class for warnings about dubious runtime behavior.");
2248
2249
2250/*
2251 * FutureWarning extends Warning
2252 */
2253SimpleExtendsException(PyExc_Warning, FutureWarning,
2254 "Base class for warnings about constructs that will change semantically\n"
2255 "in the future.");
2256
2257
2258/*
2259 * ImportWarning extends Warning
2260 */
2261SimpleExtendsException(PyExc_Warning, ImportWarning,
2262 "Base class for warnings about probable mistakes in module imports");
2263
2264
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002265/*
2266 * UnicodeWarning extends Warning
2267 */
2268SimpleExtendsException(PyExc_Warning, UnicodeWarning,
2269 "Base class for warnings about Unicode related problems, mostly\n"
2270 "related to conversion problems.");
2271
Georg Brandl08be72d2010-10-24 15:11:22 +00002272
Guido van Rossum98297ee2007-11-06 21:34:58 +00002273/*
2274 * BytesWarning extends Warning
2275 */
2276SimpleExtendsException(PyExc_Warning, BytesWarning,
2277 "Base class for warnings about bytes and buffer related problems, mostly\n"
2278 "related to conversion from str or comparing to str.");
2279
2280
Georg Brandl08be72d2010-10-24 15:11:22 +00002281/*
2282 * ResourceWarning extends Warning
2283 */
2284SimpleExtendsException(PyExc_Warning, ResourceWarning,
2285 "Base class for warnings about resource usage.");
2286
2287
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002288
Thomas Wouters89d996e2007-09-08 17:39:28 +00002289/* Pre-computed RuntimeError instance for when recursion depth is reached.
2290 Meant to be used when normalizing the exception for exceeding the recursion
2291 depth will cause its own infinite recursion.
2292*/
2293PyObject *PyExc_RecursionErrorInst = NULL;
2294
Antoine Pitrou55f217f2012-01-18 21:23:13 +01002295#define PRE_INIT(TYPE) \
2296 if (!(_PyExc_ ## TYPE.tp_flags & Py_TPFLAGS_READY)) { \
2297 if (PyType_Ready(&_PyExc_ ## TYPE) < 0) \
2298 Py_FatalError("exceptions bootstrapping error."); \
2299 Py_INCREF(PyExc_ ## TYPE); \
2300 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002301
Antoine Pitrou55f217f2012-01-18 21:23:13 +01002302#define POST_INIT(TYPE) \
Thomas Wouters477c8d52006-05-27 19:21:47 +00002303 if (PyDict_SetItemString(bdict, # TYPE, PyExc_ ## TYPE)) \
2304 Py_FatalError("Module dictionary insertion problem.");
2305
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002306#define INIT_ALIAS(NAME, TYPE) Py_INCREF(PyExc_ ## TYPE); \
Antoine Pitrou8b0a74e2012-01-18 21:29:05 +01002307 Py_XDECREF(PyExc_ ## NAME); \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002308 PyExc_ ## NAME = PyExc_ ## TYPE; \
2309 if (PyDict_SetItemString(bdict, # NAME, PyExc_ ## NAME)) \
2310 Py_FatalError("Module dictionary insertion problem.");
2311
2312#define ADD_ERRNO(TYPE, CODE) { \
2313 PyObject *_code = PyLong_FromLong(CODE); \
2314 assert(_PyObject_RealIsSubclass(PyExc_ ## TYPE, PyExc_OSError)); \
2315 if (!_code || PyDict_SetItem(errnomap, _code, PyExc_ ## TYPE)) \
2316 Py_FatalError("errmap insertion problem."); \
Antoine Pitrou8b0a74e2012-01-18 21:29:05 +01002317 Py_DECREF(_code); \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002318 }
2319
2320#ifdef MS_WINDOWS
2321#include <Winsock2.h>
Brian Curtin401f9f32012-05-13 11:19:23 -05002322/* The following constants were added to errno.h in VS2010 but have
2323 preferred WSA equivalents. */
2324#undef EADDRINUSE
2325#undef EADDRNOTAVAIL
2326#undef EAFNOSUPPORT
2327#undef EALREADY
2328#undef ECONNABORTED
2329#undef ECONNREFUSED
2330#undef ECONNRESET
2331#undef EDESTADDRREQ
2332#undef EHOSTUNREACH
2333#undef EINPROGRESS
2334#undef EISCONN
2335#undef ELOOP
2336#undef EMSGSIZE
2337#undef ENETDOWN
2338#undef ENETRESET
2339#undef ENETUNREACH
2340#undef ENOBUFS
2341#undef ENOPROTOOPT
2342#undef ENOTCONN
2343#undef ENOTSOCK
2344#undef EOPNOTSUPP
2345#undef EPROTONOSUPPORT
2346#undef EPROTOTYPE
2347#undef ETIMEDOUT
2348#undef EWOULDBLOCK
2349
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002350#if defined(WSAEALREADY) && !defined(EALREADY)
2351#define EALREADY WSAEALREADY
2352#endif
2353#if defined(WSAECONNABORTED) && !defined(ECONNABORTED)
2354#define ECONNABORTED WSAECONNABORTED
2355#endif
2356#if defined(WSAECONNREFUSED) && !defined(ECONNREFUSED)
2357#define ECONNREFUSED WSAECONNREFUSED
2358#endif
2359#if defined(WSAECONNRESET) && !defined(ECONNRESET)
2360#define ECONNRESET WSAECONNRESET
2361#endif
2362#if defined(WSAEINPROGRESS) && !defined(EINPROGRESS)
2363#define EINPROGRESS WSAEINPROGRESS
2364#endif
2365#if defined(WSAESHUTDOWN) && !defined(ESHUTDOWN)
2366#define ESHUTDOWN WSAESHUTDOWN
2367#endif
2368#if defined(WSAETIMEDOUT) && !defined(ETIMEDOUT)
2369#define ETIMEDOUT WSAETIMEDOUT
2370#endif
2371#if defined(WSAEWOULDBLOCK) && !defined(EWOULDBLOCK)
2372#define EWOULDBLOCK WSAEWOULDBLOCK
2373#endif
2374#endif /* MS_WINDOWS */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002375
Martin v. Löwis1a214512008-06-11 05:26:20 +00002376void
Brett Cannonfd074152012-04-14 14:10:13 -04002377_PyExc_Init(PyObject *bltinmod)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002378{
Brett Cannonfd074152012-04-14 14:10:13 -04002379 PyObject *bdict;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002380
2381 PRE_INIT(BaseException)
2382 PRE_INIT(Exception)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002383 PRE_INIT(TypeError)
2384 PRE_INIT(StopIteration)
2385 PRE_INIT(GeneratorExit)
2386 PRE_INIT(SystemExit)
2387 PRE_INIT(KeyboardInterrupt)
2388 PRE_INIT(ImportError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002389 PRE_INIT(OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002390 PRE_INIT(EOFError)
2391 PRE_INIT(RuntimeError)
2392 PRE_INIT(NotImplementedError)
2393 PRE_INIT(NameError)
2394 PRE_INIT(UnboundLocalError)
2395 PRE_INIT(AttributeError)
2396 PRE_INIT(SyntaxError)
2397 PRE_INIT(IndentationError)
2398 PRE_INIT(TabError)
2399 PRE_INIT(LookupError)
2400 PRE_INIT(IndexError)
2401 PRE_INIT(KeyError)
2402 PRE_INIT(ValueError)
2403 PRE_INIT(UnicodeError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002404 PRE_INIT(UnicodeEncodeError)
2405 PRE_INIT(UnicodeDecodeError)
2406 PRE_INIT(UnicodeTranslateError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002407 PRE_INIT(AssertionError)
2408 PRE_INIT(ArithmeticError)
2409 PRE_INIT(FloatingPointError)
2410 PRE_INIT(OverflowError)
2411 PRE_INIT(ZeroDivisionError)
2412 PRE_INIT(SystemError)
2413 PRE_INIT(ReferenceError)
Neal Norwitzfaa54a32007-08-19 04:23:20 +00002414 PRE_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002415 PRE_INIT(MemoryError)
Benjamin Peterson2b968d62008-07-05 23:38:30 +00002416 PRE_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002417 PRE_INIT(Warning)
2418 PRE_INIT(UserWarning)
2419 PRE_INIT(DeprecationWarning)
2420 PRE_INIT(PendingDeprecationWarning)
2421 PRE_INIT(SyntaxWarning)
2422 PRE_INIT(RuntimeWarning)
2423 PRE_INIT(FutureWarning)
2424 PRE_INIT(ImportWarning)
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002425 PRE_INIT(UnicodeWarning)
Guido van Rossum98297ee2007-11-06 21:34:58 +00002426 PRE_INIT(BytesWarning)
Georg Brandl08be72d2010-10-24 15:11:22 +00002427 PRE_INIT(ResourceWarning)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002428
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002429 /* OSError subclasses */
2430 PRE_INIT(ConnectionError);
2431
2432 PRE_INIT(BlockingIOError);
2433 PRE_INIT(BrokenPipeError);
2434 PRE_INIT(ChildProcessError);
2435 PRE_INIT(ConnectionAbortedError);
2436 PRE_INIT(ConnectionRefusedError);
2437 PRE_INIT(ConnectionResetError);
2438 PRE_INIT(FileExistsError);
2439 PRE_INIT(FileNotFoundError);
2440 PRE_INIT(IsADirectoryError);
2441 PRE_INIT(NotADirectoryError);
2442 PRE_INIT(InterruptedError);
2443 PRE_INIT(PermissionError);
2444 PRE_INIT(ProcessLookupError);
2445 PRE_INIT(TimeoutError);
2446
Thomas Wouters477c8d52006-05-27 19:21:47 +00002447 bdict = PyModule_GetDict(bltinmod);
2448 if (bdict == NULL)
2449 Py_FatalError("exceptions bootstrapping error.");
2450
2451 POST_INIT(BaseException)
2452 POST_INIT(Exception)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002453 POST_INIT(TypeError)
2454 POST_INIT(StopIteration)
2455 POST_INIT(GeneratorExit)
2456 POST_INIT(SystemExit)
2457 POST_INIT(KeyboardInterrupt)
2458 POST_INIT(ImportError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002459 POST_INIT(OSError)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002460 INIT_ALIAS(EnvironmentError, OSError)
2461 INIT_ALIAS(IOError, OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002462#ifdef MS_WINDOWS
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002463 INIT_ALIAS(WindowsError, OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002464#endif
2465#ifdef __VMS
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002466 INIT_ALIAS(VMSError, OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002467#endif
2468 POST_INIT(EOFError)
2469 POST_INIT(RuntimeError)
2470 POST_INIT(NotImplementedError)
2471 POST_INIT(NameError)
2472 POST_INIT(UnboundLocalError)
2473 POST_INIT(AttributeError)
2474 POST_INIT(SyntaxError)
2475 POST_INIT(IndentationError)
2476 POST_INIT(TabError)
2477 POST_INIT(LookupError)
2478 POST_INIT(IndexError)
2479 POST_INIT(KeyError)
2480 POST_INIT(ValueError)
2481 POST_INIT(UnicodeError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002482 POST_INIT(UnicodeEncodeError)
2483 POST_INIT(UnicodeDecodeError)
2484 POST_INIT(UnicodeTranslateError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002485 POST_INIT(AssertionError)
2486 POST_INIT(ArithmeticError)
2487 POST_INIT(FloatingPointError)
2488 POST_INIT(OverflowError)
2489 POST_INIT(ZeroDivisionError)
2490 POST_INIT(SystemError)
2491 POST_INIT(ReferenceError)
Neal Norwitzfaa54a32007-08-19 04:23:20 +00002492 POST_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002493 POST_INIT(MemoryError)
Benjamin Peterson2b968d62008-07-05 23:38:30 +00002494 POST_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002495 POST_INIT(Warning)
2496 POST_INIT(UserWarning)
2497 POST_INIT(DeprecationWarning)
2498 POST_INIT(PendingDeprecationWarning)
2499 POST_INIT(SyntaxWarning)
2500 POST_INIT(RuntimeWarning)
2501 POST_INIT(FutureWarning)
2502 POST_INIT(ImportWarning)
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002503 POST_INIT(UnicodeWarning)
Guido van Rossum98297ee2007-11-06 21:34:58 +00002504 POST_INIT(BytesWarning)
Georg Brandl08be72d2010-10-24 15:11:22 +00002505 POST_INIT(ResourceWarning)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002506
Antoine Pitrouac456a12012-01-18 21:35:21 +01002507 if (!errnomap) {
2508 errnomap = PyDict_New();
2509 if (!errnomap)
2510 Py_FatalError("Cannot allocate map from errnos to OSError subclasses");
2511 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002512
2513 /* OSError subclasses */
2514 POST_INIT(ConnectionError);
2515
2516 POST_INIT(BlockingIOError);
2517 ADD_ERRNO(BlockingIOError, EAGAIN);
2518 ADD_ERRNO(BlockingIOError, EALREADY);
2519 ADD_ERRNO(BlockingIOError, EINPROGRESS);
2520 ADD_ERRNO(BlockingIOError, EWOULDBLOCK);
2521 POST_INIT(BrokenPipeError);
2522 ADD_ERRNO(BrokenPipeError, EPIPE);
2523 ADD_ERRNO(BrokenPipeError, ESHUTDOWN);
2524 POST_INIT(ChildProcessError);
2525 ADD_ERRNO(ChildProcessError, ECHILD);
2526 POST_INIT(ConnectionAbortedError);
2527 ADD_ERRNO(ConnectionAbortedError, ECONNABORTED);
2528 POST_INIT(ConnectionRefusedError);
2529 ADD_ERRNO(ConnectionRefusedError, ECONNREFUSED);
2530 POST_INIT(ConnectionResetError);
2531 ADD_ERRNO(ConnectionResetError, ECONNRESET);
2532 POST_INIT(FileExistsError);
2533 ADD_ERRNO(FileExistsError, EEXIST);
2534 POST_INIT(FileNotFoundError);
2535 ADD_ERRNO(FileNotFoundError, ENOENT);
2536 POST_INIT(IsADirectoryError);
2537 ADD_ERRNO(IsADirectoryError, EISDIR);
2538 POST_INIT(NotADirectoryError);
2539 ADD_ERRNO(NotADirectoryError, ENOTDIR);
2540 POST_INIT(InterruptedError);
2541 ADD_ERRNO(InterruptedError, EINTR);
2542 POST_INIT(PermissionError);
2543 ADD_ERRNO(PermissionError, EACCES);
2544 ADD_ERRNO(PermissionError, EPERM);
2545 POST_INIT(ProcessLookupError);
2546 ADD_ERRNO(ProcessLookupError, ESRCH);
2547 POST_INIT(TimeoutError);
2548 ADD_ERRNO(TimeoutError, ETIMEDOUT);
2549
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002550 preallocate_memerrors();
Thomas Wouters477c8d52006-05-27 19:21:47 +00002551
Antoine Pitrou1c7ade52012-01-18 16:13:31 +01002552 if (!PyExc_RecursionErrorInst) {
2553 PyExc_RecursionErrorInst = BaseException_new(&_PyExc_RuntimeError, NULL, NULL);
2554 if (!PyExc_RecursionErrorInst)
2555 Py_FatalError("Cannot pre-allocate RuntimeError instance for "
2556 "recursion errors");
2557 else {
2558 PyBaseExceptionObject *err_inst =
2559 (PyBaseExceptionObject *)PyExc_RecursionErrorInst;
2560 PyObject *args_tuple;
2561 PyObject *exc_message;
2562 exc_message = PyUnicode_FromString("maximum recursion depth exceeded");
2563 if (!exc_message)
2564 Py_FatalError("cannot allocate argument for RuntimeError "
2565 "pre-allocation");
2566 args_tuple = PyTuple_Pack(1, exc_message);
2567 if (!args_tuple)
2568 Py_FatalError("cannot allocate tuple for RuntimeError "
2569 "pre-allocation");
2570 Py_DECREF(exc_message);
2571 if (BaseException_init(err_inst, args_tuple, NULL))
2572 Py_FatalError("init of pre-allocated RuntimeError failed");
2573 Py_DECREF(args_tuple);
2574 }
Thomas Wouters89d996e2007-09-08 17:39:28 +00002575 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002576}
2577
2578void
2579_PyExc_Fini(void)
2580{
Benjamin Peterson78565b22009-06-28 19:19:51 +00002581 Py_CLEAR(PyExc_RecursionErrorInst);
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002582 free_preallocated_memerrors();
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002583 Py_CLEAR(errnomap);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002584}