blob: 4f188029945e149ecd6cd4e210b5e939ce974a8f [file] [log] [blame]
Georg Brandl43ab1002006-05-28 20:57:09 +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
Richard Jones7b9558d2006-05-27 12:29:24 +00007#define PY_SSIZE_T_CLEAN
8#include <Python.h>
9#include "structmember.h"
10#include "osdefs.h"
11
12#define MAKE_IT_NONE(x) (x) = Py_None; Py_INCREF(Py_None);
13#define EXC_MODULE_NAME "exceptions."
14
Richard Jonesc5b2a2e2006-05-27 16:07:28 +000015/* NOTE: If the exception class hierarchy changes, don't forget to update
16 * Lib/test/exception_hierarchy.txt
17 */
18
19PyDoc_STRVAR(exceptions_doc, "Python's standard exception class hierarchy.\n\
20\n\
21Exceptions found here are defined both in the exceptions module and the\n\
22built-in namespace. It is recommended that user-defined exceptions\n\
23inherit from Exception. See the documentation for the exception\n\
24inheritance hierarchy.\n\
25");
26
Richard Jones7b9558d2006-05-27 12:29:24 +000027/*
28 * BaseException
29 */
30static PyObject *
31BaseException_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
32{
33 PyBaseExceptionObject *self;
34
35 self = (PyBaseExceptionObject *)type->tp_alloc(type, 0);
Georg Brandlc02e1312007-04-11 17:16:24 +000036 if (!self)
37 return NULL;
Richard Jones7b9558d2006-05-27 12:29:24 +000038 /* the dict is created on the fly in PyObject_GenericSetAttr */
39 self->message = self->dict = NULL;
40
Georg Brandld7e9f602007-08-21 06:03:43 +000041 self->args = PyTuple_New(0);
42 if (!self->args) {
Richard Jones7b9558d2006-05-27 12:29:24 +000043 Py_DECREF(self);
44 return NULL;
45 }
Georg Brandld7e9f602007-08-21 06:03:43 +000046
Gregory P. Smithdd96db62008-06-09 04:58:54 +000047 self->message = PyString_FromString("");
Richard Jones7b9558d2006-05-27 12:29:24 +000048 if (!self->message) {
49 Py_DECREF(self);
50 return NULL;
51 }
Georg Brandld7e9f602007-08-21 06:03:43 +000052
Richard Jones7b9558d2006-05-27 12:29:24 +000053 return (PyObject *)self;
54}
55
56static int
57BaseException_init(PyBaseExceptionObject *self, PyObject *args, PyObject *kwds)
58{
Christian Heimese93237d2007-12-19 02:37:44 +000059 if (!_PyArg_NoKeywords(Py_TYPE(self)->tp_name, kwds))
Georg Brandlb0432bc2006-05-30 08:17:00 +000060 return -1;
61
Richard Jones7b9558d2006-05-27 12:29:24 +000062 Py_DECREF(self->args);
63 self->args = args;
64 Py_INCREF(self->args);
65
66 if (PyTuple_GET_SIZE(self->args) == 1) {
Michael W. Hudson22a80e72006-05-28 15:51:40 +000067 Py_CLEAR(self->message);
Richard Jones7b9558d2006-05-27 12:29:24 +000068 self->message = PyTuple_GET_ITEM(self->args, 0);
Michael W. Hudson22a80e72006-05-28 15:51:40 +000069 Py_INCREF(self->message);
Richard Jones7b9558d2006-05-27 12:29:24 +000070 }
71 return 0;
72}
73
Michael W. Hudson96495ee2006-05-28 17:40:29 +000074static int
Richard Jones7b9558d2006-05-27 12:29:24 +000075BaseException_clear(PyBaseExceptionObject *self)
76{
77 Py_CLEAR(self->dict);
78 Py_CLEAR(self->args);
79 Py_CLEAR(self->message);
80 return 0;
81}
82
83static void
84BaseException_dealloc(PyBaseExceptionObject *self)
85{
Georg Brandl38f62372006-09-06 06:50:05 +000086 _PyObject_GC_UNTRACK(self);
Richard Jones7b9558d2006-05-27 12:29:24 +000087 BaseException_clear(self);
Christian Heimese93237d2007-12-19 02:37:44 +000088 Py_TYPE(self)->tp_free((PyObject *)self);
Richard Jones7b9558d2006-05-27 12:29:24 +000089}
90
Michael W. Hudson96495ee2006-05-28 17:40:29 +000091static int
Richard Jones7b9558d2006-05-27 12:29:24 +000092BaseException_traverse(PyBaseExceptionObject *self, visitproc visit, void *arg)
93{
Michael W. Hudson22a80e72006-05-28 15:51:40 +000094 Py_VISIT(self->dict);
Richard Jones7b9558d2006-05-27 12:29:24 +000095 Py_VISIT(self->args);
96 Py_VISIT(self->message);
97 return 0;
98}
99
100static PyObject *
101BaseException_str(PyBaseExceptionObject *self)
102{
103 PyObject *out;
104
Michael W. Hudson22a80e72006-05-28 15:51:40 +0000105 switch (PyTuple_GET_SIZE(self->args)) {
Richard Jones7b9558d2006-05-27 12:29:24 +0000106 case 0:
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000107 out = PyString_FromString("");
Richard Jones7b9558d2006-05-27 12:29:24 +0000108 break;
109 case 1:
Michael W. Hudson22a80e72006-05-28 15:51:40 +0000110 out = PyObject_Str(PyTuple_GET_ITEM(self->args, 0));
Richard Jones7b9558d2006-05-27 12:29:24 +0000111 break;
Richard Jones7b9558d2006-05-27 12:29:24 +0000112 default:
113 out = PyObject_Str(self->args);
114 break;
115 }
116
117 return out;
118}
119
Nick Coghlan524b7772008-07-08 14:08:04 +0000120#ifdef Py_USING_UNICODE
121static PyObject *
122BaseException_unicode(PyBaseExceptionObject *self)
123{
124 PyObject *out;
125
Ezio Melottie7482382009-12-24 22:32:25 +0000126 /* issue6108: if __str__ has been overridden in the subclass, unicode()
127 should return the message returned by __str__ as used to happen
128 before this method was implemented. */
129 if (Py_TYPE(self)->tp_str != (reprfunc)BaseException_str) {
130 PyObject *str;
131 /* Unlike PyObject_Str, tp_str can return unicode (i.e. return the
132 equivalent of unicode(e.__str__()) instead of unicode(str(e))). */
133 str = Py_TYPE(self)->tp_str((PyObject*)self);
134 if (str == NULL)
135 return NULL;
136 out = PyObject_Unicode(str);
137 Py_DECREF(str);
138 return out;
139 }
140
Nick Coghlan524b7772008-07-08 14:08:04 +0000141 switch (PyTuple_GET_SIZE(self->args)) {
142 case 0:
143 out = PyUnicode_FromString("");
144 break;
145 case 1:
146 out = PyObject_Unicode(PyTuple_GET_ITEM(self->args, 0));
147 break;
148 default:
149 out = PyObject_Unicode(self->args);
150 break;
151 }
152
153 return out;
154}
155#endif
156
Richard Jones7b9558d2006-05-27 12:29:24 +0000157static PyObject *
158BaseException_repr(PyBaseExceptionObject *self)
159{
Richard Jones7b9558d2006-05-27 12:29:24 +0000160 PyObject *repr_suffix;
161 PyObject *repr;
162 char *name;
163 char *dot;
164
Michael W. Hudson22a80e72006-05-28 15:51:40 +0000165 repr_suffix = PyObject_Repr(self->args);
166 if (!repr_suffix)
Richard Jones7b9558d2006-05-27 12:29:24 +0000167 return NULL;
Richard Jones7b9558d2006-05-27 12:29:24 +0000168
Christian Heimese93237d2007-12-19 02:37:44 +0000169 name = (char *)Py_TYPE(self)->tp_name;
Richard Jones7b9558d2006-05-27 12:29:24 +0000170 dot = strrchr(name, '.');
171 if (dot != NULL) name = dot+1;
172
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000173 repr = PyString_FromString(name);
Richard Jones7b9558d2006-05-27 12:29:24 +0000174 if (!repr) {
175 Py_DECREF(repr_suffix);
176 return NULL;
177 }
178
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000179 PyString_ConcatAndDel(&repr, repr_suffix);
Richard Jones7b9558d2006-05-27 12:29:24 +0000180 return repr;
181}
182
183/* Pickling support */
184static PyObject *
185BaseException_reduce(PyBaseExceptionObject *self)
186{
Georg Brandlddba4732006-05-30 07:04:55 +0000187 if (self->args && self->dict)
Christian Heimese93237d2007-12-19 02:37:44 +0000188 return PyTuple_Pack(3, Py_TYPE(self), self->args, self->dict);
Georg Brandl05f97bf2006-05-30 07:13:29 +0000189 else
Christian Heimese93237d2007-12-19 02:37:44 +0000190 return PyTuple_Pack(2, Py_TYPE(self), self->args);
Richard Jones7b9558d2006-05-27 12:29:24 +0000191}
192
Georg Brandl85ac8502006-06-01 06:39:19 +0000193/*
194 * Needed for backward compatibility, since exceptions used to store
195 * all their attributes in the __dict__. Code is taken from cPickle's
196 * load_build function.
197 */
198static PyObject *
199BaseException_setstate(PyObject *self, PyObject *state)
200{
201 PyObject *d_key, *d_value;
202 Py_ssize_t i = 0;
203
204 if (state != Py_None) {
205 if (!PyDict_Check(state)) {
206 PyErr_SetString(PyExc_TypeError, "state is not a dictionary");
207 return NULL;
208 }
209 while (PyDict_Next(state, &i, &d_key, &d_value)) {
210 if (PyObject_SetAttr(self, d_key, d_value) < 0)
211 return NULL;
212 }
213 }
214 Py_RETURN_NONE;
215}
Richard Jones7b9558d2006-05-27 12:29:24 +0000216
Richard Jones7b9558d2006-05-27 12:29:24 +0000217
218static PyMethodDef BaseException_methods[] = {
219 {"__reduce__", (PyCFunction)BaseException_reduce, METH_NOARGS },
Georg Brandl85ac8502006-06-01 06:39:19 +0000220 {"__setstate__", (PyCFunction)BaseException_setstate, METH_O },
Nick Coghlan524b7772008-07-08 14:08:04 +0000221#ifdef Py_USING_UNICODE
222 {"__unicode__", (PyCFunction)BaseException_unicode, METH_NOARGS },
223#endif
Richard Jones7b9558d2006-05-27 12:29:24 +0000224 {NULL, NULL, 0, NULL},
225};
226
227
228
229static PyObject *
230BaseException_getitem(PyBaseExceptionObject *self, Py_ssize_t index)
231{
Benjamin Peterson9f4f4812008-04-27 03:01:45 +0000232 if (PyErr_WarnPy3k("__getitem__ not supported for exception "
233 "classes in 3.x; use args attribute", 1) < 0)
234 return NULL;
Richard Jones7b9558d2006-05-27 12:29:24 +0000235 return PySequence_GetItem(self->args, index);
236}
237
Brett Cannonf6aa86e2006-09-20 18:43:13 +0000238static PyObject *
239BaseException_getslice(PyBaseExceptionObject *self,
240 Py_ssize_t start, Py_ssize_t stop)
241{
Benjamin Peterson9f4f4812008-04-27 03:01:45 +0000242 if (PyErr_WarnPy3k("__getslice__ not supported for exception "
243 "classes in 3.x; use args attribute", 1) < 0)
244 return NULL;
Brett Cannonf6aa86e2006-09-20 18:43:13 +0000245 return PySequence_GetSlice(self->args, start, stop);
246}
247
Richard Jones7b9558d2006-05-27 12:29:24 +0000248static PySequenceMethods BaseException_as_sequence = {
249 0, /* sq_length; */
250 0, /* sq_concat; */
251 0, /* sq_repeat; */
252 (ssizeargfunc)BaseException_getitem, /* sq_item; */
Brett Cannonf6aa86e2006-09-20 18:43:13 +0000253 (ssizessizeargfunc)BaseException_getslice, /* sq_slice; */
Richard Jones7b9558d2006-05-27 12:29:24 +0000254 0, /* sq_ass_item; */
255 0, /* sq_ass_slice; */
256 0, /* sq_contains; */
257 0, /* sq_inplace_concat; */
258 0 /* sq_inplace_repeat; */
259};
260
Richard Jones7b9558d2006-05-27 12:29:24 +0000261static PyObject *
262BaseException_get_dict(PyBaseExceptionObject *self)
263{
264 if (self->dict == NULL) {
265 self->dict = PyDict_New();
266 if (!self->dict)
267 return NULL;
268 }
269 Py_INCREF(self->dict);
270 return self->dict;
271}
272
273static int
274BaseException_set_dict(PyBaseExceptionObject *self, PyObject *val)
275{
276 if (val == NULL) {
277 PyErr_SetString(PyExc_TypeError, "__dict__ may not be deleted");
278 return -1;
279 }
280 if (!PyDict_Check(val)) {
281 PyErr_SetString(PyExc_TypeError, "__dict__ must be a dictionary");
282 return -1;
283 }
284 Py_CLEAR(self->dict);
285 Py_INCREF(val);
286 self->dict = val;
287 return 0;
288}
289
290static PyObject *
291BaseException_get_args(PyBaseExceptionObject *self)
292{
293 if (self->args == NULL) {
294 Py_INCREF(Py_None);
295 return Py_None;
296 }
297 Py_INCREF(self->args);
298 return self->args;
299}
300
301static int
302BaseException_set_args(PyBaseExceptionObject *self, PyObject *val)
303{
304 PyObject *seq;
305 if (val == NULL) {
306 PyErr_SetString(PyExc_TypeError, "args may not be deleted");
307 return -1;
308 }
309 seq = PySequence_Tuple(val);
310 if (!seq) return -1;
Georg Brandlc7c51142006-05-29 09:46:51 +0000311 Py_CLEAR(self->args);
Richard Jones7b9558d2006-05-27 12:29:24 +0000312 self->args = seq;
313 return 0;
314}
315
Brett Cannon229cee22007-05-05 01:34:02 +0000316static PyObject *
317BaseException_get_message(PyBaseExceptionObject *self)
318{
Georg Brandl89971032009-09-16 20:34:51 +0000319 PyObject *msg;
320
321 /* if "message" is in self->dict, accessing a user-set message attribute */
322 if (self->dict &&
323 (msg = PyDict_GetItemString(self->dict, "message"))) {
324 Py_INCREF(msg);
325 return msg;
326 }
Brett Cannon229cee22007-05-05 01:34:02 +0000327
Georg Brandl89971032009-09-16 20:34:51 +0000328 if (self->message == NULL) {
329 PyErr_SetString(PyExc_AttributeError, "message attribute was deleted");
330 return NULL;
331 }
332
333 /* accessing the deprecated "builtin" message attribute of Exception */
334 if (PyErr_WarnEx(PyExc_DeprecationWarning,
335 "BaseException.message has been deprecated as "
336 "of Python 2.6", 1) < 0)
337 return NULL;
338
339 Py_INCREF(self->message);
340 return self->message;
Brett Cannon229cee22007-05-05 01:34:02 +0000341}
342
343static int
344BaseException_set_message(PyBaseExceptionObject *self, PyObject *val)
345{
Georg Brandl89971032009-09-16 20:34:51 +0000346 /* if val is NULL, delete the message attribute */
347 if (val == NULL) {
348 if (self->dict && PyDict_GetItemString(self->dict, "message")) {
349 if (PyDict_DelItemString(self->dict, "message") < 0)
350 return -1;
351 }
352 Py_XDECREF(self->message);
353 self->message = NULL;
354 return 0;
355 }
356
357 /* else set it in __dict__, but may need to create the dict first */
358 if (self->dict == NULL) {
359 self->dict = PyDict_New();
360 if (!self->dict)
361 return -1;
362 }
363 return PyDict_SetItemString(self->dict, "message", val);
Brett Cannon229cee22007-05-05 01:34:02 +0000364}
365
Richard Jones7b9558d2006-05-27 12:29:24 +0000366static PyGetSetDef BaseException_getset[] = {
367 {"__dict__", (getter)BaseException_get_dict, (setter)BaseException_set_dict},
368 {"args", (getter)BaseException_get_args, (setter)BaseException_set_args},
Brett Cannon229cee22007-05-05 01:34:02 +0000369 {"message", (getter)BaseException_get_message,
370 (setter)BaseException_set_message},
Richard Jones7b9558d2006-05-27 12:29:24 +0000371 {NULL},
372};
373
374
375static PyTypeObject _PyExc_BaseException = {
376 PyObject_HEAD_INIT(NULL)
377 0, /*ob_size*/
378 EXC_MODULE_NAME "BaseException", /*tp_name*/
379 sizeof(PyBaseExceptionObject), /*tp_basicsize*/
380 0, /*tp_itemsize*/
381 (destructor)BaseException_dealloc, /*tp_dealloc*/
382 0, /*tp_print*/
383 0, /*tp_getattr*/
384 0, /*tp_setattr*/
385 0, /* tp_compare; */
386 (reprfunc)BaseException_repr, /*tp_repr*/
387 0, /*tp_as_number*/
388 &BaseException_as_sequence, /*tp_as_sequence*/
389 0, /*tp_as_mapping*/
390 0, /*tp_hash */
391 0, /*tp_call*/
392 (reprfunc)BaseException_str, /*tp_str*/
393 PyObject_GenericGetAttr, /*tp_getattro*/
394 PyObject_GenericSetAttr, /*tp_setattro*/
395 0, /*tp_as_buffer*/
Neal Norwitzee3a1b52007-02-25 19:44:48 +0000396 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC |
397 Py_TPFLAGS_BASE_EXC_SUBCLASS, /*tp_flags*/
Richard Jones7b9558d2006-05-27 12:29:24 +0000398 PyDoc_STR("Common base class for all exceptions"), /* tp_doc */
399 (traverseproc)BaseException_traverse, /* tp_traverse */
400 (inquiry)BaseException_clear, /* tp_clear */
401 0, /* tp_richcompare */
402 0, /* tp_weaklistoffset */
403 0, /* tp_iter */
404 0, /* tp_iternext */
405 BaseException_methods, /* tp_methods */
Brett Cannon229cee22007-05-05 01:34:02 +0000406 0, /* tp_members */
Richard Jones7b9558d2006-05-27 12:29:24 +0000407 BaseException_getset, /* tp_getset */
408 0, /* tp_base */
409 0, /* tp_dict */
410 0, /* tp_descr_get */
411 0, /* tp_descr_set */
412 offsetof(PyBaseExceptionObject, dict), /* tp_dictoffset */
413 (initproc)BaseException_init, /* tp_init */
414 0, /* tp_alloc */
415 BaseException_new, /* tp_new */
416};
417/* the CPython API expects exceptions to be (PyObject *) - both a hold-over
418from the previous implmentation and also allowing Python objects to be used
419in the API */
420PyObject *PyExc_BaseException = (PyObject *)&_PyExc_BaseException;
421
Richard Jones2d555b32006-05-27 16:15:11 +0000422/* note these macros omit the last semicolon so the macro invocation may
423 * include it and not look strange.
424 */
Richard Jones7b9558d2006-05-27 12:29:24 +0000425#define SimpleExtendsException(EXCBASE, EXCNAME, EXCDOC) \
426static PyTypeObject _PyExc_ ## EXCNAME = { \
427 PyObject_HEAD_INIT(NULL) \
428 0, \
429 EXC_MODULE_NAME # EXCNAME, \
430 sizeof(PyBaseExceptionObject), \
431 0, (destructor)BaseException_dealloc, 0, 0, 0, 0, 0, 0, 0, \
432 0, 0, 0, 0, 0, 0, 0, \
433 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
434 PyDoc_STR(EXCDOC), (traverseproc)BaseException_traverse, \
435 (inquiry)BaseException_clear, 0, 0, 0, 0, 0, 0, 0, &_ ## EXCBASE, \
436 0, 0, 0, offsetof(PyBaseExceptionObject, dict), \
437 (initproc)BaseException_init, 0, BaseException_new,\
438}; \
Richard Jones2d555b32006-05-27 16:15:11 +0000439PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
Richard Jones7b9558d2006-05-27 12:29:24 +0000440
441#define MiddlingExtendsException(EXCBASE, EXCNAME, EXCSTORE, EXCDOC) \
442static PyTypeObject _PyExc_ ## EXCNAME = { \
443 PyObject_HEAD_INIT(NULL) \
444 0, \
445 EXC_MODULE_NAME # EXCNAME, \
446 sizeof(Py ## EXCSTORE ## Object), \
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000447 0, (destructor)EXCSTORE ## _dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
Richard Jones7b9558d2006-05-27 12:29:24 +0000448 0, 0, 0, 0, 0, \
449 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000450 PyDoc_STR(EXCDOC), (traverseproc)EXCSTORE ## _traverse, \
451 (inquiry)EXCSTORE ## _clear, 0, 0, 0, 0, 0, 0, 0, &_ ## EXCBASE, \
Richard Jones7b9558d2006-05-27 12:29:24 +0000452 0, 0, 0, offsetof(Py ## EXCSTORE ## Object, dict), \
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000453 (initproc)EXCSTORE ## _init, 0, BaseException_new,\
Richard Jones7b9558d2006-05-27 12:29:24 +0000454}; \
Richard Jones2d555b32006-05-27 16:15:11 +0000455PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
Richard Jones7b9558d2006-05-27 12:29:24 +0000456
457#define ComplexExtendsException(EXCBASE, EXCNAME, EXCSTORE, EXCDEALLOC, EXCMETHODS, EXCMEMBERS, EXCSTR, EXCDOC) \
458static PyTypeObject _PyExc_ ## EXCNAME = { \
459 PyObject_HEAD_INIT(NULL) \
460 0, \
461 EXC_MODULE_NAME # EXCNAME, \
462 sizeof(Py ## EXCSTORE ## Object), 0, \
463 (destructor)EXCSTORE ## _dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
464 (reprfunc)EXCSTR, 0, 0, 0, \
465 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
466 PyDoc_STR(EXCDOC), (traverseproc)EXCSTORE ## _traverse, \
467 (inquiry)EXCSTORE ## _clear, 0, 0, 0, 0, EXCMETHODS, \
468 EXCMEMBERS, 0, &_ ## EXCBASE, \
469 0, 0, 0, offsetof(Py ## EXCSTORE ## Object, dict), \
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000470 (initproc)EXCSTORE ## _init, 0, BaseException_new,\
Richard Jones7b9558d2006-05-27 12:29:24 +0000471}; \
Richard Jones2d555b32006-05-27 16:15:11 +0000472PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
Richard Jones7b9558d2006-05-27 12:29:24 +0000473
474
475/*
476 * Exception extends BaseException
477 */
478SimpleExtendsException(PyExc_BaseException, Exception,
Richard Jones2d555b32006-05-27 16:15:11 +0000479 "Common base class for all non-exit exceptions.");
Richard Jones7b9558d2006-05-27 12:29:24 +0000480
481
482/*
483 * StandardError extends Exception
484 */
Michael W. Hudson22a80e72006-05-28 15:51:40 +0000485SimpleExtendsException(PyExc_Exception, StandardError,
Richard Jones7b9558d2006-05-27 12:29:24 +0000486 "Base class for all standard Python exceptions that do not represent\n"
Richard Jones2d555b32006-05-27 16:15:11 +0000487 "interpreter exiting.");
Richard Jones7b9558d2006-05-27 12:29:24 +0000488
489
490/*
491 * TypeError extends StandardError
492 */
493SimpleExtendsException(PyExc_StandardError, TypeError,
Richard Jones2d555b32006-05-27 16:15:11 +0000494 "Inappropriate argument type.");
Richard Jones7b9558d2006-05-27 12:29:24 +0000495
496
497/*
498 * StopIteration extends Exception
499 */
500SimpleExtendsException(PyExc_Exception, StopIteration,
Richard Jones2d555b32006-05-27 16:15:11 +0000501 "Signal the end from iterator.next().");
Richard Jones7b9558d2006-05-27 12:29:24 +0000502
503
504/*
Christian Heimes44eeaec2007-12-03 20:01:02 +0000505 * GeneratorExit extends BaseException
Richard Jones7b9558d2006-05-27 12:29:24 +0000506 */
Christian Heimes44eeaec2007-12-03 20:01:02 +0000507SimpleExtendsException(PyExc_BaseException, GeneratorExit,
Richard Jones2d555b32006-05-27 16:15:11 +0000508 "Request that a generator exit.");
Richard Jones7b9558d2006-05-27 12:29:24 +0000509
510
511/*
512 * SystemExit extends BaseException
513 */
Richard Jones7b9558d2006-05-27 12:29:24 +0000514
515static int
516SystemExit_init(PySystemExitObject *self, PyObject *args, PyObject *kwds)
517{
518 Py_ssize_t size = PyTuple_GET_SIZE(args);
519
520 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
521 return -1;
522
Michael W. Hudson22a80e72006-05-28 15:51:40 +0000523 if (size == 0)
524 return 0;
525 Py_CLEAR(self->code);
Richard Jones7b9558d2006-05-27 12:29:24 +0000526 if (size == 1)
527 self->code = PyTuple_GET_ITEM(args, 0);
528 else if (size > 1)
529 self->code = args;
530 Py_INCREF(self->code);
531 return 0;
532}
533
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000534static int
Richard Jones7b9558d2006-05-27 12:29:24 +0000535SystemExit_clear(PySystemExitObject *self)
536{
537 Py_CLEAR(self->code);
538 return BaseException_clear((PyBaseExceptionObject *)self);
539}
540
541static void
542SystemExit_dealloc(PySystemExitObject *self)
543{
Georg Brandl38f62372006-09-06 06:50:05 +0000544 _PyObject_GC_UNTRACK(self);
Richard Jones7b9558d2006-05-27 12:29:24 +0000545 SystemExit_clear(self);
Christian Heimese93237d2007-12-19 02:37:44 +0000546 Py_TYPE(self)->tp_free((PyObject *)self);
Richard Jones7b9558d2006-05-27 12:29:24 +0000547}
548
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000549static int
Richard Jones7b9558d2006-05-27 12:29:24 +0000550SystemExit_traverse(PySystemExitObject *self, visitproc visit, void *arg)
551{
552 Py_VISIT(self->code);
553 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
554}
555
556static PyMemberDef SystemExit_members[] = {
Richard Jones7b9558d2006-05-27 12:29:24 +0000557 {"code", T_OBJECT, offsetof(PySystemExitObject, code), 0,
558 PyDoc_STR("exception code")},
559 {NULL} /* Sentinel */
560};
561
562ComplexExtendsException(PyExc_BaseException, SystemExit, SystemExit,
563 SystemExit_dealloc, 0, SystemExit_members, 0,
Richard Jones2d555b32006-05-27 16:15:11 +0000564 "Request to exit from the interpreter.");
Richard Jones7b9558d2006-05-27 12:29:24 +0000565
566/*
567 * KeyboardInterrupt extends BaseException
568 */
569SimpleExtendsException(PyExc_BaseException, KeyboardInterrupt,
Richard Jones2d555b32006-05-27 16:15:11 +0000570 "Program interrupted by user.");
Richard Jones7b9558d2006-05-27 12:29:24 +0000571
572
573/*
574 * ImportError extends StandardError
575 */
576SimpleExtendsException(PyExc_StandardError, ImportError,
Richard Jones2d555b32006-05-27 16:15:11 +0000577 "Import can't find module, or can't find name in module.");
Richard Jones7b9558d2006-05-27 12:29:24 +0000578
579
580/*
581 * EnvironmentError extends StandardError
582 */
583
Richard Jones7b9558d2006-05-27 12:29:24 +0000584/* Where a function has a single filename, such as open() or some
585 * of the os module functions, PyErr_SetFromErrnoWithFilename() is
586 * called, giving a third argument which is the filename. But, so
587 * that old code using in-place unpacking doesn't break, e.g.:
588 *
589 * except IOError, (errno, strerror):
590 *
591 * we hack args so that it only contains two items. This also
592 * means we need our own __str__() which prints out the filename
593 * when it was supplied.
594 */
595static int
596EnvironmentError_init(PyEnvironmentErrorObject *self, PyObject *args,
597 PyObject *kwds)
598{
599 PyObject *myerrno = NULL, *strerror = NULL, *filename = NULL;
600 PyObject *subslice = NULL;
601
602 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
603 return -1;
604
Georg Brandl3267d282006-09-30 09:03:42 +0000605 if (PyTuple_GET_SIZE(args) <= 1 || PyTuple_GET_SIZE(args) > 3) {
Richard Jones7b9558d2006-05-27 12:29:24 +0000606 return 0;
607 }
Michael W. Hudson22a80e72006-05-28 15:51:40 +0000608
609 if (!PyArg_UnpackTuple(args, "EnvironmentError", 2, 3,
Richard Jones7b9558d2006-05-27 12:29:24 +0000610 &myerrno, &strerror, &filename)) {
611 return -1;
612 }
Michael W. Hudson22a80e72006-05-28 15:51:40 +0000613 Py_CLEAR(self->myerrno); /* replacing */
Richard Jones7b9558d2006-05-27 12:29:24 +0000614 self->myerrno = myerrno;
615 Py_INCREF(self->myerrno);
616
Michael W. Hudson22a80e72006-05-28 15:51:40 +0000617 Py_CLEAR(self->strerror); /* replacing */
Richard Jones7b9558d2006-05-27 12:29:24 +0000618 self->strerror = strerror;
619 Py_INCREF(self->strerror);
620
621 /* self->filename will remain Py_None otherwise */
622 if (filename != NULL) {
Michael W. Hudson22a80e72006-05-28 15:51:40 +0000623 Py_CLEAR(self->filename); /* replacing */
Richard Jones7b9558d2006-05-27 12:29:24 +0000624 self->filename = filename;
625 Py_INCREF(self->filename);
626
627 subslice = PyTuple_GetSlice(args, 0, 2);
628 if (!subslice)
629 return -1;
630
631 Py_DECREF(self->args); /* replacing args */
632 self->args = subslice;
633 }
634 return 0;
635}
636
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000637static int
Richard Jones7b9558d2006-05-27 12:29:24 +0000638EnvironmentError_clear(PyEnvironmentErrorObject *self)
639{
640 Py_CLEAR(self->myerrno);
641 Py_CLEAR(self->strerror);
642 Py_CLEAR(self->filename);
643 return BaseException_clear((PyBaseExceptionObject *)self);
644}
645
646static void
647EnvironmentError_dealloc(PyEnvironmentErrorObject *self)
648{
Georg Brandl38f62372006-09-06 06:50:05 +0000649 _PyObject_GC_UNTRACK(self);
Richard Jones7b9558d2006-05-27 12:29:24 +0000650 EnvironmentError_clear(self);
Christian Heimese93237d2007-12-19 02:37:44 +0000651 Py_TYPE(self)->tp_free((PyObject *)self);
Richard Jones7b9558d2006-05-27 12:29:24 +0000652}
653
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000654static int
Richard Jones7b9558d2006-05-27 12:29:24 +0000655EnvironmentError_traverse(PyEnvironmentErrorObject *self, visitproc visit,
656 void *arg)
657{
658 Py_VISIT(self->myerrno);
659 Py_VISIT(self->strerror);
660 Py_VISIT(self->filename);
661 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
662}
663
664static PyObject *
665EnvironmentError_str(PyEnvironmentErrorObject *self)
666{
667 PyObject *rtnval = NULL;
668
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000669 if (self->filename) {
670 PyObject *fmt;
671 PyObject *repr;
672 PyObject *tuple;
Richard Jones7b9558d2006-05-27 12:29:24 +0000673
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000674 fmt = PyString_FromString("[Errno %s] %s: %s");
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000675 if (!fmt)
676 return NULL;
677
678 repr = PyObject_Repr(self->filename);
679 if (!repr) {
680 Py_DECREF(fmt);
Richard Jones7b9558d2006-05-27 12:29:24 +0000681 return NULL;
682 }
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000683 tuple = PyTuple_New(3);
684 if (!tuple) {
685 Py_DECREF(repr);
686 Py_DECREF(fmt);
687 return NULL;
688 }
689
690 if (self->myerrno) {
691 Py_INCREF(self->myerrno);
692 PyTuple_SET_ITEM(tuple, 0, self->myerrno);
693 }
694 else {
695 Py_INCREF(Py_None);
696 PyTuple_SET_ITEM(tuple, 0, Py_None);
697 }
698 if (self->strerror) {
699 Py_INCREF(self->strerror);
700 PyTuple_SET_ITEM(tuple, 1, self->strerror);
701 }
702 else {
703 Py_INCREF(Py_None);
704 PyTuple_SET_ITEM(tuple, 1, Py_None);
705 }
706
Richard Jones7b9558d2006-05-27 12:29:24 +0000707 PyTuple_SET_ITEM(tuple, 2, repr);
708
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000709 rtnval = PyString_Format(fmt, tuple);
Richard Jones7b9558d2006-05-27 12:29:24 +0000710
711 Py_DECREF(fmt);
712 Py_DECREF(tuple);
713 }
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000714 else if (self->myerrno && self->strerror) {
715 PyObject *fmt;
716 PyObject *tuple;
Richard Jones7b9558d2006-05-27 12:29:24 +0000717
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000718 fmt = PyString_FromString("[Errno %s] %s");
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000719 if (!fmt)
720 return NULL;
721
722 tuple = PyTuple_New(2);
723 if (!tuple) {
724 Py_DECREF(fmt);
Richard Jones7b9558d2006-05-27 12:29:24 +0000725 return NULL;
726 }
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000727
728 if (self->myerrno) {
729 Py_INCREF(self->myerrno);
730 PyTuple_SET_ITEM(tuple, 0, self->myerrno);
731 }
732 else {
733 Py_INCREF(Py_None);
734 PyTuple_SET_ITEM(tuple, 0, Py_None);
735 }
736 if (self->strerror) {
737 Py_INCREF(self->strerror);
738 PyTuple_SET_ITEM(tuple, 1, self->strerror);
739 }
740 else {
741 Py_INCREF(Py_None);
742 PyTuple_SET_ITEM(tuple, 1, Py_None);
743 }
Richard Jones7b9558d2006-05-27 12:29:24 +0000744
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000745 rtnval = PyString_Format(fmt, tuple);
Richard Jones7b9558d2006-05-27 12:29:24 +0000746
747 Py_DECREF(fmt);
748 Py_DECREF(tuple);
749 }
750 else
751 rtnval = BaseException_str((PyBaseExceptionObject *)self);
752
753 return rtnval;
754}
755
756static PyMemberDef EnvironmentError_members[] = {
Richard Jones7b9558d2006-05-27 12:29:24 +0000757 {"errno", T_OBJECT, offsetof(PyEnvironmentErrorObject, myerrno), 0,
Richard Jonesc5b2a2e2006-05-27 16:07:28 +0000758 PyDoc_STR("exception errno")},
Richard Jones7b9558d2006-05-27 12:29:24 +0000759 {"strerror", T_OBJECT, offsetof(PyEnvironmentErrorObject, strerror), 0,
Richard Jonesc5b2a2e2006-05-27 16:07:28 +0000760 PyDoc_STR("exception strerror")},
Richard Jones7b9558d2006-05-27 12:29:24 +0000761 {"filename", T_OBJECT, offsetof(PyEnvironmentErrorObject, filename), 0,
Richard Jonesc5b2a2e2006-05-27 16:07:28 +0000762 PyDoc_STR("exception filename")},
Richard Jones7b9558d2006-05-27 12:29:24 +0000763 {NULL} /* Sentinel */
764};
765
766
767static PyObject *
768EnvironmentError_reduce(PyEnvironmentErrorObject *self)
769{
770 PyObject *args = self->args;
771 PyObject *res = NULL, *tmp;
Georg Brandl05f97bf2006-05-30 07:13:29 +0000772
Richard Jones7b9558d2006-05-27 12:29:24 +0000773 /* self->args is only the first two real arguments if there was a
774 * file name given to EnvironmentError. */
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000775 if (PyTuple_GET_SIZE(args) == 2 && self->filename) {
Richard Jones7b9558d2006-05-27 12:29:24 +0000776 args = PyTuple_New(3);
777 if (!args) return NULL;
Michael W. Hudson22a80e72006-05-28 15:51:40 +0000778
779 tmp = PyTuple_GET_ITEM(self->args, 0);
Richard Jones7b9558d2006-05-27 12:29:24 +0000780 Py_INCREF(tmp);
781 PyTuple_SET_ITEM(args, 0, tmp);
Michael W. Hudson22a80e72006-05-28 15:51:40 +0000782
783 tmp = PyTuple_GET_ITEM(self->args, 1);
Richard Jones7b9558d2006-05-27 12:29:24 +0000784 Py_INCREF(tmp);
785 PyTuple_SET_ITEM(args, 1, tmp);
786
787 Py_INCREF(self->filename);
788 PyTuple_SET_ITEM(args, 2, self->filename);
Georg Brandl05f97bf2006-05-30 07:13:29 +0000789 } else
Richard Jones7b9558d2006-05-27 12:29:24 +0000790 Py_INCREF(args);
Georg Brandl05f97bf2006-05-30 07:13:29 +0000791
792 if (self->dict)
Christian Heimese93237d2007-12-19 02:37:44 +0000793 res = PyTuple_Pack(3, Py_TYPE(self), args, self->dict);
Georg Brandl05f97bf2006-05-30 07:13:29 +0000794 else
Christian Heimese93237d2007-12-19 02:37:44 +0000795 res = PyTuple_Pack(2, Py_TYPE(self), args);
Richard Jones7b9558d2006-05-27 12:29:24 +0000796 Py_DECREF(args);
797 return res;
798}
799
800
801static PyMethodDef EnvironmentError_methods[] = {
802 {"__reduce__", (PyCFunction)EnvironmentError_reduce, METH_NOARGS},
803 {NULL}
804};
805
806ComplexExtendsException(PyExc_StandardError, EnvironmentError,
807 EnvironmentError, EnvironmentError_dealloc,
808 EnvironmentError_methods, EnvironmentError_members,
Michael W. Hudson22a80e72006-05-28 15:51:40 +0000809 EnvironmentError_str,
Richard Jones2d555b32006-05-27 16:15:11 +0000810 "Base class for I/O related errors.");
Richard Jones7b9558d2006-05-27 12:29:24 +0000811
812
813/*
814 * IOError extends EnvironmentError
815 */
Michael W. Hudson22a80e72006-05-28 15:51:40 +0000816MiddlingExtendsException(PyExc_EnvironmentError, IOError,
Richard Jones2d555b32006-05-27 16:15:11 +0000817 EnvironmentError, "I/O operation failed.");
Richard Jones7b9558d2006-05-27 12:29:24 +0000818
819
820/*
821 * OSError extends EnvironmentError
822 */
823MiddlingExtendsException(PyExc_EnvironmentError, OSError,
Richard Jones2d555b32006-05-27 16:15:11 +0000824 EnvironmentError, "OS system call failed.");
Richard Jones7b9558d2006-05-27 12:29:24 +0000825
826
827/*
828 * WindowsError extends OSError
829 */
830#ifdef MS_WINDOWS
831#include "errmap.h"
832
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000833static int
Richard Jones7b9558d2006-05-27 12:29:24 +0000834WindowsError_clear(PyWindowsErrorObject *self)
835{
836 Py_CLEAR(self->myerrno);
837 Py_CLEAR(self->strerror);
838 Py_CLEAR(self->filename);
839 Py_CLEAR(self->winerror);
840 return BaseException_clear((PyBaseExceptionObject *)self);
841}
842
843static void
844WindowsError_dealloc(PyWindowsErrorObject *self)
845{
Georg Brandl38f62372006-09-06 06:50:05 +0000846 _PyObject_GC_UNTRACK(self);
Richard Jones7b9558d2006-05-27 12:29:24 +0000847 WindowsError_clear(self);
Christian Heimese93237d2007-12-19 02:37:44 +0000848 Py_TYPE(self)->tp_free((PyObject *)self);
Richard Jones7b9558d2006-05-27 12:29:24 +0000849}
850
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000851static int
Richard Jones7b9558d2006-05-27 12:29:24 +0000852WindowsError_traverse(PyWindowsErrorObject *self, visitproc visit, void *arg)
853{
854 Py_VISIT(self->myerrno);
855 Py_VISIT(self->strerror);
856 Py_VISIT(self->filename);
857 Py_VISIT(self->winerror);
858 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
859}
860
Richard Jones7b9558d2006-05-27 12:29:24 +0000861static int
862WindowsError_init(PyWindowsErrorObject *self, PyObject *args, PyObject *kwds)
863{
864 PyObject *o_errcode = NULL;
865 long errcode;
866 long posix_errno;
867
868 if (EnvironmentError_init((PyEnvironmentErrorObject *)self, args, kwds)
869 == -1)
870 return -1;
871
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000872 if (self->myerrno == NULL)
Richard Jones7b9558d2006-05-27 12:29:24 +0000873 return 0;
Richard Jones7b9558d2006-05-27 12:29:24 +0000874
875 /* Set errno to the POSIX errno, and winerror to the Win32
876 error code. */
877 errcode = PyInt_AsLong(self->myerrno);
878 if (errcode == -1 && PyErr_Occurred())
879 return -1;
880 posix_errno = winerror_to_errno(errcode);
881
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000882 Py_CLEAR(self->winerror);
Richard Jones7b9558d2006-05-27 12:29:24 +0000883 self->winerror = self->myerrno;
884
885 o_errcode = PyInt_FromLong(posix_errno);
886 if (!o_errcode)
887 return -1;
888
889 self->myerrno = o_errcode;
890
891 return 0;
892}
893
894
895static PyObject *
896WindowsError_str(PyWindowsErrorObject *self)
897{
Richard Jones7b9558d2006-05-27 12:29:24 +0000898 PyObject *rtnval = NULL;
899
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000900 if (self->filename) {
901 PyObject *fmt;
902 PyObject *repr;
903 PyObject *tuple;
Richard Jones7b9558d2006-05-27 12:29:24 +0000904
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000905 fmt = PyString_FromString("[Error %s] %s: %s");
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000906 if (!fmt)
907 return NULL;
908
909 repr = PyObject_Repr(self->filename);
910 if (!repr) {
911 Py_DECREF(fmt);
912 return NULL;
913 }
914 tuple = PyTuple_New(3);
915 if (!tuple) {
916 Py_DECREF(repr);
917 Py_DECREF(fmt);
918 return NULL;
919 }
920
Thomas Hellerdf08f0b2006-10-27 18:31:36 +0000921 if (self->winerror) {
922 Py_INCREF(self->winerror);
923 PyTuple_SET_ITEM(tuple, 0, self->winerror);
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000924 }
925 else {
926 Py_INCREF(Py_None);
927 PyTuple_SET_ITEM(tuple, 0, Py_None);
928 }
929 if (self->strerror) {
930 Py_INCREF(self->strerror);
931 PyTuple_SET_ITEM(tuple, 1, self->strerror);
932 }
933 else {
934 Py_INCREF(Py_None);
935 PyTuple_SET_ITEM(tuple, 1, Py_None);
936 }
937
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000938 PyTuple_SET_ITEM(tuple, 2, repr);
Richard Jones7b9558d2006-05-27 12:29:24 +0000939
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000940 rtnval = PyString_Format(fmt, tuple);
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000941
942 Py_DECREF(fmt);
Richard Jones7b9558d2006-05-27 12:29:24 +0000943 Py_DECREF(tuple);
944 }
Thomas Hellerdf08f0b2006-10-27 18:31:36 +0000945 else if (self->winerror && self->strerror) {
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000946 PyObject *fmt;
947 PyObject *tuple;
948
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000949 fmt = PyString_FromString("[Error %s] %s");
Richard Jones7b9558d2006-05-27 12:29:24 +0000950 if (!fmt)
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000951 return NULL;
Richard Jones7b9558d2006-05-27 12:29:24 +0000952
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000953 tuple = PyTuple_New(2);
954 if (!tuple) {
955 Py_DECREF(fmt);
956 return NULL;
957 }
958
Thomas Hellerdf08f0b2006-10-27 18:31:36 +0000959 if (self->winerror) {
960 Py_INCREF(self->winerror);
961 PyTuple_SET_ITEM(tuple, 0, self->winerror);
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000962 }
963 else {
964 Py_INCREF(Py_None);
965 PyTuple_SET_ITEM(tuple, 0, Py_None);
966 }
967 if (self->strerror) {
968 Py_INCREF(self->strerror);
969 PyTuple_SET_ITEM(tuple, 1, self->strerror);
970 }
971 else {
972 Py_INCREF(Py_None);
973 PyTuple_SET_ITEM(tuple, 1, Py_None);
974 }
Richard Jones7b9558d2006-05-27 12:29:24 +0000975
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000976 rtnval = PyString_Format(fmt, tuple);
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000977
978 Py_DECREF(fmt);
Richard Jones7b9558d2006-05-27 12:29:24 +0000979 Py_DECREF(tuple);
980 }
981 else
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000982 rtnval = EnvironmentError_str((PyEnvironmentErrorObject *)self);
Richard Jones7b9558d2006-05-27 12:29:24 +0000983
Richard Jones7b9558d2006-05-27 12:29:24 +0000984 return rtnval;
985}
986
987static PyMemberDef WindowsError_members[] = {
Richard Jones7b9558d2006-05-27 12:29:24 +0000988 {"errno", T_OBJECT, offsetof(PyWindowsErrorObject, myerrno), 0,
Richard Jonesc5b2a2e2006-05-27 16:07:28 +0000989 PyDoc_STR("POSIX exception code")},
Richard Jones7b9558d2006-05-27 12:29:24 +0000990 {"strerror", T_OBJECT, offsetof(PyWindowsErrorObject, strerror), 0,
Richard Jonesc5b2a2e2006-05-27 16:07:28 +0000991 PyDoc_STR("exception strerror")},
Richard Jones7b9558d2006-05-27 12:29:24 +0000992 {"filename", T_OBJECT, offsetof(PyWindowsErrorObject, filename), 0,
Richard Jonesc5b2a2e2006-05-27 16:07:28 +0000993 PyDoc_STR("exception filename")},
Richard Jones7b9558d2006-05-27 12:29:24 +0000994 {"winerror", T_OBJECT, offsetof(PyWindowsErrorObject, winerror), 0,
Richard Jonesc5b2a2e2006-05-27 16:07:28 +0000995 PyDoc_STR("Win32 exception code")},
Richard Jones7b9558d2006-05-27 12:29:24 +0000996 {NULL} /* Sentinel */
997};
998
Richard Jones2d555b32006-05-27 16:15:11 +0000999ComplexExtendsException(PyExc_OSError, WindowsError, WindowsError,
1000 WindowsError_dealloc, 0, WindowsError_members,
1001 WindowsError_str, "MS-Windows OS system call failed.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001002
1003#endif /* MS_WINDOWS */
1004
1005
1006/*
1007 * VMSError extends OSError (I think)
1008 */
1009#ifdef __VMS
1010MiddlingExtendsException(PyExc_OSError, VMSError, EnvironmentError,
Richard Jones2d555b32006-05-27 16:15:11 +00001011 "OpenVMS OS system call failed.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001012#endif
1013
1014
1015/*
1016 * EOFError extends StandardError
1017 */
1018SimpleExtendsException(PyExc_StandardError, EOFError,
Richard Jones2d555b32006-05-27 16:15:11 +00001019 "Read beyond end of file.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001020
1021
1022/*
1023 * RuntimeError extends StandardError
1024 */
1025SimpleExtendsException(PyExc_StandardError, RuntimeError,
Richard Jones2d555b32006-05-27 16:15:11 +00001026 "Unspecified run-time error.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001027
1028
1029/*
1030 * NotImplementedError extends RuntimeError
1031 */
1032SimpleExtendsException(PyExc_RuntimeError, NotImplementedError,
Richard Jones2d555b32006-05-27 16:15:11 +00001033 "Method or function hasn't been implemented yet.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001034
1035/*
1036 * NameError extends StandardError
1037 */
1038SimpleExtendsException(PyExc_StandardError, NameError,
Richard Jones2d555b32006-05-27 16:15:11 +00001039 "Name not found globally.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001040
1041/*
1042 * UnboundLocalError extends NameError
1043 */
1044SimpleExtendsException(PyExc_NameError, UnboundLocalError,
Richard Jones2d555b32006-05-27 16:15:11 +00001045 "Local name referenced but not bound to a value.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001046
1047/*
1048 * AttributeError extends StandardError
1049 */
1050SimpleExtendsException(PyExc_StandardError, AttributeError,
Richard Jones2d555b32006-05-27 16:15:11 +00001051 "Attribute not found.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001052
1053
1054/*
1055 * SyntaxError extends StandardError
1056 */
Richard Jones7b9558d2006-05-27 12:29:24 +00001057
1058static int
1059SyntaxError_init(PySyntaxErrorObject *self, PyObject *args, PyObject *kwds)
1060{
1061 PyObject *info = NULL;
1062 Py_ssize_t lenargs = PyTuple_GET_SIZE(args);
1063
1064 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1065 return -1;
1066
1067 if (lenargs >= 1) {
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001068 Py_CLEAR(self->msg);
Richard Jones7b9558d2006-05-27 12:29:24 +00001069 self->msg = PyTuple_GET_ITEM(args, 0);
1070 Py_INCREF(self->msg);
1071 }
1072 if (lenargs == 2) {
1073 info = PyTuple_GET_ITEM(args, 1);
1074 info = PySequence_Tuple(info);
1075 if (!info) return -1;
1076
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001077 if (PyTuple_GET_SIZE(info) != 4) {
1078 /* not a very good error message, but it's what Python 2.4 gives */
1079 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
1080 Py_DECREF(info);
1081 return -1;
1082 }
1083
1084 Py_CLEAR(self->filename);
Richard Jones7b9558d2006-05-27 12:29:24 +00001085 self->filename = PyTuple_GET_ITEM(info, 0);
1086 Py_INCREF(self->filename);
1087
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001088 Py_CLEAR(self->lineno);
Richard Jones7b9558d2006-05-27 12:29:24 +00001089 self->lineno = PyTuple_GET_ITEM(info, 1);
1090 Py_INCREF(self->lineno);
1091
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001092 Py_CLEAR(self->offset);
Richard Jones7b9558d2006-05-27 12:29:24 +00001093 self->offset = PyTuple_GET_ITEM(info, 2);
1094 Py_INCREF(self->offset);
1095
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001096 Py_CLEAR(self->text);
Richard Jones7b9558d2006-05-27 12:29:24 +00001097 self->text = PyTuple_GET_ITEM(info, 3);
1098 Py_INCREF(self->text);
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001099
1100 Py_DECREF(info);
Richard Jones7b9558d2006-05-27 12:29:24 +00001101 }
1102 return 0;
1103}
1104
Michael W. Hudson96495ee2006-05-28 17:40:29 +00001105static int
Richard Jones7b9558d2006-05-27 12:29:24 +00001106SyntaxError_clear(PySyntaxErrorObject *self)
1107{
1108 Py_CLEAR(self->msg);
1109 Py_CLEAR(self->filename);
1110 Py_CLEAR(self->lineno);
1111 Py_CLEAR(self->offset);
1112 Py_CLEAR(self->text);
1113 Py_CLEAR(self->print_file_and_line);
1114 return BaseException_clear((PyBaseExceptionObject *)self);
1115}
1116
1117static void
1118SyntaxError_dealloc(PySyntaxErrorObject *self)
1119{
Georg Brandl38f62372006-09-06 06:50:05 +00001120 _PyObject_GC_UNTRACK(self);
Richard Jones7b9558d2006-05-27 12:29:24 +00001121 SyntaxError_clear(self);
Christian Heimese93237d2007-12-19 02:37:44 +00001122 Py_TYPE(self)->tp_free((PyObject *)self);
Richard Jones7b9558d2006-05-27 12:29:24 +00001123}
1124
Michael W. Hudson96495ee2006-05-28 17:40:29 +00001125static int
Richard Jones7b9558d2006-05-27 12:29:24 +00001126SyntaxError_traverse(PySyntaxErrorObject *self, visitproc visit, void *arg)
1127{
1128 Py_VISIT(self->msg);
1129 Py_VISIT(self->filename);
1130 Py_VISIT(self->lineno);
1131 Py_VISIT(self->offset);
1132 Py_VISIT(self->text);
1133 Py_VISIT(self->print_file_and_line);
1134 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1135}
1136
1137/* This is called "my_basename" instead of just "basename" to avoid name
1138 conflicts with glibc; basename is already prototyped if _GNU_SOURCE is
1139 defined, and Python does define that. */
1140static char *
1141my_basename(char *name)
1142{
1143 char *cp = name;
1144 char *result = name;
1145
1146 if (name == NULL)
1147 return "???";
1148 while (*cp != '\0') {
1149 if (*cp == SEP)
1150 result = cp + 1;
1151 ++cp;
1152 }
1153 return result;
1154}
1155
1156
1157static PyObject *
1158SyntaxError_str(PySyntaxErrorObject *self)
1159{
1160 PyObject *str;
1161 PyObject *result;
Georg Brandl43ab1002006-05-28 20:57:09 +00001162 int have_filename = 0;
1163 int have_lineno = 0;
1164 char *buffer = NULL;
Thomas Woutersc1282ee2006-05-28 21:32:12 +00001165 Py_ssize_t bufsize;
Richard Jones7b9558d2006-05-27 12:29:24 +00001166
Michael W. Hudson96495ee2006-05-28 17:40:29 +00001167 if (self->msg)
1168 str = PyObject_Str(self->msg);
1169 else
1170 str = PyObject_Str(Py_None);
Georg Brandl43ab1002006-05-28 20:57:09 +00001171 if (!str) return NULL;
1172 /* Don't fiddle with non-string return (shouldn't happen anyway) */
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001173 if (!PyString_Check(str)) return str;
Richard Jones7b9558d2006-05-27 12:29:24 +00001174
1175 /* XXX -- do all the additional formatting with filename and
1176 lineno here */
1177
Georg Brandl43ab1002006-05-28 20:57:09 +00001178 have_filename = (self->filename != NULL) &&
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001179 PyString_Check(self->filename);
Georg Brandl43ab1002006-05-28 20:57:09 +00001180 have_lineno = (self->lineno != NULL) && PyInt_Check(self->lineno);
Richard Jones7b9558d2006-05-27 12:29:24 +00001181
Georg Brandl43ab1002006-05-28 20:57:09 +00001182 if (!have_filename && !have_lineno)
1183 return str;
Richard Jones7b9558d2006-05-27 12:29:24 +00001184
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001185 bufsize = PyString_GET_SIZE(str) + 64;
Georg Brandl43ab1002006-05-28 20:57:09 +00001186 if (have_filename)
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001187 bufsize += PyString_GET_SIZE(self->filename);
Richard Jones7b9558d2006-05-27 12:29:24 +00001188
Georg Brandl43ab1002006-05-28 20:57:09 +00001189 buffer = PyMem_MALLOC(bufsize);
1190 if (buffer == NULL)
1191 return str;
Richard Jones7b9558d2006-05-27 12:29:24 +00001192
Georg Brandl43ab1002006-05-28 20:57:09 +00001193 if (have_filename && have_lineno)
1194 PyOS_snprintf(buffer, bufsize, "%s (%s, line %ld)",
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001195 PyString_AS_STRING(str),
1196 my_basename(PyString_AS_STRING(self->filename)),
Georg Brandl43ab1002006-05-28 20:57:09 +00001197 PyInt_AsLong(self->lineno));
1198 else if (have_filename)
1199 PyOS_snprintf(buffer, bufsize, "%s (%s)",
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001200 PyString_AS_STRING(str),
1201 my_basename(PyString_AS_STRING(self->filename)));
Georg Brandl43ab1002006-05-28 20:57:09 +00001202 else /* only have_lineno */
1203 PyOS_snprintf(buffer, bufsize, "%s (line %ld)",
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001204 PyString_AS_STRING(str),
Georg Brandl43ab1002006-05-28 20:57:09 +00001205 PyInt_AsLong(self->lineno));
Richard Jones7b9558d2006-05-27 12:29:24 +00001206
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001207 result = PyString_FromString(buffer);
Georg Brandl43ab1002006-05-28 20:57:09 +00001208 PyMem_FREE(buffer);
1209
1210 if (result == NULL)
1211 result = str;
1212 else
1213 Py_DECREF(str);
Richard Jones7b9558d2006-05-27 12:29:24 +00001214 return result;
1215}
1216
1217static PyMemberDef SyntaxError_members[] = {
Richard Jones7b9558d2006-05-27 12:29:24 +00001218 {"msg", T_OBJECT, offsetof(PySyntaxErrorObject, msg), 0,
1219 PyDoc_STR("exception msg")},
1220 {"filename", T_OBJECT, offsetof(PySyntaxErrorObject, filename), 0,
1221 PyDoc_STR("exception filename")},
1222 {"lineno", T_OBJECT, offsetof(PySyntaxErrorObject, lineno), 0,
1223 PyDoc_STR("exception lineno")},
1224 {"offset", T_OBJECT, offsetof(PySyntaxErrorObject, offset), 0,
1225 PyDoc_STR("exception offset")},
1226 {"text", T_OBJECT, offsetof(PySyntaxErrorObject, text), 0,
1227 PyDoc_STR("exception text")},
1228 {"print_file_and_line", T_OBJECT,
1229 offsetof(PySyntaxErrorObject, print_file_and_line), 0,
1230 PyDoc_STR("exception print_file_and_line")},
1231 {NULL} /* Sentinel */
1232};
1233
1234ComplexExtendsException(PyExc_StandardError, SyntaxError, SyntaxError,
1235 SyntaxError_dealloc, 0, SyntaxError_members,
Richard Jones2d555b32006-05-27 16:15:11 +00001236 SyntaxError_str, "Invalid syntax.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001237
1238
1239/*
1240 * IndentationError extends SyntaxError
1241 */
1242MiddlingExtendsException(PyExc_SyntaxError, IndentationError, SyntaxError,
Richard Jones2d555b32006-05-27 16:15:11 +00001243 "Improper indentation.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001244
1245
1246/*
1247 * TabError extends IndentationError
1248 */
1249MiddlingExtendsException(PyExc_IndentationError, TabError, SyntaxError,
Richard Jones2d555b32006-05-27 16:15:11 +00001250 "Improper mixture of spaces and tabs.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001251
1252
1253/*
1254 * LookupError extends StandardError
1255 */
1256SimpleExtendsException(PyExc_StandardError, LookupError,
Richard Jones2d555b32006-05-27 16:15:11 +00001257 "Base class for lookup errors.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001258
1259
1260/*
1261 * IndexError extends LookupError
1262 */
1263SimpleExtendsException(PyExc_LookupError, IndexError,
Richard Jones2d555b32006-05-27 16:15:11 +00001264 "Sequence index out of range.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001265
1266
1267/*
1268 * KeyError extends LookupError
1269 */
1270static PyObject *
1271KeyError_str(PyBaseExceptionObject *self)
1272{
1273 /* If args is a tuple of exactly one item, apply repr to args[0].
1274 This is done so that e.g. the exception raised by {}[''] prints
1275 KeyError: ''
1276 rather than the confusing
1277 KeyError
1278 alone. The downside is that if KeyError is raised with an explanatory
1279 string, that string will be displayed in quotes. Too bad.
1280 If args is anything else, use the default BaseException__str__().
1281 */
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001282 if (PyTuple_GET_SIZE(self->args) == 1) {
1283 return PyObject_Repr(PyTuple_GET_ITEM(self->args, 0));
Richard Jones7b9558d2006-05-27 12:29:24 +00001284 }
1285 return BaseException_str(self);
1286}
1287
1288ComplexExtendsException(PyExc_LookupError, KeyError, BaseException,
Richard Jones2d555b32006-05-27 16:15:11 +00001289 0, 0, 0, KeyError_str, "Mapping key not found.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001290
1291
1292/*
1293 * ValueError extends StandardError
1294 */
1295SimpleExtendsException(PyExc_StandardError, ValueError,
Richard Jones2d555b32006-05-27 16:15:11 +00001296 "Inappropriate argument value (of correct type).");
Richard Jones7b9558d2006-05-27 12:29:24 +00001297
1298/*
1299 * UnicodeError extends ValueError
1300 */
1301
1302SimpleExtendsException(PyExc_ValueError, UnicodeError,
Richard Jones2d555b32006-05-27 16:15:11 +00001303 "Unicode related error.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001304
1305#ifdef Py_USING_UNICODE
Richard Jones7b9558d2006-05-27 12:29:24 +00001306static PyObject *
1307get_string(PyObject *attr, const char *name)
1308{
1309 if (!attr) {
1310 PyErr_Format(PyExc_TypeError, "%.200s attribute not set", name);
1311 return NULL;
1312 }
1313
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001314 if (!PyString_Check(attr)) {
Richard Jones7b9558d2006-05-27 12:29:24 +00001315 PyErr_Format(PyExc_TypeError, "%.200s attribute must be str", name);
1316 return NULL;
1317 }
1318 Py_INCREF(attr);
1319 return attr;
1320}
1321
1322
1323static int
1324set_string(PyObject **attr, const char *value)
1325{
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001326 PyObject *obj = PyString_FromString(value);
Richard Jones7b9558d2006-05-27 12:29:24 +00001327 if (!obj)
1328 return -1;
Georg Brandl43ab1002006-05-28 20:57:09 +00001329 Py_CLEAR(*attr);
Richard Jones7b9558d2006-05-27 12:29:24 +00001330 *attr = obj;
1331 return 0;
1332}
1333
1334
1335static PyObject *
1336get_unicode(PyObject *attr, const char *name)
1337{
1338 if (!attr) {
1339 PyErr_Format(PyExc_TypeError, "%.200s attribute not set", name);
1340 return NULL;
1341 }
1342
1343 if (!PyUnicode_Check(attr)) {
1344 PyErr_Format(PyExc_TypeError,
1345 "%.200s attribute must be unicode", name);
1346 return NULL;
1347 }
1348 Py_INCREF(attr);
1349 return attr;
1350}
1351
1352PyObject *
1353PyUnicodeEncodeError_GetEncoding(PyObject *exc)
1354{
1355 return get_string(((PyUnicodeErrorObject *)exc)->encoding, "encoding");
1356}
1357
1358PyObject *
1359PyUnicodeDecodeError_GetEncoding(PyObject *exc)
1360{
1361 return get_string(((PyUnicodeErrorObject *)exc)->encoding, "encoding");
1362}
1363
1364PyObject *
1365PyUnicodeEncodeError_GetObject(PyObject *exc)
1366{
1367 return get_unicode(((PyUnicodeErrorObject *)exc)->object, "object");
1368}
1369
1370PyObject *
1371PyUnicodeDecodeError_GetObject(PyObject *exc)
1372{
1373 return get_string(((PyUnicodeErrorObject *)exc)->object, "object");
1374}
1375
1376PyObject *
1377PyUnicodeTranslateError_GetObject(PyObject *exc)
1378{
1379 return get_unicode(((PyUnicodeErrorObject *)exc)->object, "object");
1380}
1381
1382int
1383PyUnicodeEncodeError_GetStart(PyObject *exc, Py_ssize_t *start)
1384{
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001385 Py_ssize_t size;
1386 PyObject *obj = get_unicode(((PyUnicodeErrorObject *)exc)->object,
1387 "object");
1388 if (!obj)
1389 return -1;
1390 *start = ((PyUnicodeErrorObject *)exc)->start;
1391 size = PyUnicode_GET_SIZE(obj);
1392 if (*start<0)
1393 *start = 0; /*XXX check for values <0*/
1394 if (*start>=size)
1395 *start = size-1;
1396 Py_DECREF(obj);
1397 return 0;
Richard Jones7b9558d2006-05-27 12:29:24 +00001398}
1399
1400
1401int
1402PyUnicodeDecodeError_GetStart(PyObject *exc, Py_ssize_t *start)
1403{
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001404 Py_ssize_t size;
1405 PyObject *obj = get_string(((PyUnicodeErrorObject *)exc)->object,
1406 "object");
1407 if (!obj)
1408 return -1;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001409 size = PyString_GET_SIZE(obj);
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001410 *start = ((PyUnicodeErrorObject *)exc)->start;
1411 if (*start<0)
1412 *start = 0;
1413 if (*start>=size)
1414 *start = size-1;
1415 Py_DECREF(obj);
1416 return 0;
Richard Jones7b9558d2006-05-27 12:29:24 +00001417}
1418
1419
1420int
1421PyUnicodeTranslateError_GetStart(PyObject *exc, Py_ssize_t *start)
1422{
1423 return PyUnicodeEncodeError_GetStart(exc, start);
1424}
1425
1426
1427int
1428PyUnicodeEncodeError_SetStart(PyObject *exc, Py_ssize_t start)
1429{
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001430 ((PyUnicodeErrorObject *)exc)->start = start;
1431 return 0;
Richard Jones7b9558d2006-05-27 12:29:24 +00001432}
1433
1434
1435int
1436PyUnicodeDecodeError_SetStart(PyObject *exc, Py_ssize_t start)
1437{
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001438 ((PyUnicodeErrorObject *)exc)->start = start;
1439 return 0;
Richard Jones7b9558d2006-05-27 12:29:24 +00001440}
1441
1442
1443int
1444PyUnicodeTranslateError_SetStart(PyObject *exc, Py_ssize_t start)
1445{
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001446 ((PyUnicodeErrorObject *)exc)->start = start;
1447 return 0;
Richard Jones7b9558d2006-05-27 12:29:24 +00001448}
1449
1450
1451int
1452PyUnicodeEncodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
1453{
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001454 Py_ssize_t size;
1455 PyObject *obj = get_unicode(((PyUnicodeErrorObject *)exc)->object,
1456 "object");
1457 if (!obj)
1458 return -1;
1459 *end = ((PyUnicodeErrorObject *)exc)->end;
1460 size = PyUnicode_GET_SIZE(obj);
1461 if (*end<1)
1462 *end = 1;
1463 if (*end>size)
1464 *end = size;
1465 Py_DECREF(obj);
1466 return 0;
Richard Jones7b9558d2006-05-27 12:29:24 +00001467}
1468
1469
1470int
1471PyUnicodeDecodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
1472{
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001473 Py_ssize_t size;
1474 PyObject *obj = get_string(((PyUnicodeErrorObject *)exc)->object,
1475 "object");
1476 if (!obj)
1477 return -1;
1478 *end = ((PyUnicodeErrorObject *)exc)->end;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001479 size = PyString_GET_SIZE(obj);
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001480 if (*end<1)
1481 *end = 1;
1482 if (*end>size)
1483 *end = size;
1484 Py_DECREF(obj);
1485 return 0;
Richard Jones7b9558d2006-05-27 12:29:24 +00001486}
1487
1488
1489int
1490PyUnicodeTranslateError_GetEnd(PyObject *exc, Py_ssize_t *start)
1491{
1492 return PyUnicodeEncodeError_GetEnd(exc, start);
1493}
1494
1495
1496int
1497PyUnicodeEncodeError_SetEnd(PyObject *exc, Py_ssize_t end)
1498{
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001499 ((PyUnicodeErrorObject *)exc)->end = end;
1500 return 0;
Richard Jones7b9558d2006-05-27 12:29:24 +00001501}
1502
1503
1504int
1505PyUnicodeDecodeError_SetEnd(PyObject *exc, Py_ssize_t end)
1506{
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001507 ((PyUnicodeErrorObject *)exc)->end = end;
1508 return 0;
Richard Jones7b9558d2006-05-27 12:29:24 +00001509}
1510
1511
1512int
1513PyUnicodeTranslateError_SetEnd(PyObject *exc, Py_ssize_t end)
1514{
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001515 ((PyUnicodeErrorObject *)exc)->end = end;
1516 return 0;
Richard Jones7b9558d2006-05-27 12:29:24 +00001517}
1518
1519PyObject *
1520PyUnicodeEncodeError_GetReason(PyObject *exc)
1521{
1522 return get_string(((PyUnicodeErrorObject *)exc)->reason, "reason");
1523}
1524
1525
1526PyObject *
1527PyUnicodeDecodeError_GetReason(PyObject *exc)
1528{
1529 return get_string(((PyUnicodeErrorObject *)exc)->reason, "reason");
1530}
1531
1532
1533PyObject *
1534PyUnicodeTranslateError_GetReason(PyObject *exc)
1535{
1536 return get_string(((PyUnicodeErrorObject *)exc)->reason, "reason");
1537}
1538
1539
1540int
1541PyUnicodeEncodeError_SetReason(PyObject *exc, const char *reason)
1542{
1543 return set_string(&((PyUnicodeErrorObject *)exc)->reason, reason);
1544}
1545
1546
1547int
1548PyUnicodeDecodeError_SetReason(PyObject *exc, const char *reason)
1549{
1550 return set_string(&((PyUnicodeErrorObject *)exc)->reason, reason);
1551}
1552
1553
1554int
1555PyUnicodeTranslateError_SetReason(PyObject *exc, const char *reason)
1556{
1557 return set_string(&((PyUnicodeErrorObject *)exc)->reason, reason);
1558}
1559
1560
Richard Jones7b9558d2006-05-27 12:29:24 +00001561static int
1562UnicodeError_init(PyUnicodeErrorObject *self, PyObject *args, PyObject *kwds,
1563 PyTypeObject *objecttype)
1564{
Michael W. Hudson96495ee2006-05-28 17:40:29 +00001565 Py_CLEAR(self->encoding);
1566 Py_CLEAR(self->object);
Michael W. Hudson96495ee2006-05-28 17:40:29 +00001567 Py_CLEAR(self->reason);
1568
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001569 if (!PyArg_ParseTuple(args, "O!O!nnO!",
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001570 &PyString_Type, &self->encoding,
Richard Jones7b9558d2006-05-27 12:29:24 +00001571 objecttype, &self->object,
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001572 &self->start,
1573 &self->end,
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001574 &PyString_Type, &self->reason)) {
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001575 self->encoding = self->object = self->reason = NULL;
Richard Jones7b9558d2006-05-27 12:29:24 +00001576 return -1;
1577 }
1578
1579 Py_INCREF(self->encoding);
1580 Py_INCREF(self->object);
Richard Jones7b9558d2006-05-27 12:29:24 +00001581 Py_INCREF(self->reason);
1582
1583 return 0;
1584}
1585
Michael W. Hudson96495ee2006-05-28 17:40:29 +00001586static int
Richard Jones7b9558d2006-05-27 12:29:24 +00001587UnicodeError_clear(PyUnicodeErrorObject *self)
1588{
1589 Py_CLEAR(self->encoding);
1590 Py_CLEAR(self->object);
Richard Jones7b9558d2006-05-27 12:29:24 +00001591 Py_CLEAR(self->reason);
1592 return BaseException_clear((PyBaseExceptionObject *)self);
1593}
1594
1595static void
1596UnicodeError_dealloc(PyUnicodeErrorObject *self)
1597{
Georg Brandl38f62372006-09-06 06:50:05 +00001598 _PyObject_GC_UNTRACK(self);
Richard Jones7b9558d2006-05-27 12:29:24 +00001599 UnicodeError_clear(self);
Christian Heimese93237d2007-12-19 02:37:44 +00001600 Py_TYPE(self)->tp_free((PyObject *)self);
Richard Jones7b9558d2006-05-27 12:29:24 +00001601}
1602
Michael W. Hudson96495ee2006-05-28 17:40:29 +00001603static int
Richard Jones7b9558d2006-05-27 12:29:24 +00001604UnicodeError_traverse(PyUnicodeErrorObject *self, visitproc visit, void *arg)
1605{
1606 Py_VISIT(self->encoding);
1607 Py_VISIT(self->object);
Richard Jones7b9558d2006-05-27 12:29:24 +00001608 Py_VISIT(self->reason);
1609 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1610}
1611
1612static PyMemberDef UnicodeError_members[] = {
Richard Jones7b9558d2006-05-27 12:29:24 +00001613 {"encoding", T_OBJECT, offsetof(PyUnicodeErrorObject, encoding), 0,
1614 PyDoc_STR("exception encoding")},
1615 {"object", T_OBJECT, offsetof(PyUnicodeErrorObject, object), 0,
1616 PyDoc_STR("exception object")},
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001617 {"start", T_PYSSIZET, offsetof(PyUnicodeErrorObject, start), 0,
Richard Jones7b9558d2006-05-27 12:29:24 +00001618 PyDoc_STR("exception start")},
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001619 {"end", T_PYSSIZET, offsetof(PyUnicodeErrorObject, end), 0,
Richard Jones7b9558d2006-05-27 12:29:24 +00001620 PyDoc_STR("exception end")},
1621 {"reason", T_OBJECT, offsetof(PyUnicodeErrorObject, reason), 0,
1622 PyDoc_STR("exception reason")},
1623 {NULL} /* Sentinel */
1624};
1625
1626
1627/*
1628 * UnicodeEncodeError extends UnicodeError
1629 */
Richard Jones7b9558d2006-05-27 12:29:24 +00001630
1631static int
1632UnicodeEncodeError_init(PyObject *self, PyObject *args, PyObject *kwds)
1633{
1634 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1635 return -1;
1636 return UnicodeError_init((PyUnicodeErrorObject *)self, args,
1637 kwds, &PyUnicode_Type);
1638}
1639
1640static PyObject *
1641UnicodeEncodeError_str(PyObject *self)
1642{
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001643 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Richard Jones7b9558d2006-05-27 12:29:24 +00001644
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001645 if (uself->end==uself->start+1) {
1646 int badchar = (int)PyUnicode_AS_UNICODE(uself->object)[uself->start];
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001647 char badchar_str[20];
1648 if (badchar <= 0xff)
1649 PyOS_snprintf(badchar_str, sizeof(badchar_str), "x%02x", badchar);
1650 else if (badchar <= 0xffff)
1651 PyOS_snprintf(badchar_str, sizeof(badchar_str), "u%04x", badchar);
1652 else
1653 PyOS_snprintf(badchar_str, sizeof(badchar_str), "U%08x", badchar);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001654 return PyString_FromFormat(
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001655 "'%.400s' codec can't encode character u'\\%s' in position %zd: %.400s",
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001656 PyString_AS_STRING(uself->encoding),
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001657 badchar_str,
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001658 uself->start,
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001659 PyString_AS_STRING(uself->reason)
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001660 );
Richard Jones7b9558d2006-05-27 12:29:24 +00001661 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001662 return PyString_FromFormat(
Richard Jones7b9558d2006-05-27 12:29:24 +00001663 "'%.400s' codec can't encode characters in position %zd-%zd: %.400s",
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001664 PyString_AS_STRING(uself->encoding),
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001665 uself->start,
1666 uself->end-1,
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001667 PyString_AS_STRING(uself->reason)
Richard Jones7b9558d2006-05-27 12:29:24 +00001668 );
1669}
1670
1671static PyTypeObject _PyExc_UnicodeEncodeError = {
1672 PyObject_HEAD_INIT(NULL)
1673 0,
Georg Brandl38f62372006-09-06 06:50:05 +00001674 EXC_MODULE_NAME "UnicodeEncodeError",
Richard Jones7b9558d2006-05-27 12:29:24 +00001675 sizeof(PyUnicodeErrorObject), 0,
1676 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1677 (reprfunc)UnicodeEncodeError_str, 0, 0, 0,
1678 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Michael W. Hudson27596272006-05-28 21:19:03 +00001679 PyDoc_STR("Unicode encoding error."), (traverseproc)UnicodeError_traverse,
1680 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
Richard Jones7b9558d2006-05-27 12:29:24 +00001681 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Michael W. Hudson96495ee2006-05-28 17:40:29 +00001682 (initproc)UnicodeEncodeError_init, 0, BaseException_new,
Richard Jones7b9558d2006-05-27 12:29:24 +00001683};
1684PyObject *PyExc_UnicodeEncodeError = (PyObject *)&_PyExc_UnicodeEncodeError;
1685
1686PyObject *
1687PyUnicodeEncodeError_Create(
1688 const char *encoding, const Py_UNICODE *object, Py_ssize_t length,
1689 Py_ssize_t start, Py_ssize_t end, const char *reason)
1690{
1691 return PyObject_CallFunction(PyExc_UnicodeEncodeError, "su#nns",
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001692 encoding, object, length, start, end, reason);
Richard Jones7b9558d2006-05-27 12:29:24 +00001693}
1694
1695
1696/*
1697 * UnicodeDecodeError extends UnicodeError
1698 */
Richard Jones7b9558d2006-05-27 12:29:24 +00001699
1700static int
1701UnicodeDecodeError_init(PyObject *self, PyObject *args, PyObject *kwds)
1702{
1703 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1704 return -1;
1705 return UnicodeError_init((PyUnicodeErrorObject *)self, args,
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001706 kwds, &PyString_Type);
Richard Jones7b9558d2006-05-27 12:29:24 +00001707}
1708
1709static PyObject *
1710UnicodeDecodeError_str(PyObject *self)
1711{
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001712 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Richard Jones7b9558d2006-05-27 12:29:24 +00001713
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001714 if (uself->end==uself->start+1) {
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001715 /* FromFormat does not support %02x, so format that separately */
1716 char byte[4];
1717 PyOS_snprintf(byte, sizeof(byte), "%02x",
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001718 ((int)PyString_AS_STRING(uself->object)[uself->start])&0xff);
1719 return PyString_FromFormat(
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001720 "'%.400s' codec can't decode byte 0x%s in position %zd: %.400s",
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001721 PyString_AS_STRING(uself->encoding),
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001722 byte,
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001723 uself->start,
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001724 PyString_AS_STRING(uself->reason)
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001725 );
Richard Jones7b9558d2006-05-27 12:29:24 +00001726 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001727 return PyString_FromFormat(
Richard Jones7b9558d2006-05-27 12:29:24 +00001728 "'%.400s' codec can't decode bytes in position %zd-%zd: %.400s",
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001729 PyString_AS_STRING(uself->encoding),
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001730 uself->start,
1731 uself->end-1,
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001732 PyString_AS_STRING(uself->reason)
Richard Jones7b9558d2006-05-27 12:29:24 +00001733 );
1734}
1735
1736static PyTypeObject _PyExc_UnicodeDecodeError = {
1737 PyObject_HEAD_INIT(NULL)
1738 0,
1739 EXC_MODULE_NAME "UnicodeDecodeError",
1740 sizeof(PyUnicodeErrorObject), 0,
1741 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1742 (reprfunc)UnicodeDecodeError_str, 0, 0, 0,
1743 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Michael W. Hudson27596272006-05-28 21:19:03 +00001744 PyDoc_STR("Unicode decoding error."), (traverseproc)UnicodeError_traverse,
1745 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
Richard Jones7b9558d2006-05-27 12:29:24 +00001746 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Michael W. Hudson96495ee2006-05-28 17:40:29 +00001747 (initproc)UnicodeDecodeError_init, 0, BaseException_new,
Richard Jones7b9558d2006-05-27 12:29:24 +00001748};
1749PyObject *PyExc_UnicodeDecodeError = (PyObject *)&_PyExc_UnicodeDecodeError;
1750
1751PyObject *
1752PyUnicodeDecodeError_Create(
1753 const char *encoding, const char *object, Py_ssize_t length,
1754 Py_ssize_t start, Py_ssize_t end, const char *reason)
1755{
1756 assert(length < INT_MAX);
1757 assert(start < INT_MAX);
1758 assert(end < INT_MAX);
1759 return PyObject_CallFunction(PyExc_UnicodeDecodeError, "ss#nns",
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001760 encoding, object, length, start, end, reason);
Richard Jones7b9558d2006-05-27 12:29:24 +00001761}
1762
1763
1764/*
1765 * UnicodeTranslateError extends UnicodeError
1766 */
Richard Jones7b9558d2006-05-27 12:29:24 +00001767
1768static int
1769UnicodeTranslateError_init(PyUnicodeErrorObject *self, PyObject *args,
1770 PyObject *kwds)
1771{
1772 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1773 return -1;
1774
1775 Py_CLEAR(self->object);
Richard Jones7b9558d2006-05-27 12:29:24 +00001776 Py_CLEAR(self->reason);
1777
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001778 if (!PyArg_ParseTuple(args, "O!nnO!",
Richard Jones7b9558d2006-05-27 12:29:24 +00001779 &PyUnicode_Type, &self->object,
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001780 &self->start,
1781 &self->end,
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001782 &PyString_Type, &self->reason)) {
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001783 self->object = self->reason = NULL;
Richard Jones7b9558d2006-05-27 12:29:24 +00001784 return -1;
1785 }
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001786
Richard Jones7b9558d2006-05-27 12:29:24 +00001787 Py_INCREF(self->object);
Richard Jones7b9558d2006-05-27 12:29:24 +00001788 Py_INCREF(self->reason);
1789
1790 return 0;
1791}
1792
1793
1794static PyObject *
1795UnicodeTranslateError_str(PyObject *self)
1796{
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001797 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Richard Jones7b9558d2006-05-27 12:29:24 +00001798
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001799 if (uself->end==uself->start+1) {
1800 int badchar = (int)PyUnicode_AS_UNICODE(uself->object)[uself->start];
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001801 char badchar_str[20];
1802 if (badchar <= 0xff)
1803 PyOS_snprintf(badchar_str, sizeof(badchar_str), "x%02x", badchar);
1804 else if (badchar <= 0xffff)
1805 PyOS_snprintf(badchar_str, sizeof(badchar_str), "u%04x", badchar);
1806 else
1807 PyOS_snprintf(badchar_str, sizeof(badchar_str), "U%08x", badchar);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001808 return PyString_FromFormat(
Richard Jones7b9558d2006-05-27 12:29:24 +00001809 "can't translate character u'\\%s' in position %zd: %.400s",
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001810 badchar_str,
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001811 uself->start,
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001812 PyString_AS_STRING(uself->reason)
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001813 );
Richard Jones7b9558d2006-05-27 12:29:24 +00001814 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001815 return PyString_FromFormat(
Richard Jones7b9558d2006-05-27 12:29:24 +00001816 "can't translate characters in position %zd-%zd: %.400s",
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001817 uself->start,
1818 uself->end-1,
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001819 PyString_AS_STRING(uself->reason)
Richard Jones7b9558d2006-05-27 12:29:24 +00001820 );
1821}
1822
1823static PyTypeObject _PyExc_UnicodeTranslateError = {
1824 PyObject_HEAD_INIT(NULL)
1825 0,
1826 EXC_MODULE_NAME "UnicodeTranslateError",
1827 sizeof(PyUnicodeErrorObject), 0,
1828 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1829 (reprfunc)UnicodeTranslateError_str, 0, 0, 0,
1830 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Georg Brandl38f62372006-09-06 06:50:05 +00001831 PyDoc_STR("Unicode translation error."), (traverseproc)UnicodeError_traverse,
Richard Jones7b9558d2006-05-27 12:29:24 +00001832 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
1833 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Michael W. Hudson96495ee2006-05-28 17:40:29 +00001834 (initproc)UnicodeTranslateError_init, 0, BaseException_new,
Richard Jones7b9558d2006-05-27 12:29:24 +00001835};
1836PyObject *PyExc_UnicodeTranslateError = (PyObject *)&_PyExc_UnicodeTranslateError;
1837
1838PyObject *
1839PyUnicodeTranslateError_Create(
1840 const Py_UNICODE *object, Py_ssize_t length,
1841 Py_ssize_t start, Py_ssize_t end, const char *reason)
1842{
1843 return PyObject_CallFunction(PyExc_UnicodeTranslateError, "u#nns",
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001844 object, length, start, end, reason);
Richard Jones7b9558d2006-05-27 12:29:24 +00001845}
1846#endif
1847
1848
1849/*
1850 * AssertionError extends StandardError
1851 */
1852SimpleExtendsException(PyExc_StandardError, AssertionError,
Richard Jones2d555b32006-05-27 16:15:11 +00001853 "Assertion failed.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001854
1855
1856/*
1857 * ArithmeticError extends StandardError
1858 */
1859SimpleExtendsException(PyExc_StandardError, ArithmeticError,
Richard Jones2d555b32006-05-27 16:15:11 +00001860 "Base class for arithmetic errors.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001861
1862
1863/*
1864 * FloatingPointError extends ArithmeticError
1865 */
1866SimpleExtendsException(PyExc_ArithmeticError, FloatingPointError,
Richard Jones2d555b32006-05-27 16:15:11 +00001867 "Floating point operation failed.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001868
1869
1870/*
1871 * OverflowError extends ArithmeticError
1872 */
1873SimpleExtendsException(PyExc_ArithmeticError, OverflowError,
Richard Jones2d555b32006-05-27 16:15:11 +00001874 "Result too large to be represented.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001875
1876
1877/*
1878 * ZeroDivisionError extends ArithmeticError
1879 */
1880SimpleExtendsException(PyExc_ArithmeticError, ZeroDivisionError,
Richard Jones2d555b32006-05-27 16:15:11 +00001881 "Second argument to a division or modulo operation was zero.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001882
1883
1884/*
1885 * SystemError extends StandardError
1886 */
1887SimpleExtendsException(PyExc_StandardError, SystemError,
1888 "Internal error in the Python interpreter.\n"
1889 "\n"
1890 "Please report this to the Python maintainer, along with the traceback,\n"
Richard Jones2d555b32006-05-27 16:15:11 +00001891 "the Python version, and the hardware/OS platform and version.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001892
1893
1894/*
1895 * ReferenceError extends StandardError
1896 */
1897SimpleExtendsException(PyExc_StandardError, ReferenceError,
Richard Jones2d555b32006-05-27 16:15:11 +00001898 "Weak ref proxy used after referent went away.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001899
1900
1901/*
1902 * MemoryError extends StandardError
1903 */
Richard Jones2d555b32006-05-27 16:15:11 +00001904SimpleExtendsException(PyExc_StandardError, MemoryError, "Out of memory.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001905
Travis E. Oliphant3781aef2008-03-18 04:44:57 +00001906/*
1907 * BufferError extends StandardError
1908 */
1909SimpleExtendsException(PyExc_StandardError, BufferError, "Buffer error.");
1910
Richard Jones7b9558d2006-05-27 12:29:24 +00001911
1912/* Warning category docstrings */
1913
1914/*
1915 * Warning extends Exception
1916 */
1917SimpleExtendsException(PyExc_Exception, Warning,
Richard Jones2d555b32006-05-27 16:15:11 +00001918 "Base class for warning categories.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001919
1920
1921/*
1922 * UserWarning extends Warning
1923 */
1924SimpleExtendsException(PyExc_Warning, UserWarning,
Richard Jones2d555b32006-05-27 16:15:11 +00001925 "Base class for warnings generated by user code.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001926
1927
1928/*
1929 * DeprecationWarning extends Warning
1930 */
1931SimpleExtendsException(PyExc_Warning, DeprecationWarning,
Richard Jones2d555b32006-05-27 16:15:11 +00001932 "Base class for warnings about deprecated features.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001933
1934
1935/*
1936 * PendingDeprecationWarning extends Warning
1937 */
1938SimpleExtendsException(PyExc_Warning, PendingDeprecationWarning,
1939 "Base class for warnings about features which will be deprecated\n"
Richard Jones2d555b32006-05-27 16:15:11 +00001940 "in the future.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001941
1942
1943/*
1944 * SyntaxWarning extends Warning
1945 */
1946SimpleExtendsException(PyExc_Warning, SyntaxWarning,
Richard Jones2d555b32006-05-27 16:15:11 +00001947 "Base class for warnings about dubious syntax.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001948
1949
1950/*
1951 * RuntimeWarning extends Warning
1952 */
1953SimpleExtendsException(PyExc_Warning, RuntimeWarning,
Richard Jones2d555b32006-05-27 16:15:11 +00001954 "Base class for warnings about dubious runtime behavior.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001955
1956
1957/*
1958 * FutureWarning extends Warning
1959 */
1960SimpleExtendsException(PyExc_Warning, FutureWarning,
1961 "Base class for warnings about constructs that will change semantically\n"
Richard Jones2d555b32006-05-27 16:15:11 +00001962 "in the future.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001963
1964
1965/*
1966 * ImportWarning extends Warning
1967 */
1968SimpleExtendsException(PyExc_Warning, ImportWarning,
Richard Jones2d555b32006-05-27 16:15:11 +00001969 "Base class for warnings about probable mistakes in module imports");
Richard Jones7b9558d2006-05-27 12:29:24 +00001970
1971
Marc-André Lemburg040f76b2006-08-14 10:55:19 +00001972/*
1973 * UnicodeWarning extends Warning
1974 */
1975SimpleExtendsException(PyExc_Warning, UnicodeWarning,
1976 "Base class for warnings about Unicode related problems, mostly\n"
1977 "related to conversion problems.");
1978
Christian Heimes1a6387e2008-03-26 12:49:49 +00001979/*
1980 * BytesWarning extends Warning
1981 */
1982SimpleExtendsException(PyExc_Warning, BytesWarning,
1983 "Base class for warnings about bytes and buffer related problems, mostly\n"
1984 "related to conversion from str or comparing to str.");
Marc-André Lemburg040f76b2006-08-14 10:55:19 +00001985
Richard Jones7b9558d2006-05-27 12:29:24 +00001986/* Pre-computed MemoryError instance. Best to create this as early as
1987 * possible and not wait until a MemoryError is actually raised!
1988 */
1989PyObject *PyExc_MemoryErrorInst=NULL;
1990
Brett Cannon1e534b52007-09-07 04:18:30 +00001991/* Pre-computed RuntimeError instance for when recursion depth is reached.
1992 Meant to be used when normalizing the exception for exceeding the recursion
1993 depth will cause its own infinite recursion.
1994*/
1995PyObject *PyExc_RecursionErrorInst = NULL;
1996
Richard Jones7b9558d2006-05-27 12:29:24 +00001997/* module global functions */
1998static PyMethodDef functions[] = {
1999 /* Sentinel */
2000 {NULL, NULL}
2001};
2002
2003#define PRE_INIT(TYPE) if (PyType_Ready(&_PyExc_ ## TYPE) < 0) \
2004 Py_FatalError("exceptions bootstrapping error.");
2005
2006#define POST_INIT(TYPE) Py_INCREF(PyExc_ ## TYPE); \
2007 PyModule_AddObject(m, # TYPE, PyExc_ ## TYPE); \
2008 if (PyDict_SetItemString(bdict, # TYPE, PyExc_ ## TYPE)) \
2009 Py_FatalError("Module dictionary insertion problem.");
2010
Kristján Valur Jónsson74c3ea02006-07-03 14:59:05 +00002011#if defined _MSC_VER && _MSC_VER >= 1400 && defined(__STDC_SECURE_LIB__)
Kristján Valur Jónssonf6083172006-06-12 15:45:12 +00002012/* crt variable checking in VisualStudio .NET 2005 */
2013#include <crtdbg.h>
2014
2015static int prevCrtReportMode;
2016static _invalid_parameter_handler prevCrtHandler;
2017
2018/* Invalid parameter handler. Sets a ValueError exception */
2019static void
2020InvalidParameterHandler(
2021 const wchar_t * expression,
2022 const wchar_t * function,
2023 const wchar_t * file,
2024 unsigned int line,
2025 uintptr_t pReserved)
2026{
2027 /* Do nothing, allow execution to continue. Usually this
2028 * means that the CRT will set errno to EINVAL
2029 */
2030}
2031#endif
2032
2033
Richard Jones7b9558d2006-05-27 12:29:24 +00002034PyMODINIT_FUNC
Michael W. Hudson22a80e72006-05-28 15:51:40 +00002035_PyExc_Init(void)
Richard Jones7b9558d2006-05-27 12:29:24 +00002036{
2037 PyObject *m, *bltinmod, *bdict;
2038
2039 PRE_INIT(BaseException)
2040 PRE_INIT(Exception)
2041 PRE_INIT(StandardError)
2042 PRE_INIT(TypeError)
2043 PRE_INIT(StopIteration)
2044 PRE_INIT(GeneratorExit)
2045 PRE_INIT(SystemExit)
2046 PRE_INIT(KeyboardInterrupt)
2047 PRE_INIT(ImportError)
2048 PRE_INIT(EnvironmentError)
2049 PRE_INIT(IOError)
2050 PRE_INIT(OSError)
2051#ifdef MS_WINDOWS
2052 PRE_INIT(WindowsError)
2053#endif
2054#ifdef __VMS
2055 PRE_INIT(VMSError)
2056#endif
2057 PRE_INIT(EOFError)
2058 PRE_INIT(RuntimeError)
2059 PRE_INIT(NotImplementedError)
2060 PRE_INIT(NameError)
2061 PRE_INIT(UnboundLocalError)
2062 PRE_INIT(AttributeError)
2063 PRE_INIT(SyntaxError)
2064 PRE_INIT(IndentationError)
2065 PRE_INIT(TabError)
2066 PRE_INIT(LookupError)
2067 PRE_INIT(IndexError)
2068 PRE_INIT(KeyError)
2069 PRE_INIT(ValueError)
2070 PRE_INIT(UnicodeError)
2071#ifdef Py_USING_UNICODE
2072 PRE_INIT(UnicodeEncodeError)
2073 PRE_INIT(UnicodeDecodeError)
2074 PRE_INIT(UnicodeTranslateError)
2075#endif
2076 PRE_INIT(AssertionError)
2077 PRE_INIT(ArithmeticError)
2078 PRE_INIT(FloatingPointError)
2079 PRE_INIT(OverflowError)
2080 PRE_INIT(ZeroDivisionError)
2081 PRE_INIT(SystemError)
2082 PRE_INIT(ReferenceError)
2083 PRE_INIT(MemoryError)
Benjamin Petersonc0bf76d2008-07-30 17:45:10 +00002084 PRE_INIT(BufferError)
Richard Jones7b9558d2006-05-27 12:29:24 +00002085 PRE_INIT(Warning)
2086 PRE_INIT(UserWarning)
2087 PRE_INIT(DeprecationWarning)
2088 PRE_INIT(PendingDeprecationWarning)
2089 PRE_INIT(SyntaxWarning)
2090 PRE_INIT(RuntimeWarning)
2091 PRE_INIT(FutureWarning)
2092 PRE_INIT(ImportWarning)
Marc-André Lemburg040f76b2006-08-14 10:55:19 +00002093 PRE_INIT(UnicodeWarning)
Christian Heimes1a6387e2008-03-26 12:49:49 +00002094 PRE_INIT(BytesWarning)
Richard Jones7b9558d2006-05-27 12:29:24 +00002095
Richard Jonesc5b2a2e2006-05-27 16:07:28 +00002096 m = Py_InitModule4("exceptions", functions, exceptions_doc,
2097 (PyObject *)NULL, PYTHON_API_VERSION);
Richard Jones7b9558d2006-05-27 12:29:24 +00002098 if (m == NULL) return;
2099
2100 bltinmod = PyImport_ImportModule("__builtin__");
2101 if (bltinmod == NULL)
2102 Py_FatalError("exceptions bootstrapping error.");
2103 bdict = PyModule_GetDict(bltinmod);
2104 if (bdict == NULL)
2105 Py_FatalError("exceptions bootstrapping error.");
2106
2107 POST_INIT(BaseException)
2108 POST_INIT(Exception)
2109 POST_INIT(StandardError)
2110 POST_INIT(TypeError)
2111 POST_INIT(StopIteration)
2112 POST_INIT(GeneratorExit)
2113 POST_INIT(SystemExit)
2114 POST_INIT(KeyboardInterrupt)
2115 POST_INIT(ImportError)
2116 POST_INIT(EnvironmentError)
2117 POST_INIT(IOError)
2118 POST_INIT(OSError)
2119#ifdef MS_WINDOWS
2120 POST_INIT(WindowsError)
2121#endif
2122#ifdef __VMS
2123 POST_INIT(VMSError)
2124#endif
2125 POST_INIT(EOFError)
2126 POST_INIT(RuntimeError)
2127 POST_INIT(NotImplementedError)
2128 POST_INIT(NameError)
2129 POST_INIT(UnboundLocalError)
2130 POST_INIT(AttributeError)
2131 POST_INIT(SyntaxError)
2132 POST_INIT(IndentationError)
2133 POST_INIT(TabError)
2134 POST_INIT(LookupError)
2135 POST_INIT(IndexError)
2136 POST_INIT(KeyError)
2137 POST_INIT(ValueError)
2138 POST_INIT(UnicodeError)
2139#ifdef Py_USING_UNICODE
2140 POST_INIT(UnicodeEncodeError)
2141 POST_INIT(UnicodeDecodeError)
2142 POST_INIT(UnicodeTranslateError)
2143#endif
2144 POST_INIT(AssertionError)
2145 POST_INIT(ArithmeticError)
2146 POST_INIT(FloatingPointError)
2147 POST_INIT(OverflowError)
2148 POST_INIT(ZeroDivisionError)
2149 POST_INIT(SystemError)
2150 POST_INIT(ReferenceError)
2151 POST_INIT(MemoryError)
Benjamin Petersonc0bf76d2008-07-30 17:45:10 +00002152 POST_INIT(BufferError)
Richard Jones7b9558d2006-05-27 12:29:24 +00002153 POST_INIT(Warning)
2154 POST_INIT(UserWarning)
2155 POST_INIT(DeprecationWarning)
2156 POST_INIT(PendingDeprecationWarning)
2157 POST_INIT(SyntaxWarning)
2158 POST_INIT(RuntimeWarning)
2159 POST_INIT(FutureWarning)
2160 POST_INIT(ImportWarning)
Marc-André Lemburg040f76b2006-08-14 10:55:19 +00002161 POST_INIT(UnicodeWarning)
Christian Heimes1a6387e2008-03-26 12:49:49 +00002162 POST_INIT(BytesWarning)
Richard Jones7b9558d2006-05-27 12:29:24 +00002163
2164 PyExc_MemoryErrorInst = BaseException_new(&_PyExc_MemoryError, NULL, NULL);
2165 if (!PyExc_MemoryErrorInst)
2166 Py_FatalError("Cannot pre-allocate MemoryError instance\n");
2167
Brett Cannon1e534b52007-09-07 04:18:30 +00002168 PyExc_RecursionErrorInst = BaseException_new(&_PyExc_RuntimeError, NULL, NULL);
2169 if (!PyExc_RecursionErrorInst)
2170 Py_FatalError("Cannot pre-allocate RuntimeError instance for "
2171 "recursion errors");
2172 else {
2173 PyBaseExceptionObject *err_inst =
2174 (PyBaseExceptionObject *)PyExc_RecursionErrorInst;
2175 PyObject *args_tuple;
2176 PyObject *exc_message;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00002177 exc_message = PyString_FromString("maximum recursion depth exceeded");
Brett Cannon1e534b52007-09-07 04:18:30 +00002178 if (!exc_message)
2179 Py_FatalError("cannot allocate argument for RuntimeError "
2180 "pre-allocation");
2181 args_tuple = PyTuple_Pack(1, exc_message);
2182 if (!args_tuple)
2183 Py_FatalError("cannot allocate tuple for RuntimeError "
2184 "pre-allocation");
2185 Py_DECREF(exc_message);
2186 if (BaseException_init(err_inst, args_tuple, NULL))
2187 Py_FatalError("init of pre-allocated RuntimeError failed");
2188 Py_DECREF(args_tuple);
2189 }
2190
Richard Jones7b9558d2006-05-27 12:29:24 +00002191 Py_DECREF(bltinmod);
Kristján Valur Jónssonf6083172006-06-12 15:45:12 +00002192
Kristján Valur Jónsson74c3ea02006-07-03 14:59:05 +00002193#if defined _MSC_VER && _MSC_VER >= 1400 && defined(__STDC_SECURE_LIB__)
Kristján Valur Jónssonf6083172006-06-12 15:45:12 +00002194 /* Set CRT argument error handler */
2195 prevCrtHandler = _set_invalid_parameter_handler(InvalidParameterHandler);
2196 /* turn off assertions in debug mode */
2197 prevCrtReportMode = _CrtSetReportMode(_CRT_ASSERT, 0);
2198#endif
Richard Jones7b9558d2006-05-27 12:29:24 +00002199}
2200
2201void
2202_PyExc_Fini(void)
2203{
2204 Py_XDECREF(PyExc_MemoryErrorInst);
2205 PyExc_MemoryErrorInst = NULL;
Kristján Valur Jónsson74c3ea02006-07-03 14:59:05 +00002206#if defined _MSC_VER && _MSC_VER >= 1400 && defined(__STDC_SECURE_LIB__)
Kristján Valur Jónssonf6083172006-06-12 15:45:12 +00002207 /* reset CRT error handling */
2208 _set_invalid_parameter_handler(prevCrtHandler);
2209 _CrtSetReportMode(_CRT_ASSERT, prevCrtReportMode);
2210#endif
Richard Jones7b9558d2006-05-27 12:29:24 +00002211}