blob: f70669849994e47a3a3008b765f456d079a29651 [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
Nick Coghlan1f7ce622012-01-13 21:43:40 +1000519ComplexExtendsException(
520 PyExc_Exception, /* base */
521 StopIteration, /* name */
522 StopIteration, /* prefix for *_init, etc */
523 0, /* new */
524 0, /* methods */
525 StopIteration_members, /* members */
526 0, /* getset */
527 0, /* str */
528 "Signal the end from iterator.__next__()."
529);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000530
531
532/*
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000533 * GeneratorExit extends BaseException
Thomas Wouters477c8d52006-05-27 19:21:47 +0000534 */
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000535SimpleExtendsException(PyExc_BaseException, GeneratorExit,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000536 "Request that a generator exit.");
537
538
539/*
540 * SystemExit extends BaseException
541 */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000542
543static int
544SystemExit_init(PySystemExitObject *self, PyObject *args, PyObject *kwds)
545{
546 Py_ssize_t size = PyTuple_GET_SIZE(args);
547
548 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
549 return -1;
550
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000551 if (size == 0)
552 return 0;
553 Py_CLEAR(self->code);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000554 if (size == 1)
555 self->code = PyTuple_GET_ITEM(args, 0);
Victor Stinner92236e52011-05-26 14:25:54 +0200556 else /* size > 1 */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000557 self->code = args;
558 Py_INCREF(self->code);
559 return 0;
560}
561
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000562static int
Thomas Wouters477c8d52006-05-27 19:21:47 +0000563SystemExit_clear(PySystemExitObject *self)
564{
565 Py_CLEAR(self->code);
566 return BaseException_clear((PyBaseExceptionObject *)self);
567}
568
569static void
570SystemExit_dealloc(PySystemExitObject *self)
571{
Thomas Wouters89f507f2006-12-13 04:49:30 +0000572 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000573 SystemExit_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +0000574 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000575}
576
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000577static int
Thomas Wouters477c8d52006-05-27 19:21:47 +0000578SystemExit_traverse(PySystemExitObject *self, visitproc visit, void *arg)
579{
580 Py_VISIT(self->code);
581 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
582}
583
584static PyMemberDef SystemExit_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +0000585 {"code", T_OBJECT, offsetof(PySystemExitObject, code), 0,
586 PyDoc_STR("exception code")},
587 {NULL} /* Sentinel */
588};
589
590ComplexExtendsException(PyExc_BaseException, SystemExit, SystemExit,
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200591 0, 0, SystemExit_members, 0, 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000592 "Request to exit from the interpreter.");
593
594/*
595 * KeyboardInterrupt extends BaseException
596 */
597SimpleExtendsException(PyExc_BaseException, KeyboardInterrupt,
598 "Program interrupted by user.");
599
600
601/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000602 * ImportError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +0000603 */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000604
Brett Cannon79ec55e2012-04-12 20:24:54 -0400605static int
606ImportError_init(PyImportErrorObject *self, PyObject *args, PyObject *kwds)
607{
608 PyObject *msg = NULL;
609 PyObject *name = NULL;
610 PyObject *path = NULL;
611
612/* Macro replacement doesn't allow ## to start the first line of a macro,
613 so we move the assignment and NULL check into the if-statement. */
614#define GET_KWD(kwd) { \
615 kwd = PyDict_GetItemString(kwds, #kwd); \
616 if (kwd) { \
617 Py_CLEAR(self->kwd); \
618 self->kwd = kwd; \
619 Py_INCREF(self->kwd);\
620 if (PyDict_DelItemString(kwds, #kwd)) \
621 return -1; \
622 } \
623 }
624
625 if (kwds) {
626 GET_KWD(name);
627 GET_KWD(path);
628 }
629
630 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
631 return -1;
632 if (PyTuple_GET_SIZE(args) != 1)
633 return 0;
634 if (!PyArg_UnpackTuple(args, "ImportError", 1, 1, &msg))
635 return -1;
636
637 Py_CLEAR(self->msg); /* replacing */
638 self->msg = msg;
639 Py_INCREF(self->msg);
640
641 return 0;
642}
643
644static int
645ImportError_clear(PyImportErrorObject *self)
646{
647 Py_CLEAR(self->msg);
648 Py_CLEAR(self->name);
649 Py_CLEAR(self->path);
650 return BaseException_clear((PyBaseExceptionObject *)self);
651}
652
653static void
654ImportError_dealloc(PyImportErrorObject *self)
655{
656 _PyObject_GC_UNTRACK(self);
657 ImportError_clear(self);
658 Py_TYPE(self)->tp_free((PyObject *)self);
659}
660
661static int
662ImportError_traverse(PyImportErrorObject *self, visitproc visit, void *arg)
663{
664 Py_VISIT(self->msg);
665 Py_VISIT(self->name);
666 Py_VISIT(self->path);
667 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
668}
669
670static PyObject *
671ImportError_str(PyImportErrorObject *self)
672{
673 if (self->msg) {
674 Py_INCREF(self->msg);
675 return self->msg;
676 }
677 else {
678 return BaseException_str((PyBaseExceptionObject *)self);
679 }
680}
681
682static PyMemberDef ImportError_members[] = {
683 {"msg", T_OBJECT, offsetof(PyImportErrorObject, msg), 0,
684 PyDoc_STR("exception message")},
685 {"name", T_OBJECT, offsetof(PyImportErrorObject, name), 0,
686 PyDoc_STR("module name")},
687 {"path", T_OBJECT, offsetof(PyImportErrorObject, path), 0,
688 PyDoc_STR("module path")},
689 {NULL} /* Sentinel */
690};
691
692static PyMethodDef ImportError_methods[] = {
693 {NULL}
694};
695
696ComplexExtendsException(PyExc_Exception, ImportError,
697 ImportError, 0 /* new */,
698 ImportError_methods, ImportError_members,
699 0 /* getset */, ImportError_str,
700 "Import can't find module, or can't find name in "
701 "module.");
Thomas Wouters477c8d52006-05-27 19:21:47 +0000702
703/*
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200704 * OSError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +0000705 */
706
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200707#ifdef MS_WINDOWS
708#include "errmap.h"
709#endif
710
Thomas Wouters477c8d52006-05-27 19:21:47 +0000711/* Where a function has a single filename, such as open() or some
712 * of the os module functions, PyErr_SetFromErrnoWithFilename() is
713 * called, giving a third argument which is the filename. But, so
714 * that old code using in-place unpacking doesn't break, e.g.:
715 *
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200716 * except OSError, (errno, strerror):
Thomas Wouters477c8d52006-05-27 19:21:47 +0000717 *
718 * we hack args so that it only contains two items. This also
719 * means we need our own __str__() which prints out the filename
720 * when it was supplied.
721 */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200722
Antoine Pitroue0e27352011-12-15 14:31:28 +0100723/* This function doesn't cleanup on error, the caller should */
724static int
725oserror_parse_args(PyObject **p_args,
726 PyObject **myerrno, PyObject **strerror,
727 PyObject **filename
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200728#ifdef MS_WINDOWS
Antoine Pitroue0e27352011-12-15 14:31:28 +0100729 , PyObject **winerror
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200730#endif
Antoine Pitroue0e27352011-12-15 14:31:28 +0100731 )
732{
733 Py_ssize_t nargs;
734 PyObject *args = *p_args;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000735
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200736 nargs = PyTuple_GET_SIZE(args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000737
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200738#ifdef MS_WINDOWS
739 if (nargs >= 2 && nargs <= 4) {
740 if (!PyArg_UnpackTuple(args, "OSError", 2, 4,
Antoine Pitroue0e27352011-12-15 14:31:28 +0100741 myerrno, strerror, filename, winerror))
742 return -1;
743 if (*winerror && PyLong_Check(*winerror)) {
744 long errcode, winerrcode;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200745 PyObject *newargs;
746 Py_ssize_t i;
747
Antoine Pitroue0e27352011-12-15 14:31:28 +0100748 winerrcode = PyLong_AsLong(*winerror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200749 if (winerrcode == -1 && PyErr_Occurred())
Antoine Pitroue0e27352011-12-15 14:31:28 +0100750 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200751 /* Set errno to the corresponding POSIX errno (overriding
752 first argument). Windows Socket error codes (>= 10000)
753 have the same value as their POSIX counterparts.
754 */
755 if (winerrcode < 10000)
756 errcode = winerror_to_errno(winerrcode);
757 else
758 errcode = winerrcode;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100759 *myerrno = PyLong_FromLong(errcode);
760 if (!*myerrno)
761 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200762 newargs = PyTuple_New(nargs);
763 if (!newargs)
Antoine Pitroue0e27352011-12-15 14:31:28 +0100764 return -1;
765 PyTuple_SET_ITEM(newargs, 0, *myerrno);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200766 for (i = 1; i < nargs; i++) {
767 PyObject *val = PyTuple_GET_ITEM(args, i);
768 Py_INCREF(val);
769 PyTuple_SET_ITEM(newargs, i, val);
770 }
771 Py_DECREF(args);
Antoine Pitroue0e27352011-12-15 14:31:28 +0100772 args = *p_args = newargs;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200773 }
774 }
775#else
776 if (nargs >= 2 && nargs <= 3) {
777 if (!PyArg_UnpackTuple(args, "OSError", 2, 3,
Antoine Pitroue0e27352011-12-15 14:31:28 +0100778 myerrno, strerror, filename))
779 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200780 }
781#endif
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000782
Antoine Pitroue0e27352011-12-15 14:31:28 +0100783 return 0;
784}
Thomas Wouters477c8d52006-05-27 19:21:47 +0000785
Antoine Pitroue0e27352011-12-15 14:31:28 +0100786static int
787oserror_init(PyOSErrorObject *self, PyObject **p_args,
788 PyObject *myerrno, PyObject *strerror,
789 PyObject *filename
790#ifdef MS_WINDOWS
791 , PyObject *winerror
792#endif
793 )
794{
795 PyObject *args = *p_args;
796 Py_ssize_t nargs = PyTuple_GET_SIZE(args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000797
798 /* self->filename will remain Py_None otherwise */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200799 if (filename && filename != Py_None) {
Antoine Pitroue0e27352011-12-15 14:31:28 +0100800 if (Py_TYPE(self) == (PyTypeObject *) PyExc_BlockingIOError &&
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200801 PyNumber_Check(filename)) {
802 /* BlockingIOError's 3rd argument can be the number of
803 * characters written.
804 */
805 self->written = PyNumber_AsSsize_t(filename, PyExc_ValueError);
806 if (self->written == -1 && PyErr_Occurred())
Antoine Pitroue0e27352011-12-15 14:31:28 +0100807 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200808 }
809 else {
810 Py_INCREF(filename);
811 self->filename = filename;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000812
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200813 if (nargs >= 2 && nargs <= 3) {
814 /* filename is removed from the args tuple (for compatibility
815 purposes, see test_exceptions.py) */
Antoine Pitroue0e27352011-12-15 14:31:28 +0100816 PyObject *subslice = PyTuple_GetSlice(args, 0, 2);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200817 if (!subslice)
Antoine Pitroue0e27352011-12-15 14:31:28 +0100818 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000819
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200820 Py_DECREF(args); /* replacing args */
Antoine Pitroue0e27352011-12-15 14:31:28 +0100821 *p_args = args = subslice;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200822 }
823 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000824 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200825 Py_XINCREF(myerrno);
826 self->myerrno = myerrno;
827
828 Py_XINCREF(strerror);
829 self->strerror = strerror;
830
831#ifdef MS_WINDOWS
832 Py_XINCREF(winerror);
833 self->winerror = winerror;
834#endif
835
Antoine Pitroue0e27352011-12-15 14:31:28 +0100836 /* Steals the reference to args */
837 self->args = args;
838 args = NULL;
839
840 return 0;
841}
842
843static PyObject *
844OSError_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
845static int
846OSError_init(PyOSErrorObject *self, PyObject *args, PyObject *kwds);
847
848static int
849oserror_use_init(PyTypeObject *type)
850{
851 /* When __init__ is defined in a OSError subclass, we want any
852 extraneous argument to __new__ to be ignored. The only reasonable
853 solution, given __new__ takes a variable number of arguments,
854 is to defer arg parsing and initialization to __init__.
855
856 But when __new__ is overriden as well, it should call our __new__
857 with the right arguments.
858
859 (see http://bugs.python.org/issue12555#msg148829 )
860 */
861 if (type->tp_init != (initproc) OSError_init &&
862 type->tp_new == (newfunc) OSError_new) {
863 assert((PyObject *) type != PyExc_OSError);
864 return 1;
865 }
866 return 0;
867}
868
869static PyObject *
870OSError_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
871{
872 PyOSErrorObject *self = NULL;
873 PyObject *myerrno = NULL, *strerror = NULL, *filename = NULL;
874#ifdef MS_WINDOWS
875 PyObject *winerror = NULL;
876#endif
877
878 if (!oserror_use_init(type)) {
879 if (!_PyArg_NoKeywords(type->tp_name, kwds))
880 return NULL;
881
882 Py_INCREF(args);
883 if (oserror_parse_args(&args, &myerrno, &strerror, &filename
884#ifdef MS_WINDOWS
885 , &winerror
886#endif
887 ))
888 goto error;
889
890 if (myerrno && PyLong_Check(myerrno) &&
891 errnomap && (PyObject *) type == PyExc_OSError) {
892 PyObject *newtype;
893 newtype = PyDict_GetItem(errnomap, myerrno);
894 if (newtype) {
895 assert(PyType_Check(newtype));
896 type = (PyTypeObject *) newtype;
897 }
898 else if (PyErr_Occurred())
899 goto error;
900 }
901 }
902
903 self = (PyOSErrorObject *) type->tp_alloc(type, 0);
904 if (!self)
905 goto error;
906
907 self->dict = NULL;
908 self->traceback = self->cause = self->context = NULL;
909 self->written = -1;
910
911 if (!oserror_use_init(type)) {
912 if (oserror_init(self, &args, myerrno, strerror, filename
913#ifdef MS_WINDOWS
914 , winerror
915#endif
916 ))
917 goto error;
918 }
919
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200920 return (PyObject *) self;
921
922error:
923 Py_XDECREF(args);
924 Py_XDECREF(self);
925 return NULL;
926}
927
928static int
Antoine Pitroue0e27352011-12-15 14:31:28 +0100929OSError_init(PyOSErrorObject *self, PyObject *args, PyObject *kwds)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200930{
Antoine Pitroue0e27352011-12-15 14:31:28 +0100931 PyObject *myerrno = NULL, *strerror = NULL, *filename = NULL;
932#ifdef MS_WINDOWS
933 PyObject *winerror = NULL;
934#endif
935
936 if (!oserror_use_init(Py_TYPE(self)))
937 /* Everything already done in OSError_new */
938 return 0;
939
940 if (!_PyArg_NoKeywords(Py_TYPE(self)->tp_name, kwds))
941 return -1;
942
943 Py_INCREF(args);
944 if (oserror_parse_args(&args, &myerrno, &strerror, &filename
945#ifdef MS_WINDOWS
946 , &winerror
947#endif
948 ))
949 goto error;
950
951 if (oserror_init(self, &args, myerrno, strerror, filename
952#ifdef MS_WINDOWS
953 , winerror
954#endif
955 ))
956 goto error;
957
Thomas Wouters477c8d52006-05-27 19:21:47 +0000958 return 0;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100959
960error:
961 Py_XDECREF(args);
962 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000963}
964
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000965static int
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200966OSError_clear(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000967{
968 Py_CLEAR(self->myerrno);
969 Py_CLEAR(self->strerror);
970 Py_CLEAR(self->filename);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200971#ifdef MS_WINDOWS
972 Py_CLEAR(self->winerror);
973#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000974 return BaseException_clear((PyBaseExceptionObject *)self);
975}
976
977static void
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200978OSError_dealloc(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000979{
Thomas Wouters89f507f2006-12-13 04:49:30 +0000980 _PyObject_GC_UNTRACK(self);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200981 OSError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +0000982 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000983}
984
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000985static int
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200986OSError_traverse(PyOSErrorObject *self, visitproc visit,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000987 void *arg)
988{
989 Py_VISIT(self->myerrno);
990 Py_VISIT(self->strerror);
991 Py_VISIT(self->filename);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200992#ifdef MS_WINDOWS
993 Py_VISIT(self->winerror);
994#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000995 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
996}
997
998static PyObject *
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200999OSError_str(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001000{
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001001#ifdef MS_WINDOWS
1002 /* If available, winerror has the priority over myerrno */
1003 if (self->winerror && self->filename)
1004 return PyUnicode_FromFormat("[Error %S] %S: %R",
1005 self->winerror ? self->winerror: Py_None,
1006 self->strerror ? self->strerror: Py_None,
1007 self->filename);
1008 if (self->winerror && self->strerror)
1009 return PyUnicode_FromFormat("[Error %S] %S",
1010 self->winerror ? self->winerror: Py_None,
1011 self->strerror ? self->strerror: Py_None);
1012#endif
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001013 if (self->filename)
1014 return PyUnicode_FromFormat("[Errno %S] %S: %R",
1015 self->myerrno ? self->myerrno: Py_None,
1016 self->strerror ? self->strerror: Py_None,
1017 self->filename);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001018 if (self->myerrno && self->strerror)
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001019 return PyUnicode_FromFormat("[Errno %S] %S",
1020 self->myerrno ? self->myerrno: Py_None,
1021 self->strerror ? self->strerror: Py_None);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001022 return BaseException_str((PyBaseExceptionObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001023}
1024
Thomas Wouters477c8d52006-05-27 19:21:47 +00001025static PyObject *
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001026OSError_reduce(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001027{
1028 PyObject *args = self->args;
1029 PyObject *res = NULL, *tmp;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001030
Thomas Wouters477c8d52006-05-27 19:21:47 +00001031 /* self->args is only the first two real arguments if there was a
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001032 * file name given to OSError. */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001033 if (PyTuple_GET_SIZE(args) == 2 && self->filename) {
Thomas Wouters477c8d52006-05-27 19:21:47 +00001034 args = PyTuple_New(3);
Benjamin Peterson90b13582012-02-03 19:22:31 -05001035 if (!args)
1036 return NULL;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001037
1038 tmp = PyTuple_GET_ITEM(self->args, 0);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001039 Py_INCREF(tmp);
1040 PyTuple_SET_ITEM(args, 0, tmp);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001041
1042 tmp = PyTuple_GET_ITEM(self->args, 1);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001043 Py_INCREF(tmp);
1044 PyTuple_SET_ITEM(args, 1, tmp);
1045
1046 Py_INCREF(self->filename);
1047 PyTuple_SET_ITEM(args, 2, self->filename);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001048 } else
Thomas Wouters477c8d52006-05-27 19:21:47 +00001049 Py_INCREF(args);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001050
1051 if (self->dict)
Christian Heimes90aa7642007-12-19 02:45:37 +00001052 res = PyTuple_Pack(3, Py_TYPE(self), args, self->dict);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001053 else
Christian Heimes90aa7642007-12-19 02:45:37 +00001054 res = PyTuple_Pack(2, Py_TYPE(self), args);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001055 Py_DECREF(args);
1056 return res;
1057}
1058
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001059static PyObject *
1060OSError_written_get(PyOSErrorObject *self, void *context)
1061{
1062 if (self->written == -1) {
1063 PyErr_SetString(PyExc_AttributeError, "characters_written");
1064 return NULL;
1065 }
1066 return PyLong_FromSsize_t(self->written);
1067}
Thomas Wouters477c8d52006-05-27 19:21:47 +00001068
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001069static int
1070OSError_written_set(PyOSErrorObject *self, PyObject *arg, void *context)
1071{
1072 Py_ssize_t n;
1073 n = PyNumber_AsSsize_t(arg, PyExc_ValueError);
1074 if (n == -1 && PyErr_Occurred())
1075 return -1;
1076 self->written = n;
1077 return 0;
1078}
1079
1080static PyMemberDef OSError_members[] = {
1081 {"errno", T_OBJECT, offsetof(PyOSErrorObject, myerrno), 0,
1082 PyDoc_STR("POSIX exception code")},
1083 {"strerror", T_OBJECT, offsetof(PyOSErrorObject, strerror), 0,
1084 PyDoc_STR("exception strerror")},
1085 {"filename", T_OBJECT, offsetof(PyOSErrorObject, filename), 0,
1086 PyDoc_STR("exception filename")},
1087#ifdef MS_WINDOWS
1088 {"winerror", T_OBJECT, offsetof(PyOSErrorObject, winerror), 0,
1089 PyDoc_STR("Win32 exception code")},
1090#endif
1091 {NULL} /* Sentinel */
1092};
1093
1094static PyMethodDef OSError_methods[] = {
1095 {"__reduce__", (PyCFunction)OSError_reduce, METH_NOARGS},
Thomas Wouters477c8d52006-05-27 19:21:47 +00001096 {NULL}
1097};
1098
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001099static PyGetSetDef OSError_getset[] = {
1100 {"characters_written", (getter) OSError_written_get,
1101 (setter) OSError_written_set, NULL},
1102 {NULL}
1103};
1104
1105
1106ComplexExtendsException(PyExc_Exception, OSError,
1107 OSError, OSError_new,
1108 OSError_methods, OSError_members, OSError_getset,
1109 OSError_str,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001110 "Base class for I/O related errors.");
1111
1112
1113/*
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001114 * Various OSError subclasses
Thomas Wouters477c8d52006-05-27 19:21:47 +00001115 */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001116MiddlingExtendsException(PyExc_OSError, BlockingIOError, OSError,
1117 "I/O operation would block.");
1118MiddlingExtendsException(PyExc_OSError, ConnectionError, OSError,
1119 "Connection error.");
1120MiddlingExtendsException(PyExc_OSError, ChildProcessError, OSError,
1121 "Child process error.");
1122MiddlingExtendsException(PyExc_ConnectionError, BrokenPipeError, OSError,
1123 "Broken pipe.");
1124MiddlingExtendsException(PyExc_ConnectionError, ConnectionAbortedError, OSError,
1125 "Connection aborted.");
1126MiddlingExtendsException(PyExc_ConnectionError, ConnectionRefusedError, OSError,
1127 "Connection refused.");
1128MiddlingExtendsException(PyExc_ConnectionError, ConnectionResetError, OSError,
1129 "Connection reset.");
1130MiddlingExtendsException(PyExc_OSError, FileExistsError, OSError,
1131 "File already exists.");
1132MiddlingExtendsException(PyExc_OSError, FileNotFoundError, OSError,
1133 "File not found.");
1134MiddlingExtendsException(PyExc_OSError, IsADirectoryError, OSError,
1135 "Operation doesn't work on directories.");
1136MiddlingExtendsException(PyExc_OSError, NotADirectoryError, OSError,
1137 "Operation only works on directories.");
1138MiddlingExtendsException(PyExc_OSError, InterruptedError, OSError,
1139 "Interrupted by signal.");
1140MiddlingExtendsException(PyExc_OSError, PermissionError, OSError,
1141 "Not enough permissions.");
1142MiddlingExtendsException(PyExc_OSError, ProcessLookupError, OSError,
1143 "Process not found.");
1144MiddlingExtendsException(PyExc_OSError, TimeoutError, OSError,
1145 "Timeout expired.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001146
1147/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001148 * EOFError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001149 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001150SimpleExtendsException(PyExc_Exception, EOFError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001151 "Read beyond end of file.");
1152
1153
1154/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001155 * RuntimeError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001156 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001157SimpleExtendsException(PyExc_Exception, RuntimeError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001158 "Unspecified run-time error.");
1159
1160
1161/*
1162 * NotImplementedError extends RuntimeError
1163 */
1164SimpleExtendsException(PyExc_RuntimeError, NotImplementedError,
1165 "Method or function hasn't been implemented yet.");
1166
1167/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001168 * NameError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001169 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001170SimpleExtendsException(PyExc_Exception, NameError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001171 "Name not found globally.");
1172
1173/*
1174 * UnboundLocalError extends NameError
1175 */
1176SimpleExtendsException(PyExc_NameError, UnboundLocalError,
1177 "Local name referenced but not bound to a value.");
1178
1179/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001180 * AttributeError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001181 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001182SimpleExtendsException(PyExc_Exception, AttributeError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001183 "Attribute not found.");
1184
1185
1186/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001187 * SyntaxError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001188 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001189
1190static int
1191SyntaxError_init(PySyntaxErrorObject *self, PyObject *args, PyObject *kwds)
1192{
1193 PyObject *info = NULL;
1194 Py_ssize_t lenargs = PyTuple_GET_SIZE(args);
1195
1196 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1197 return -1;
1198
1199 if (lenargs >= 1) {
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001200 Py_CLEAR(self->msg);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001201 self->msg = PyTuple_GET_ITEM(args, 0);
1202 Py_INCREF(self->msg);
1203 }
1204 if (lenargs == 2) {
1205 info = PyTuple_GET_ITEM(args, 1);
1206 info = PySequence_Tuple(info);
Benjamin Peterson90b13582012-02-03 19:22:31 -05001207 if (!info)
1208 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001209
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001210 if (PyTuple_GET_SIZE(info) != 4) {
1211 /* not a very good error message, but it's what Python 2.4 gives */
1212 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
1213 Py_DECREF(info);
1214 return -1;
1215 }
1216
1217 Py_CLEAR(self->filename);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001218 self->filename = PyTuple_GET_ITEM(info, 0);
1219 Py_INCREF(self->filename);
1220
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001221 Py_CLEAR(self->lineno);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001222 self->lineno = PyTuple_GET_ITEM(info, 1);
1223 Py_INCREF(self->lineno);
1224
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001225 Py_CLEAR(self->offset);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001226 self->offset = PyTuple_GET_ITEM(info, 2);
1227 Py_INCREF(self->offset);
1228
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001229 Py_CLEAR(self->text);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001230 self->text = PyTuple_GET_ITEM(info, 3);
1231 Py_INCREF(self->text);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001232
1233 Py_DECREF(info);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001234 }
1235 return 0;
1236}
1237
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001238static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001239SyntaxError_clear(PySyntaxErrorObject *self)
1240{
1241 Py_CLEAR(self->msg);
1242 Py_CLEAR(self->filename);
1243 Py_CLEAR(self->lineno);
1244 Py_CLEAR(self->offset);
1245 Py_CLEAR(self->text);
1246 Py_CLEAR(self->print_file_and_line);
1247 return BaseException_clear((PyBaseExceptionObject *)self);
1248}
1249
1250static void
1251SyntaxError_dealloc(PySyntaxErrorObject *self)
1252{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001253 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001254 SyntaxError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +00001255 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001256}
1257
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001258static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001259SyntaxError_traverse(PySyntaxErrorObject *self, visitproc visit, void *arg)
1260{
1261 Py_VISIT(self->msg);
1262 Py_VISIT(self->filename);
1263 Py_VISIT(self->lineno);
1264 Py_VISIT(self->offset);
1265 Py_VISIT(self->text);
1266 Py_VISIT(self->print_file_and_line);
1267 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1268}
1269
1270/* This is called "my_basename" instead of just "basename" to avoid name
1271 conflicts with glibc; basename is already prototyped if _GNU_SOURCE is
1272 defined, and Python does define that. */
Victor Stinner6237daf2010-04-28 17:26:19 +00001273static PyObject*
1274my_basename(PyObject *name)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001275{
Victor Stinner6237daf2010-04-28 17:26:19 +00001276 Py_ssize_t i, size, offset;
Victor Stinner31392e72011-10-05 20:14:23 +02001277 int kind;
1278 void *data;
1279
1280 if (PyUnicode_READY(name))
1281 return NULL;
1282 kind = PyUnicode_KIND(name);
1283 data = PyUnicode_DATA(name);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001284 size = PyUnicode_GET_LENGTH(name);
Victor Stinner6237daf2010-04-28 17:26:19 +00001285 offset = 0;
1286 for(i=0; i < size; i++) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001287 if (PyUnicode_READ(kind, data, i) == SEP)
Victor Stinner6237daf2010-04-28 17:26:19 +00001288 offset = i + 1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001289 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001290 if (offset != 0)
1291 return PyUnicode_Substring(name, offset, size);
1292 else {
Victor Stinner6237daf2010-04-28 17:26:19 +00001293 Py_INCREF(name);
1294 return name;
1295 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001296}
1297
1298
1299static PyObject *
1300SyntaxError_str(PySyntaxErrorObject *self)
1301{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001302 int have_lineno = 0;
Victor Stinner6237daf2010-04-28 17:26:19 +00001303 PyObject *filename;
1304 PyObject *result;
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001305 /* Below, we always ignore overflow errors, just printing -1.
1306 Still, we cannot allow an OverflowError to be raised, so
1307 we need to call PyLong_AsLongAndOverflow. */
1308 int overflow;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001309
1310 /* XXX -- do all the additional formatting with filename and
1311 lineno here */
1312
Neal Norwitzed2b7392007-08-26 04:51:10 +00001313 if (self->filename && PyUnicode_Check(self->filename)) {
Victor Stinner6237daf2010-04-28 17:26:19 +00001314 filename = my_basename(self->filename);
1315 if (filename == NULL)
1316 return NULL;
1317 } else {
1318 filename = NULL;
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001319 }
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001320 have_lineno = (self->lineno != NULL) && PyLong_CheckExact(self->lineno);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001321
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001322 if (!filename && !have_lineno)
Thomas Heller519a0422007-11-15 20:48:54 +00001323 return PyObject_Str(self->msg ? self->msg : Py_None);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001324
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001325 if (filename && have_lineno)
Victor Stinner6237daf2010-04-28 17:26:19 +00001326 result = PyUnicode_FromFormat("%S (%U, line %ld)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001327 self->msg ? self->msg : Py_None,
Victor Stinner6237daf2010-04-28 17:26:19 +00001328 filename,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001329 PyLong_AsLongAndOverflow(self->lineno, &overflow));
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001330 else if (filename)
Victor Stinner6237daf2010-04-28 17:26:19 +00001331 result = PyUnicode_FromFormat("%S (%U)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001332 self->msg ? self->msg : Py_None,
Victor Stinner6237daf2010-04-28 17:26:19 +00001333 filename);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001334 else /* only have_lineno */
Victor Stinner6237daf2010-04-28 17:26:19 +00001335 result = PyUnicode_FromFormat("%S (line %ld)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001336 self->msg ? self->msg : Py_None,
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001337 PyLong_AsLongAndOverflow(self->lineno, &overflow));
Victor Stinner6237daf2010-04-28 17:26:19 +00001338 Py_XDECREF(filename);
1339 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001340}
1341
1342static PyMemberDef SyntaxError_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +00001343 {"msg", T_OBJECT, offsetof(PySyntaxErrorObject, msg), 0,
1344 PyDoc_STR("exception msg")},
1345 {"filename", T_OBJECT, offsetof(PySyntaxErrorObject, filename), 0,
1346 PyDoc_STR("exception filename")},
1347 {"lineno", T_OBJECT, offsetof(PySyntaxErrorObject, lineno), 0,
1348 PyDoc_STR("exception lineno")},
1349 {"offset", T_OBJECT, offsetof(PySyntaxErrorObject, offset), 0,
1350 PyDoc_STR("exception offset")},
1351 {"text", T_OBJECT, offsetof(PySyntaxErrorObject, text), 0,
1352 PyDoc_STR("exception text")},
1353 {"print_file_and_line", T_OBJECT,
1354 offsetof(PySyntaxErrorObject, print_file_and_line), 0,
1355 PyDoc_STR("exception print_file_and_line")},
1356 {NULL} /* Sentinel */
1357};
1358
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001359ComplexExtendsException(PyExc_Exception, SyntaxError, SyntaxError,
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001360 0, 0, SyntaxError_members, 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001361 SyntaxError_str, "Invalid syntax.");
1362
1363
1364/*
1365 * IndentationError extends SyntaxError
1366 */
1367MiddlingExtendsException(PyExc_SyntaxError, IndentationError, SyntaxError,
1368 "Improper indentation.");
1369
1370
1371/*
1372 * TabError extends IndentationError
1373 */
1374MiddlingExtendsException(PyExc_IndentationError, TabError, SyntaxError,
1375 "Improper mixture of spaces and tabs.");
1376
1377
1378/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001379 * LookupError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001380 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001381SimpleExtendsException(PyExc_Exception, LookupError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001382 "Base class for lookup errors.");
1383
1384
1385/*
1386 * IndexError extends LookupError
1387 */
1388SimpleExtendsException(PyExc_LookupError, IndexError,
1389 "Sequence index out of range.");
1390
1391
1392/*
1393 * KeyError extends LookupError
1394 */
1395static PyObject *
1396KeyError_str(PyBaseExceptionObject *self)
1397{
1398 /* If args is a tuple of exactly one item, apply repr to args[0].
1399 This is done so that e.g. the exception raised by {}[''] prints
1400 KeyError: ''
1401 rather than the confusing
1402 KeyError
1403 alone. The downside is that if KeyError is raised with an explanatory
1404 string, that string will be displayed in quotes. Too bad.
1405 If args is anything else, use the default BaseException__str__().
1406 */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001407 if (PyTuple_GET_SIZE(self->args) == 1) {
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001408 return PyObject_Repr(PyTuple_GET_ITEM(self->args, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001409 }
1410 return BaseException_str(self);
1411}
1412
1413ComplexExtendsException(PyExc_LookupError, KeyError, BaseException,
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001414 0, 0, 0, 0, KeyError_str, "Mapping key not found.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001415
1416
1417/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001418 * ValueError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001419 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001420SimpleExtendsException(PyExc_Exception, ValueError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001421 "Inappropriate argument value (of correct type).");
1422
1423/*
1424 * UnicodeError extends ValueError
1425 */
1426
1427SimpleExtendsException(PyExc_ValueError, UnicodeError,
1428 "Unicode related error.");
1429
Thomas Wouters477c8d52006-05-27 19:21:47 +00001430static PyObject *
Guido van Rossum98297ee2007-11-06 21:34:58 +00001431get_string(PyObject *attr, const char *name)
Walter Dörwald612344f2007-05-04 19:28:21 +00001432{
1433 if (!attr) {
1434 PyErr_Format(PyExc_TypeError, "%.200s attribute not set", name);
1435 return NULL;
1436 }
1437
Christian Heimes72b710a2008-05-26 13:28:38 +00001438 if (!PyBytes_Check(attr)) {
Walter Dörwald612344f2007-05-04 19:28:21 +00001439 PyErr_Format(PyExc_TypeError, "%.200s attribute must be bytes", name);
1440 return NULL;
1441 }
1442 Py_INCREF(attr);
1443 return attr;
1444}
1445
1446static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00001447get_unicode(PyObject *attr, const char *name)
1448{
1449 if (!attr) {
1450 PyErr_Format(PyExc_TypeError, "%.200s attribute not set", name);
1451 return NULL;
1452 }
1453
1454 if (!PyUnicode_Check(attr)) {
1455 PyErr_Format(PyExc_TypeError,
1456 "%.200s attribute must be unicode", name);
1457 return NULL;
1458 }
1459 Py_INCREF(attr);
1460 return attr;
1461}
1462
Walter Dörwaldd2034312007-05-18 16:29:38 +00001463static int
1464set_unicodefromstring(PyObject **attr, const char *value)
1465{
1466 PyObject *obj = PyUnicode_FromString(value);
1467 if (!obj)
1468 return -1;
1469 Py_CLEAR(*attr);
1470 *attr = obj;
1471 return 0;
1472}
1473
Thomas Wouters477c8d52006-05-27 19:21:47 +00001474PyObject *
1475PyUnicodeEncodeError_GetEncoding(PyObject *exc)
1476{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001477 return get_unicode(((PyUnicodeErrorObject *)exc)->encoding, "encoding");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001478}
1479
1480PyObject *
1481PyUnicodeDecodeError_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 *
1487PyUnicodeEncodeError_GetObject(PyObject *exc)
1488{
1489 return get_unicode(((PyUnicodeErrorObject *)exc)->object, "object");
1490}
1491
1492PyObject *
1493PyUnicodeDecodeError_GetObject(PyObject *exc)
1494{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001495 return get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001496}
1497
1498PyObject *
1499PyUnicodeTranslateError_GetObject(PyObject *exc)
1500{
1501 return get_unicode(((PyUnicodeErrorObject *)exc)->object, "object");
1502}
1503
1504int
1505PyUnicodeEncodeError_GetStart(PyObject *exc, Py_ssize_t *start)
1506{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001507 Py_ssize_t size;
1508 PyObject *obj = get_unicode(((PyUnicodeErrorObject *)exc)->object,
1509 "object");
1510 if (!obj)
1511 return -1;
1512 *start = ((PyUnicodeErrorObject *)exc)->start;
Victor Stinner9e30aa52011-11-21 02:49:52 +01001513 size = PyUnicode_GET_LENGTH(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001514 if (*start<0)
1515 *start = 0; /*XXX check for values <0*/
1516 if (*start>=size)
1517 *start = size-1;
1518 Py_DECREF(obj);
1519 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001520}
1521
1522
1523int
1524PyUnicodeDecodeError_GetStart(PyObject *exc, Py_ssize_t *start)
1525{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001526 Py_ssize_t size;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001527 PyObject *obj = get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001528 if (!obj)
1529 return -1;
Christian Heimes72b710a2008-05-26 13:28:38 +00001530 size = PyBytes_GET_SIZE(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001531 *start = ((PyUnicodeErrorObject *)exc)->start;
1532 if (*start<0)
1533 *start = 0;
1534 if (*start>=size)
1535 *start = size-1;
1536 Py_DECREF(obj);
1537 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001538}
1539
1540
1541int
1542PyUnicodeTranslateError_GetStart(PyObject *exc, Py_ssize_t *start)
1543{
1544 return PyUnicodeEncodeError_GetStart(exc, start);
1545}
1546
1547
1548int
1549PyUnicodeEncodeError_SetStart(PyObject *exc, Py_ssize_t start)
1550{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001551 ((PyUnicodeErrorObject *)exc)->start = start;
1552 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001553}
1554
1555
1556int
1557PyUnicodeDecodeError_SetStart(PyObject *exc, Py_ssize_t start)
1558{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001559 ((PyUnicodeErrorObject *)exc)->start = start;
1560 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001561}
1562
1563
1564int
1565PyUnicodeTranslateError_SetStart(PyObject *exc, Py_ssize_t start)
1566{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001567 ((PyUnicodeErrorObject *)exc)->start = start;
1568 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001569}
1570
1571
1572int
1573PyUnicodeEncodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
1574{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001575 Py_ssize_t size;
1576 PyObject *obj = get_unicode(((PyUnicodeErrorObject *)exc)->object,
1577 "object");
1578 if (!obj)
1579 return -1;
1580 *end = ((PyUnicodeErrorObject *)exc)->end;
Victor Stinner9e30aa52011-11-21 02:49:52 +01001581 size = PyUnicode_GET_LENGTH(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001582 if (*end<1)
1583 *end = 1;
1584 if (*end>size)
1585 *end = size;
1586 Py_DECREF(obj);
1587 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001588}
1589
1590
1591int
1592PyUnicodeDecodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
1593{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001594 Py_ssize_t size;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001595 PyObject *obj = get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001596 if (!obj)
1597 return -1;
Christian Heimes72b710a2008-05-26 13:28:38 +00001598 size = PyBytes_GET_SIZE(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001599 *end = ((PyUnicodeErrorObject *)exc)->end;
1600 if (*end<1)
1601 *end = 1;
1602 if (*end>size)
1603 *end = size;
1604 Py_DECREF(obj);
1605 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001606}
1607
1608
1609int
1610PyUnicodeTranslateError_GetEnd(PyObject *exc, Py_ssize_t *start)
1611{
1612 return PyUnicodeEncodeError_GetEnd(exc, start);
1613}
1614
1615
1616int
1617PyUnicodeEncodeError_SetEnd(PyObject *exc, Py_ssize_t end)
1618{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001619 ((PyUnicodeErrorObject *)exc)->end = end;
1620 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001621}
1622
1623
1624int
1625PyUnicodeDecodeError_SetEnd(PyObject *exc, Py_ssize_t end)
1626{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001627 ((PyUnicodeErrorObject *)exc)->end = end;
1628 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001629}
1630
1631
1632int
1633PyUnicodeTranslateError_SetEnd(PyObject *exc, Py_ssize_t end)
1634{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001635 ((PyUnicodeErrorObject *)exc)->end = end;
1636 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001637}
1638
1639PyObject *
1640PyUnicodeEncodeError_GetReason(PyObject *exc)
1641{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001642 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001643}
1644
1645
1646PyObject *
1647PyUnicodeDecodeError_GetReason(PyObject *exc)
1648{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001649 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001650}
1651
1652
1653PyObject *
1654PyUnicodeTranslateError_GetReason(PyObject *exc)
1655{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001656 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001657}
1658
1659
1660int
1661PyUnicodeEncodeError_SetReason(PyObject *exc, const char *reason)
1662{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001663 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1664 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001665}
1666
1667
1668int
1669PyUnicodeDecodeError_SetReason(PyObject *exc, const char *reason)
1670{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001671 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1672 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001673}
1674
1675
1676int
1677PyUnicodeTranslateError_SetReason(PyObject *exc, const char *reason)
1678{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001679 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1680 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001681}
1682
1683
Thomas Wouters477c8d52006-05-27 19:21:47 +00001684static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001685UnicodeError_clear(PyUnicodeErrorObject *self)
1686{
1687 Py_CLEAR(self->encoding);
1688 Py_CLEAR(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001689 Py_CLEAR(self->reason);
1690 return BaseException_clear((PyBaseExceptionObject *)self);
1691}
1692
1693static void
1694UnicodeError_dealloc(PyUnicodeErrorObject *self)
1695{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001696 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001697 UnicodeError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +00001698 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001699}
1700
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001701static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001702UnicodeError_traverse(PyUnicodeErrorObject *self, visitproc visit, void *arg)
1703{
1704 Py_VISIT(self->encoding);
1705 Py_VISIT(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001706 Py_VISIT(self->reason);
1707 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1708}
1709
1710static PyMemberDef UnicodeError_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +00001711 {"encoding", T_OBJECT, offsetof(PyUnicodeErrorObject, encoding), 0,
1712 PyDoc_STR("exception encoding")},
1713 {"object", T_OBJECT, offsetof(PyUnicodeErrorObject, object), 0,
1714 PyDoc_STR("exception object")},
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001715 {"start", T_PYSSIZET, offsetof(PyUnicodeErrorObject, start), 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001716 PyDoc_STR("exception start")},
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001717 {"end", T_PYSSIZET, offsetof(PyUnicodeErrorObject, end), 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001718 PyDoc_STR("exception end")},
1719 {"reason", T_OBJECT, offsetof(PyUnicodeErrorObject, reason), 0,
1720 PyDoc_STR("exception reason")},
1721 {NULL} /* Sentinel */
1722};
1723
1724
1725/*
1726 * UnicodeEncodeError extends UnicodeError
1727 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001728
1729static int
1730UnicodeEncodeError_init(PyObject *self, PyObject *args, PyObject *kwds)
1731{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001732 PyUnicodeErrorObject *err;
1733
Thomas Wouters477c8d52006-05-27 19:21:47 +00001734 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1735 return -1;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001736
1737 err = (PyUnicodeErrorObject *)self;
1738
1739 Py_CLEAR(err->encoding);
1740 Py_CLEAR(err->object);
1741 Py_CLEAR(err->reason);
1742
1743 if (!PyArg_ParseTuple(args, "O!O!nnO!",
1744 &PyUnicode_Type, &err->encoding,
1745 &PyUnicode_Type, &err->object,
1746 &err->start,
1747 &err->end,
1748 &PyUnicode_Type, &err->reason)) {
1749 err->encoding = err->object = err->reason = NULL;
1750 return -1;
1751 }
1752
Martin v. Löwisb09af032011-11-04 11:16:41 +01001753 if (PyUnicode_READY(err->object) < -1) {
1754 err->encoding = NULL;
1755 return -1;
1756 }
1757
Guido van Rossum98297ee2007-11-06 21:34:58 +00001758 Py_INCREF(err->encoding);
1759 Py_INCREF(err->object);
1760 Py_INCREF(err->reason);
1761
1762 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001763}
1764
1765static PyObject *
1766UnicodeEncodeError_str(PyObject *self)
1767{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001768 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00001769 PyObject *result = NULL;
1770 PyObject *reason_str = NULL;
1771 PyObject *encoding_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001772
Eric Smith0facd772010-02-24 15:42:29 +00001773 /* Get reason and encoding as strings, which they might not be if
1774 they've been modified after we were contructed. */
1775 reason_str = PyObject_Str(uself->reason);
1776 if (reason_str == NULL)
1777 goto done;
1778 encoding_str = PyObject_Str(uself->encoding);
1779 if (encoding_str == NULL)
1780 goto done;
1781
Victor Stinnerda1ddf32011-11-20 22:50:23 +01001782 if (uself->start < PyUnicode_GET_LENGTH(uself->object) && uself->end == uself->start+1) {
1783 Py_UCS4 badchar = PyUnicode_ReadChar(uself->object, uself->start);
Walter Dörwald787b03b2007-06-05 13:29:29 +00001784 const char *fmt;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001785 if (badchar <= 0xff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00001786 fmt = "'%U' codec can't encode character '\\x%02x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001787 else if (badchar <= 0xffff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00001788 fmt = "'%U' codec can't encode character '\\u%04x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001789 else
Walter Dörwald32a4c712007-06-20 09:25:34 +00001790 fmt = "'%U' codec can't encode character '\\U%08x' in position %zd: %U";
Eric Smith0facd772010-02-24 15:42:29 +00001791 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00001792 fmt,
Eric Smith0facd772010-02-24 15:42:29 +00001793 encoding_str,
Victor Stinnerda1ddf32011-11-20 22:50:23 +01001794 (int)badchar,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001795 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00001796 reason_str);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001797 }
Eric Smith0facd772010-02-24 15:42:29 +00001798 else {
1799 result = PyUnicode_FromFormat(
1800 "'%U' codec can't encode characters in position %zd-%zd: %U",
1801 encoding_str,
1802 uself->start,
1803 uself->end-1,
1804 reason_str);
1805 }
1806done:
1807 Py_XDECREF(reason_str);
1808 Py_XDECREF(encoding_str);
1809 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001810}
1811
1812static PyTypeObject _PyExc_UnicodeEncodeError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001813 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00001814 "UnicodeEncodeError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00001815 sizeof(PyUnicodeErrorObject), 0,
1816 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1817 (reprfunc)UnicodeEncodeError_str, 0, 0, 0,
1818 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001819 PyDoc_STR("Unicode encoding error."), (traverseproc)UnicodeError_traverse,
1820 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001821 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001822 (initproc)UnicodeEncodeError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001823};
1824PyObject *PyExc_UnicodeEncodeError = (PyObject *)&_PyExc_UnicodeEncodeError;
1825
1826PyObject *
1827PyUnicodeEncodeError_Create(
1828 const char *encoding, const Py_UNICODE *object, Py_ssize_t length,
1829 Py_ssize_t start, Py_ssize_t end, const char *reason)
1830{
Victor Stinner7eeb5b52010-06-07 19:57:46 +00001831 return PyObject_CallFunction(PyExc_UnicodeEncodeError, "su#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001832 encoding, object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001833}
1834
1835
1836/*
1837 * UnicodeDecodeError extends UnicodeError
1838 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001839
1840static int
1841UnicodeDecodeError_init(PyObject *self, PyObject *args, PyObject *kwds)
1842{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001843 PyUnicodeErrorObject *ude;
1844 const char *data;
1845 Py_ssize_t size;
1846
Thomas Wouters477c8d52006-05-27 19:21:47 +00001847 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1848 return -1;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001849
1850 ude = (PyUnicodeErrorObject *)self;
1851
1852 Py_CLEAR(ude->encoding);
1853 Py_CLEAR(ude->object);
1854 Py_CLEAR(ude->reason);
1855
1856 if (!PyArg_ParseTuple(args, "O!OnnO!",
1857 &PyUnicode_Type, &ude->encoding,
1858 &ude->object,
1859 &ude->start,
1860 &ude->end,
1861 &PyUnicode_Type, &ude->reason)) {
1862 ude->encoding = ude->object = ude->reason = NULL;
1863 return -1;
1864 }
1865
Christian Heimes72b710a2008-05-26 13:28:38 +00001866 if (!PyBytes_Check(ude->object)) {
Guido van Rossum98297ee2007-11-06 21:34:58 +00001867 if (PyObject_AsReadBuffer(ude->object, (const void **)&data, &size)) {
1868 ude->encoding = ude->object = ude->reason = NULL;
1869 return -1;
1870 }
Christian Heimes72b710a2008-05-26 13:28:38 +00001871 ude->object = PyBytes_FromStringAndSize(data, size);
Guido van Rossum98297ee2007-11-06 21:34:58 +00001872 }
1873 else {
1874 Py_INCREF(ude->object);
1875 }
1876
1877 Py_INCREF(ude->encoding);
1878 Py_INCREF(ude->reason);
1879
1880 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001881}
1882
1883static PyObject *
1884UnicodeDecodeError_str(PyObject *self)
1885{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001886 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00001887 PyObject *result = NULL;
1888 PyObject *reason_str = NULL;
1889 PyObject *encoding_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001890
Eric Smith0facd772010-02-24 15:42:29 +00001891 /* Get reason and encoding as strings, which they might not be if
1892 they've been modified after we were contructed. */
1893 reason_str = PyObject_Str(uself->reason);
1894 if (reason_str == NULL)
1895 goto done;
1896 encoding_str = PyObject_Str(uself->encoding);
1897 if (encoding_str == NULL)
1898 goto done;
1899
1900 if (uself->start < PyBytes_GET_SIZE(uself->object) && uself->end == uself->start+1) {
Christian Heimes72b710a2008-05-26 13:28:38 +00001901 int byte = (int)(PyBytes_AS_STRING(((PyUnicodeErrorObject *)self)->object)[uself->start]&0xff);
Eric Smith0facd772010-02-24 15:42:29 +00001902 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00001903 "'%U' codec can't decode byte 0x%02x in position %zd: %U",
Eric Smith0facd772010-02-24 15:42:29 +00001904 encoding_str,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001905 byte,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001906 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00001907 reason_str);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001908 }
Eric Smith0facd772010-02-24 15:42:29 +00001909 else {
1910 result = PyUnicode_FromFormat(
1911 "'%U' codec can't decode bytes in position %zd-%zd: %U",
1912 encoding_str,
1913 uself->start,
1914 uself->end-1,
1915 reason_str
1916 );
1917 }
1918done:
1919 Py_XDECREF(reason_str);
1920 Py_XDECREF(encoding_str);
1921 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001922}
1923
1924static PyTypeObject _PyExc_UnicodeDecodeError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001925 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00001926 "UnicodeDecodeError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00001927 sizeof(PyUnicodeErrorObject), 0,
1928 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1929 (reprfunc)UnicodeDecodeError_str, 0, 0, 0,
1930 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001931 PyDoc_STR("Unicode decoding error."), (traverseproc)UnicodeError_traverse,
1932 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001933 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001934 (initproc)UnicodeDecodeError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001935};
1936PyObject *PyExc_UnicodeDecodeError = (PyObject *)&_PyExc_UnicodeDecodeError;
1937
1938PyObject *
1939PyUnicodeDecodeError_Create(
1940 const char *encoding, const char *object, Py_ssize_t length,
1941 Py_ssize_t start, Py_ssize_t end, const char *reason)
1942{
Victor Stinner7eeb5b52010-06-07 19:57:46 +00001943 return PyObject_CallFunction(PyExc_UnicodeDecodeError, "sy#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001944 encoding, object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001945}
1946
1947
1948/*
1949 * UnicodeTranslateError extends UnicodeError
1950 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001951
1952static int
1953UnicodeTranslateError_init(PyUnicodeErrorObject *self, PyObject *args,
1954 PyObject *kwds)
1955{
1956 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1957 return -1;
1958
1959 Py_CLEAR(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001960 Py_CLEAR(self->reason);
1961
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001962 if (!PyArg_ParseTuple(args, "O!nnO!",
Thomas Wouters477c8d52006-05-27 19:21:47 +00001963 &PyUnicode_Type, &self->object,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001964 &self->start,
1965 &self->end,
Walter Dörwaldd2034312007-05-18 16:29:38 +00001966 &PyUnicode_Type, &self->reason)) {
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001967 self->object = self->reason = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001968 return -1;
1969 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001970
Thomas Wouters477c8d52006-05-27 19:21:47 +00001971 Py_INCREF(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001972 Py_INCREF(self->reason);
1973
1974 return 0;
1975}
1976
1977
1978static PyObject *
1979UnicodeTranslateError_str(PyObject *self)
1980{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001981 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00001982 PyObject *result = NULL;
1983 PyObject *reason_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001984
Eric Smith0facd772010-02-24 15:42:29 +00001985 /* Get reason as a string, which it might not be if it's been
1986 modified after we were contructed. */
1987 reason_str = PyObject_Str(uself->reason);
1988 if (reason_str == NULL)
1989 goto done;
1990
Victor Stinner53b33e72011-11-21 01:17:27 +01001991 if (uself->start < PyUnicode_GET_LENGTH(uself->object) && uself->end == uself->start+1) {
1992 Py_UCS4 badchar = PyUnicode_ReadChar(uself->object, uself->start);
Walter Dörwald787b03b2007-06-05 13:29:29 +00001993 const char *fmt;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001994 if (badchar <= 0xff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00001995 fmt = "can't translate character '\\x%02x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001996 else if (badchar <= 0xffff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00001997 fmt = "can't translate character '\\u%04x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001998 else
Walter Dörwald32a4c712007-06-20 09:25:34 +00001999 fmt = "can't translate character '\\U%08x' in position %zd: %U";
Benjamin Petersonc5f4e1e2010-02-25 01:22:28 +00002000 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00002001 fmt,
Victor Stinner53b33e72011-11-21 01:17:27 +01002002 (int)badchar,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002003 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00002004 reason_str
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002005 );
Eric Smith0facd772010-02-24 15:42:29 +00002006 } else {
2007 result = PyUnicode_FromFormat(
2008 "can't translate characters in position %zd-%zd: %U",
2009 uself->start,
2010 uself->end-1,
2011 reason_str
2012 );
Thomas Wouters477c8d52006-05-27 19:21:47 +00002013 }
Eric Smith0facd772010-02-24 15:42:29 +00002014done:
2015 Py_XDECREF(reason_str);
2016 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002017}
2018
2019static PyTypeObject _PyExc_UnicodeTranslateError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002020 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00002021 "UnicodeTranslateError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00002022 sizeof(PyUnicodeErrorObject), 0,
2023 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2024 (reprfunc)UnicodeTranslateError_str, 0, 0, 0,
2025 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters89f507f2006-12-13 04:49:30 +00002026 PyDoc_STR("Unicode translation error."), (traverseproc)UnicodeError_traverse,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002027 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
2028 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002029 (initproc)UnicodeTranslateError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002030};
2031PyObject *PyExc_UnicodeTranslateError = (PyObject *)&_PyExc_UnicodeTranslateError;
2032
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002033/* Deprecated. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002034PyObject *
2035PyUnicodeTranslateError_Create(
2036 const Py_UNICODE *object, Py_ssize_t length,
2037 Py_ssize_t start, Py_ssize_t end, const char *reason)
2038{
2039 return PyObject_CallFunction(PyExc_UnicodeTranslateError, "u#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002040 object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002041}
Thomas Wouters477c8d52006-05-27 19:21:47 +00002042
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002043PyObject *
2044_PyUnicodeTranslateError_Create(
2045 PyObject *object,
2046 Py_ssize_t start, Py_ssize_t end, const char *reason)
2047{
2048 return PyObject_CallFunction(PyExc_UnicodeTranslateError, "Ons",
2049 object, start, end, reason);
2050}
Thomas Wouters477c8d52006-05-27 19:21:47 +00002051
2052/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002053 * AssertionError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002054 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002055SimpleExtendsException(PyExc_Exception, AssertionError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002056 "Assertion failed.");
2057
2058
2059/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002060 * ArithmeticError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002061 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002062SimpleExtendsException(PyExc_Exception, ArithmeticError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002063 "Base class for arithmetic errors.");
2064
2065
2066/*
2067 * FloatingPointError extends ArithmeticError
2068 */
2069SimpleExtendsException(PyExc_ArithmeticError, FloatingPointError,
2070 "Floating point operation failed.");
2071
2072
2073/*
2074 * OverflowError extends ArithmeticError
2075 */
2076SimpleExtendsException(PyExc_ArithmeticError, OverflowError,
2077 "Result too large to be represented.");
2078
2079
2080/*
2081 * ZeroDivisionError extends ArithmeticError
2082 */
2083SimpleExtendsException(PyExc_ArithmeticError, ZeroDivisionError,
2084 "Second argument to a division or modulo operation was zero.");
2085
2086
2087/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002088 * SystemError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002089 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002090SimpleExtendsException(PyExc_Exception, SystemError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002091 "Internal error in the Python interpreter.\n"
2092 "\n"
2093 "Please report this to the Python maintainer, along with the traceback,\n"
2094 "the Python version, and the hardware/OS platform and version.");
2095
2096
2097/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002098 * ReferenceError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002099 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002100SimpleExtendsException(PyExc_Exception, ReferenceError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002101 "Weak ref proxy used after referent went away.");
2102
2103
2104/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002105 * MemoryError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002106 */
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002107
2108#define MEMERRORS_SAVE 16
2109static PyBaseExceptionObject *memerrors_freelist = NULL;
2110static int memerrors_numfree = 0;
2111
2112static PyObject *
2113MemoryError_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2114{
2115 PyBaseExceptionObject *self;
2116
2117 if (type != (PyTypeObject *) PyExc_MemoryError)
2118 return BaseException_new(type, args, kwds);
2119 if (memerrors_freelist == NULL)
2120 return BaseException_new(type, args, kwds);
2121 /* Fetch object from freelist and revive it */
2122 self = memerrors_freelist;
2123 self->args = PyTuple_New(0);
2124 /* This shouldn't happen since the empty tuple is persistent */
2125 if (self->args == NULL)
2126 return NULL;
2127 memerrors_freelist = (PyBaseExceptionObject *) self->dict;
2128 memerrors_numfree--;
2129 self->dict = NULL;
2130 _Py_NewReference((PyObject *)self);
2131 _PyObject_GC_TRACK(self);
2132 return (PyObject *)self;
2133}
2134
2135static void
2136MemoryError_dealloc(PyBaseExceptionObject *self)
2137{
2138 _PyObject_GC_UNTRACK(self);
2139 BaseException_clear(self);
2140 if (memerrors_numfree >= MEMERRORS_SAVE)
2141 Py_TYPE(self)->tp_free((PyObject *)self);
2142 else {
2143 self->dict = (PyObject *) memerrors_freelist;
2144 memerrors_freelist = self;
2145 memerrors_numfree++;
2146 }
2147}
2148
2149static void
2150preallocate_memerrors(void)
2151{
2152 /* We create enough MemoryErrors and then decref them, which will fill
2153 up the freelist. */
2154 int i;
2155 PyObject *errors[MEMERRORS_SAVE];
2156 for (i = 0; i < MEMERRORS_SAVE; i++) {
2157 errors[i] = MemoryError_new((PyTypeObject *) PyExc_MemoryError,
2158 NULL, NULL);
2159 if (!errors[i])
2160 Py_FatalError("Could not preallocate MemoryError object");
2161 }
2162 for (i = 0; i < MEMERRORS_SAVE; i++) {
2163 Py_DECREF(errors[i]);
2164 }
2165}
2166
2167static void
2168free_preallocated_memerrors(void)
2169{
2170 while (memerrors_freelist != NULL) {
2171 PyObject *self = (PyObject *) memerrors_freelist;
2172 memerrors_freelist = (PyBaseExceptionObject *) memerrors_freelist->dict;
2173 Py_TYPE(self)->tp_free((PyObject *)self);
2174 }
2175}
2176
2177
2178static PyTypeObject _PyExc_MemoryError = {
2179 PyVarObject_HEAD_INIT(NULL, 0)
2180 "MemoryError",
2181 sizeof(PyBaseExceptionObject),
2182 0, (destructor)MemoryError_dealloc, 0, 0, 0, 0, 0, 0, 0,
2183 0, 0, 0, 0, 0, 0, 0,
2184 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
2185 PyDoc_STR("Out of memory."), (traverseproc)BaseException_traverse,
2186 (inquiry)BaseException_clear, 0, 0, 0, 0, 0, 0, 0, &_PyExc_Exception,
2187 0, 0, 0, offsetof(PyBaseExceptionObject, dict),
2188 (initproc)BaseException_init, 0, MemoryError_new
2189};
2190PyObject *PyExc_MemoryError = (PyObject *) &_PyExc_MemoryError;
2191
Thomas Wouters477c8d52006-05-27 19:21:47 +00002192
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002193/*
2194 * BufferError extends Exception
2195 */
2196SimpleExtendsException(PyExc_Exception, BufferError, "Buffer error.");
2197
Thomas Wouters477c8d52006-05-27 19:21:47 +00002198
2199/* Warning category docstrings */
2200
2201/*
2202 * Warning extends Exception
2203 */
2204SimpleExtendsException(PyExc_Exception, Warning,
2205 "Base class for warning categories.");
2206
2207
2208/*
2209 * UserWarning extends Warning
2210 */
2211SimpleExtendsException(PyExc_Warning, UserWarning,
2212 "Base class for warnings generated by user code.");
2213
2214
2215/*
2216 * DeprecationWarning extends Warning
2217 */
2218SimpleExtendsException(PyExc_Warning, DeprecationWarning,
2219 "Base class for warnings about deprecated features.");
2220
2221
2222/*
2223 * PendingDeprecationWarning extends Warning
2224 */
2225SimpleExtendsException(PyExc_Warning, PendingDeprecationWarning,
2226 "Base class for warnings about features which will be deprecated\n"
2227 "in the future.");
2228
2229
2230/*
2231 * SyntaxWarning extends Warning
2232 */
2233SimpleExtendsException(PyExc_Warning, SyntaxWarning,
2234 "Base class for warnings about dubious syntax.");
2235
2236
2237/*
2238 * RuntimeWarning extends Warning
2239 */
2240SimpleExtendsException(PyExc_Warning, RuntimeWarning,
2241 "Base class for warnings about dubious runtime behavior.");
2242
2243
2244/*
2245 * FutureWarning extends Warning
2246 */
2247SimpleExtendsException(PyExc_Warning, FutureWarning,
2248 "Base class for warnings about constructs that will change semantically\n"
2249 "in the future.");
2250
2251
2252/*
2253 * ImportWarning extends Warning
2254 */
2255SimpleExtendsException(PyExc_Warning, ImportWarning,
2256 "Base class for warnings about probable mistakes in module imports");
2257
2258
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002259/*
2260 * UnicodeWarning extends Warning
2261 */
2262SimpleExtendsException(PyExc_Warning, UnicodeWarning,
2263 "Base class for warnings about Unicode related problems, mostly\n"
2264 "related to conversion problems.");
2265
Georg Brandl08be72d2010-10-24 15:11:22 +00002266
Guido van Rossum98297ee2007-11-06 21:34:58 +00002267/*
2268 * BytesWarning extends Warning
2269 */
2270SimpleExtendsException(PyExc_Warning, BytesWarning,
2271 "Base class for warnings about bytes and buffer related problems, mostly\n"
2272 "related to conversion from str or comparing to str.");
2273
2274
Georg Brandl08be72d2010-10-24 15:11:22 +00002275/*
2276 * ResourceWarning extends Warning
2277 */
2278SimpleExtendsException(PyExc_Warning, ResourceWarning,
2279 "Base class for warnings about resource usage.");
2280
2281
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002282
Thomas Wouters89d996e2007-09-08 17:39:28 +00002283/* Pre-computed RuntimeError instance for when recursion depth is reached.
2284 Meant to be used when normalizing the exception for exceeding the recursion
2285 depth will cause its own infinite recursion.
2286*/
2287PyObject *PyExc_RecursionErrorInst = NULL;
2288
Antoine Pitrou55f217f2012-01-18 21:23:13 +01002289#define PRE_INIT(TYPE) \
2290 if (!(_PyExc_ ## TYPE.tp_flags & Py_TPFLAGS_READY)) { \
2291 if (PyType_Ready(&_PyExc_ ## TYPE) < 0) \
2292 Py_FatalError("exceptions bootstrapping error."); \
2293 Py_INCREF(PyExc_ ## TYPE); \
2294 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002295
Antoine Pitrou55f217f2012-01-18 21:23:13 +01002296#define POST_INIT(TYPE) \
Thomas Wouters477c8d52006-05-27 19:21:47 +00002297 if (PyDict_SetItemString(bdict, # TYPE, PyExc_ ## TYPE)) \
2298 Py_FatalError("Module dictionary insertion problem.");
2299
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002300#define INIT_ALIAS(NAME, TYPE) Py_INCREF(PyExc_ ## TYPE); \
Antoine Pitrou8b0a74e2012-01-18 21:29:05 +01002301 Py_XDECREF(PyExc_ ## NAME); \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002302 PyExc_ ## NAME = PyExc_ ## TYPE; \
2303 if (PyDict_SetItemString(bdict, # NAME, PyExc_ ## NAME)) \
2304 Py_FatalError("Module dictionary insertion problem.");
2305
2306#define ADD_ERRNO(TYPE, CODE) { \
2307 PyObject *_code = PyLong_FromLong(CODE); \
2308 assert(_PyObject_RealIsSubclass(PyExc_ ## TYPE, PyExc_OSError)); \
2309 if (!_code || PyDict_SetItem(errnomap, _code, PyExc_ ## TYPE)) \
2310 Py_FatalError("errmap insertion problem."); \
Antoine Pitrou8b0a74e2012-01-18 21:29:05 +01002311 Py_DECREF(_code); \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002312 }
2313
2314#ifdef MS_WINDOWS
2315#include <Winsock2.h>
Brian Curtin401f9f32012-05-13 11:19:23 -05002316/* The following constants were added to errno.h in VS2010 but have
2317 preferred WSA equivalents. */
2318#undef EADDRINUSE
2319#undef EADDRNOTAVAIL
2320#undef EAFNOSUPPORT
2321#undef EALREADY
2322#undef ECONNABORTED
2323#undef ECONNREFUSED
2324#undef ECONNRESET
2325#undef EDESTADDRREQ
2326#undef EHOSTUNREACH
2327#undef EINPROGRESS
2328#undef EISCONN
2329#undef ELOOP
2330#undef EMSGSIZE
2331#undef ENETDOWN
2332#undef ENETRESET
2333#undef ENETUNREACH
2334#undef ENOBUFS
2335#undef ENOPROTOOPT
2336#undef ENOTCONN
2337#undef ENOTSOCK
2338#undef EOPNOTSUPP
2339#undef EPROTONOSUPPORT
2340#undef EPROTOTYPE
2341#undef ETIMEDOUT
2342#undef EWOULDBLOCK
2343
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002344#if defined(WSAEALREADY) && !defined(EALREADY)
2345#define EALREADY WSAEALREADY
2346#endif
2347#if defined(WSAECONNABORTED) && !defined(ECONNABORTED)
2348#define ECONNABORTED WSAECONNABORTED
2349#endif
2350#if defined(WSAECONNREFUSED) && !defined(ECONNREFUSED)
2351#define ECONNREFUSED WSAECONNREFUSED
2352#endif
2353#if defined(WSAECONNRESET) && !defined(ECONNRESET)
2354#define ECONNRESET WSAECONNRESET
2355#endif
2356#if defined(WSAEINPROGRESS) && !defined(EINPROGRESS)
2357#define EINPROGRESS WSAEINPROGRESS
2358#endif
2359#if defined(WSAESHUTDOWN) && !defined(ESHUTDOWN)
2360#define ESHUTDOWN WSAESHUTDOWN
2361#endif
2362#if defined(WSAETIMEDOUT) && !defined(ETIMEDOUT)
2363#define ETIMEDOUT WSAETIMEDOUT
2364#endif
2365#if defined(WSAEWOULDBLOCK) && !defined(EWOULDBLOCK)
2366#define EWOULDBLOCK WSAEWOULDBLOCK
2367#endif
2368#endif /* MS_WINDOWS */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002369
Martin v. Löwis1a214512008-06-11 05:26:20 +00002370void
Brett Cannonfd074152012-04-14 14:10:13 -04002371_PyExc_Init(PyObject *bltinmod)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002372{
Brett Cannonfd074152012-04-14 14:10:13 -04002373 PyObject *bdict;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002374
2375 PRE_INIT(BaseException)
2376 PRE_INIT(Exception)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002377 PRE_INIT(TypeError)
2378 PRE_INIT(StopIteration)
2379 PRE_INIT(GeneratorExit)
2380 PRE_INIT(SystemExit)
2381 PRE_INIT(KeyboardInterrupt)
2382 PRE_INIT(ImportError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002383 PRE_INIT(OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002384 PRE_INIT(EOFError)
2385 PRE_INIT(RuntimeError)
2386 PRE_INIT(NotImplementedError)
2387 PRE_INIT(NameError)
2388 PRE_INIT(UnboundLocalError)
2389 PRE_INIT(AttributeError)
2390 PRE_INIT(SyntaxError)
2391 PRE_INIT(IndentationError)
2392 PRE_INIT(TabError)
2393 PRE_INIT(LookupError)
2394 PRE_INIT(IndexError)
2395 PRE_INIT(KeyError)
2396 PRE_INIT(ValueError)
2397 PRE_INIT(UnicodeError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002398 PRE_INIT(UnicodeEncodeError)
2399 PRE_INIT(UnicodeDecodeError)
2400 PRE_INIT(UnicodeTranslateError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002401 PRE_INIT(AssertionError)
2402 PRE_INIT(ArithmeticError)
2403 PRE_INIT(FloatingPointError)
2404 PRE_INIT(OverflowError)
2405 PRE_INIT(ZeroDivisionError)
2406 PRE_INIT(SystemError)
2407 PRE_INIT(ReferenceError)
Neal Norwitzfaa54a32007-08-19 04:23:20 +00002408 PRE_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002409 PRE_INIT(MemoryError)
Benjamin Peterson2b968d62008-07-05 23:38:30 +00002410 PRE_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002411 PRE_INIT(Warning)
2412 PRE_INIT(UserWarning)
2413 PRE_INIT(DeprecationWarning)
2414 PRE_INIT(PendingDeprecationWarning)
2415 PRE_INIT(SyntaxWarning)
2416 PRE_INIT(RuntimeWarning)
2417 PRE_INIT(FutureWarning)
2418 PRE_INIT(ImportWarning)
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002419 PRE_INIT(UnicodeWarning)
Guido van Rossum98297ee2007-11-06 21:34:58 +00002420 PRE_INIT(BytesWarning)
Georg Brandl08be72d2010-10-24 15:11:22 +00002421 PRE_INIT(ResourceWarning)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002422
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002423 /* OSError subclasses */
2424 PRE_INIT(ConnectionError);
2425
2426 PRE_INIT(BlockingIOError);
2427 PRE_INIT(BrokenPipeError);
2428 PRE_INIT(ChildProcessError);
2429 PRE_INIT(ConnectionAbortedError);
2430 PRE_INIT(ConnectionRefusedError);
2431 PRE_INIT(ConnectionResetError);
2432 PRE_INIT(FileExistsError);
2433 PRE_INIT(FileNotFoundError);
2434 PRE_INIT(IsADirectoryError);
2435 PRE_INIT(NotADirectoryError);
2436 PRE_INIT(InterruptedError);
2437 PRE_INIT(PermissionError);
2438 PRE_INIT(ProcessLookupError);
2439 PRE_INIT(TimeoutError);
2440
Thomas Wouters477c8d52006-05-27 19:21:47 +00002441 bdict = PyModule_GetDict(bltinmod);
2442 if (bdict == NULL)
2443 Py_FatalError("exceptions bootstrapping error.");
2444
2445 POST_INIT(BaseException)
2446 POST_INIT(Exception)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002447 POST_INIT(TypeError)
2448 POST_INIT(StopIteration)
2449 POST_INIT(GeneratorExit)
2450 POST_INIT(SystemExit)
2451 POST_INIT(KeyboardInterrupt)
2452 POST_INIT(ImportError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002453 POST_INIT(OSError)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002454 INIT_ALIAS(EnvironmentError, OSError)
2455 INIT_ALIAS(IOError, OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002456#ifdef MS_WINDOWS
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002457 INIT_ALIAS(WindowsError, OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002458#endif
2459#ifdef __VMS
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002460 INIT_ALIAS(VMSError, OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002461#endif
2462 POST_INIT(EOFError)
2463 POST_INIT(RuntimeError)
2464 POST_INIT(NotImplementedError)
2465 POST_INIT(NameError)
2466 POST_INIT(UnboundLocalError)
2467 POST_INIT(AttributeError)
2468 POST_INIT(SyntaxError)
2469 POST_INIT(IndentationError)
2470 POST_INIT(TabError)
2471 POST_INIT(LookupError)
2472 POST_INIT(IndexError)
2473 POST_INIT(KeyError)
2474 POST_INIT(ValueError)
2475 POST_INIT(UnicodeError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002476 POST_INIT(UnicodeEncodeError)
2477 POST_INIT(UnicodeDecodeError)
2478 POST_INIT(UnicodeTranslateError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002479 POST_INIT(AssertionError)
2480 POST_INIT(ArithmeticError)
2481 POST_INIT(FloatingPointError)
2482 POST_INIT(OverflowError)
2483 POST_INIT(ZeroDivisionError)
2484 POST_INIT(SystemError)
2485 POST_INIT(ReferenceError)
Neal Norwitzfaa54a32007-08-19 04:23:20 +00002486 POST_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002487 POST_INIT(MemoryError)
Benjamin Peterson2b968d62008-07-05 23:38:30 +00002488 POST_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002489 POST_INIT(Warning)
2490 POST_INIT(UserWarning)
2491 POST_INIT(DeprecationWarning)
2492 POST_INIT(PendingDeprecationWarning)
2493 POST_INIT(SyntaxWarning)
2494 POST_INIT(RuntimeWarning)
2495 POST_INIT(FutureWarning)
2496 POST_INIT(ImportWarning)
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002497 POST_INIT(UnicodeWarning)
Guido van Rossum98297ee2007-11-06 21:34:58 +00002498 POST_INIT(BytesWarning)
Georg Brandl08be72d2010-10-24 15:11:22 +00002499 POST_INIT(ResourceWarning)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002500
Antoine Pitrouac456a12012-01-18 21:35:21 +01002501 if (!errnomap) {
2502 errnomap = PyDict_New();
2503 if (!errnomap)
2504 Py_FatalError("Cannot allocate map from errnos to OSError subclasses");
2505 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002506
2507 /* OSError subclasses */
2508 POST_INIT(ConnectionError);
2509
2510 POST_INIT(BlockingIOError);
2511 ADD_ERRNO(BlockingIOError, EAGAIN);
2512 ADD_ERRNO(BlockingIOError, EALREADY);
2513 ADD_ERRNO(BlockingIOError, EINPROGRESS);
2514 ADD_ERRNO(BlockingIOError, EWOULDBLOCK);
2515 POST_INIT(BrokenPipeError);
2516 ADD_ERRNO(BrokenPipeError, EPIPE);
2517 ADD_ERRNO(BrokenPipeError, ESHUTDOWN);
2518 POST_INIT(ChildProcessError);
2519 ADD_ERRNO(ChildProcessError, ECHILD);
2520 POST_INIT(ConnectionAbortedError);
2521 ADD_ERRNO(ConnectionAbortedError, ECONNABORTED);
2522 POST_INIT(ConnectionRefusedError);
2523 ADD_ERRNO(ConnectionRefusedError, ECONNREFUSED);
2524 POST_INIT(ConnectionResetError);
2525 ADD_ERRNO(ConnectionResetError, ECONNRESET);
2526 POST_INIT(FileExistsError);
2527 ADD_ERRNO(FileExistsError, EEXIST);
2528 POST_INIT(FileNotFoundError);
2529 ADD_ERRNO(FileNotFoundError, ENOENT);
2530 POST_INIT(IsADirectoryError);
2531 ADD_ERRNO(IsADirectoryError, EISDIR);
2532 POST_INIT(NotADirectoryError);
2533 ADD_ERRNO(NotADirectoryError, ENOTDIR);
2534 POST_INIT(InterruptedError);
2535 ADD_ERRNO(InterruptedError, EINTR);
2536 POST_INIT(PermissionError);
2537 ADD_ERRNO(PermissionError, EACCES);
2538 ADD_ERRNO(PermissionError, EPERM);
2539 POST_INIT(ProcessLookupError);
2540 ADD_ERRNO(ProcessLookupError, ESRCH);
2541 POST_INIT(TimeoutError);
2542 ADD_ERRNO(TimeoutError, ETIMEDOUT);
2543
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002544 preallocate_memerrors();
Thomas Wouters477c8d52006-05-27 19:21:47 +00002545
Antoine Pitrou1c7ade52012-01-18 16:13:31 +01002546 if (!PyExc_RecursionErrorInst) {
2547 PyExc_RecursionErrorInst = BaseException_new(&_PyExc_RuntimeError, NULL, NULL);
2548 if (!PyExc_RecursionErrorInst)
2549 Py_FatalError("Cannot pre-allocate RuntimeError instance for "
2550 "recursion errors");
2551 else {
2552 PyBaseExceptionObject *err_inst =
2553 (PyBaseExceptionObject *)PyExc_RecursionErrorInst;
2554 PyObject *args_tuple;
2555 PyObject *exc_message;
2556 exc_message = PyUnicode_FromString("maximum recursion depth exceeded");
2557 if (!exc_message)
2558 Py_FatalError("cannot allocate argument for RuntimeError "
2559 "pre-allocation");
2560 args_tuple = PyTuple_Pack(1, exc_message);
2561 if (!args_tuple)
2562 Py_FatalError("cannot allocate tuple for RuntimeError "
2563 "pre-allocation");
2564 Py_DECREF(exc_message);
2565 if (BaseException_init(err_inst, args_tuple, NULL))
2566 Py_FatalError("init of pre-allocated RuntimeError failed");
2567 Py_DECREF(args_tuple);
2568 }
Thomas Wouters89d996e2007-09-08 17:39:28 +00002569 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002570}
2571
2572void
2573_PyExc_Fini(void)
2574{
Benjamin Peterson78565b22009-06-28 19:19:51 +00002575 Py_CLEAR(PyExc_RecursionErrorInst);
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002576 free_preallocated_memerrors();
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002577 Py_CLEAR(errnomap);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002578}