blob: af67cc7b0cc96d1a5df665a3de244b8af8819f1e [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 },
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000221#ifdef Py_USING_UNICODE
Nick Coghlan524b7772008-07-08 14:08:04 +0000222 {"__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,
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000240 Py_ssize_t start, Py_ssize_t stop)
Brett Cannonf6aa86e2006-09-20 18:43:13 +0000241{
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;
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000320
Georg Brandl89971032009-09-16 20:34:51 +0000321 /* 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 }
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000356
Georg Brandl89971032009-09-16 20:34:51 +0000357 /* 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,
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000370 (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 |
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000397 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;
Eric Smith66807852010-02-24 14:27:37 +00001644 PyObject *result = NULL;
1645 PyObject *reason_str = NULL;
1646 PyObject *encoding_str = NULL;
Richard Jones7b9558d2006-05-27 12:29:24 +00001647
Eric Smith66807852010-02-24 14:27:37 +00001648 /* Get reason and encoding as strings, which they might not be if
1649 they've been modified after we were contructed. */
1650 reason_str = PyObject_Str(uself->reason);
1651 if (reason_str == NULL)
1652 goto done;
1653 encoding_str = PyObject_Str(uself->encoding);
1654 if (encoding_str == NULL)
1655 goto done;
1656
1657 if (uself->start < PyUnicode_GET_SIZE(uself->object) && uself->end == uself->start+1) {
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001658 int badchar = (int)PyUnicode_AS_UNICODE(uself->object)[uself->start];
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001659 char badchar_str[20];
1660 if (badchar <= 0xff)
1661 PyOS_snprintf(badchar_str, sizeof(badchar_str), "x%02x", badchar);
1662 else if (badchar <= 0xffff)
1663 PyOS_snprintf(badchar_str, sizeof(badchar_str), "u%04x", badchar);
1664 else
1665 PyOS_snprintf(badchar_str, sizeof(badchar_str), "U%08x", badchar);
Eric Smith66807852010-02-24 14:27:37 +00001666 result = PyString_FromFormat(
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001667 "'%.400s' codec can't encode character u'\\%s' in position %zd: %.400s",
Eric Smith66807852010-02-24 14:27:37 +00001668 PyString_AS_STRING(encoding_str),
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001669 badchar_str,
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001670 uself->start,
Eric Smith66807852010-02-24 14:27:37 +00001671 PyString_AS_STRING(reason_str));
Richard Jones7b9558d2006-05-27 12:29:24 +00001672 }
Eric Smith66807852010-02-24 14:27:37 +00001673 else {
1674 result = PyString_FromFormat(
1675 "'%.400s' codec can't encode characters in position %zd-%zd: %.400s",
1676 PyString_AS_STRING(encoding_str),
1677 uself->start,
1678 uself->end-1,
1679 PyString_AS_STRING(reason_str));
1680 }
1681done:
1682 Py_XDECREF(reason_str);
1683 Py_XDECREF(encoding_str);
1684 return result;
Richard Jones7b9558d2006-05-27 12:29:24 +00001685}
1686
1687static PyTypeObject _PyExc_UnicodeEncodeError = {
1688 PyObject_HEAD_INIT(NULL)
1689 0,
Georg Brandl38f62372006-09-06 06:50:05 +00001690 EXC_MODULE_NAME "UnicodeEncodeError",
Richard Jones7b9558d2006-05-27 12:29:24 +00001691 sizeof(PyUnicodeErrorObject), 0,
1692 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1693 (reprfunc)UnicodeEncodeError_str, 0, 0, 0,
1694 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Michael W. Hudson27596272006-05-28 21:19:03 +00001695 PyDoc_STR("Unicode encoding error."), (traverseproc)UnicodeError_traverse,
1696 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
Richard Jones7b9558d2006-05-27 12:29:24 +00001697 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Michael W. Hudson96495ee2006-05-28 17:40:29 +00001698 (initproc)UnicodeEncodeError_init, 0, BaseException_new,
Richard Jones7b9558d2006-05-27 12:29:24 +00001699};
1700PyObject *PyExc_UnicodeEncodeError = (PyObject *)&_PyExc_UnicodeEncodeError;
1701
1702PyObject *
1703PyUnicodeEncodeError_Create(
1704 const char *encoding, const Py_UNICODE *object, Py_ssize_t length,
1705 Py_ssize_t start, Py_ssize_t end, const char *reason)
1706{
1707 return PyObject_CallFunction(PyExc_UnicodeEncodeError, "su#nns",
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001708 encoding, object, length, start, end, reason);
Richard Jones7b9558d2006-05-27 12:29:24 +00001709}
1710
1711
1712/*
1713 * UnicodeDecodeError extends UnicodeError
1714 */
Richard Jones7b9558d2006-05-27 12:29:24 +00001715
1716static int
1717UnicodeDecodeError_init(PyObject *self, PyObject *args, PyObject *kwds)
1718{
1719 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1720 return -1;
1721 return UnicodeError_init((PyUnicodeErrorObject *)self, args,
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001722 kwds, &PyString_Type);
Richard Jones7b9558d2006-05-27 12:29:24 +00001723}
1724
1725static PyObject *
1726UnicodeDecodeError_str(PyObject *self)
1727{
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001728 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith66807852010-02-24 14:27:37 +00001729 PyObject *result = NULL;
1730 PyObject *reason_str = NULL;
1731 PyObject *encoding_str = NULL;
Richard Jones7b9558d2006-05-27 12:29:24 +00001732
Eric Smith66807852010-02-24 14:27:37 +00001733 /* Get reason and encoding as strings, which they might not be if
1734 they've been modified after we were contructed. */
1735 reason_str = PyObject_Str(uself->reason);
1736 if (reason_str == NULL)
1737 goto done;
1738 encoding_str = PyObject_Str(uself->encoding);
1739 if (encoding_str == NULL)
1740 goto done;
1741
1742 if (uself->start < PyUnicode_GET_SIZE(uself->object) && uself->end == uself->start+1) {
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001743 /* FromFormat does not support %02x, so format that separately */
1744 char byte[4];
1745 PyOS_snprintf(byte, sizeof(byte), "%02x",
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001746 ((int)PyString_AS_STRING(uself->object)[uself->start])&0xff);
Eric Smith66807852010-02-24 14:27:37 +00001747 result = PyString_FromFormat(
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001748 "'%.400s' codec can't decode byte 0x%s in position %zd: %.400s",
Eric Smith66807852010-02-24 14:27:37 +00001749 PyString_AS_STRING(encoding_str),
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001750 byte,
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001751 uself->start,
Eric Smith66807852010-02-24 14:27:37 +00001752 PyString_AS_STRING(reason_str));
Richard Jones7b9558d2006-05-27 12:29:24 +00001753 }
Eric Smith66807852010-02-24 14:27:37 +00001754 else {
1755 result = PyString_FromFormat(
1756 "'%.400s' codec can't decode bytes in position %zd-%zd: %.400s",
1757 PyString_AS_STRING(encoding_str),
1758 uself->start,
1759 uself->end-1,
1760 PyString_AS_STRING(reason_str));
1761 }
1762done:
1763 Py_XDECREF(reason_str);
1764 Py_XDECREF(encoding_str);
1765 return result;
Richard Jones7b9558d2006-05-27 12:29:24 +00001766}
1767
1768static PyTypeObject _PyExc_UnicodeDecodeError = {
1769 PyObject_HEAD_INIT(NULL)
1770 0,
1771 EXC_MODULE_NAME "UnicodeDecodeError",
1772 sizeof(PyUnicodeErrorObject), 0,
1773 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1774 (reprfunc)UnicodeDecodeError_str, 0, 0, 0,
1775 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Michael W. Hudson27596272006-05-28 21:19:03 +00001776 PyDoc_STR("Unicode decoding error."), (traverseproc)UnicodeError_traverse,
1777 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
Richard Jones7b9558d2006-05-27 12:29:24 +00001778 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Michael W. Hudson96495ee2006-05-28 17:40:29 +00001779 (initproc)UnicodeDecodeError_init, 0, BaseException_new,
Richard Jones7b9558d2006-05-27 12:29:24 +00001780};
1781PyObject *PyExc_UnicodeDecodeError = (PyObject *)&_PyExc_UnicodeDecodeError;
1782
1783PyObject *
1784PyUnicodeDecodeError_Create(
1785 const char *encoding, const char *object, Py_ssize_t length,
1786 Py_ssize_t start, Py_ssize_t end, const char *reason)
1787{
1788 assert(length < INT_MAX);
1789 assert(start < INT_MAX);
1790 assert(end < INT_MAX);
1791 return PyObject_CallFunction(PyExc_UnicodeDecodeError, "ss#nns",
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001792 encoding, object, length, start, end, reason);
Richard Jones7b9558d2006-05-27 12:29:24 +00001793}
1794
1795
1796/*
1797 * UnicodeTranslateError extends UnicodeError
1798 */
Richard Jones7b9558d2006-05-27 12:29:24 +00001799
1800static int
1801UnicodeTranslateError_init(PyUnicodeErrorObject *self, PyObject *args,
1802 PyObject *kwds)
1803{
1804 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1805 return -1;
1806
1807 Py_CLEAR(self->object);
Richard Jones7b9558d2006-05-27 12:29:24 +00001808 Py_CLEAR(self->reason);
1809
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001810 if (!PyArg_ParseTuple(args, "O!nnO!",
Richard Jones7b9558d2006-05-27 12:29:24 +00001811 &PyUnicode_Type, &self->object,
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001812 &self->start,
1813 &self->end,
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001814 &PyString_Type, &self->reason)) {
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001815 self->object = self->reason = NULL;
Richard Jones7b9558d2006-05-27 12:29:24 +00001816 return -1;
1817 }
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001818
Richard Jones7b9558d2006-05-27 12:29:24 +00001819 Py_INCREF(self->object);
Richard Jones7b9558d2006-05-27 12:29:24 +00001820 Py_INCREF(self->reason);
1821
1822 return 0;
1823}
1824
1825
1826static PyObject *
1827UnicodeTranslateError_str(PyObject *self)
1828{
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001829 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith66807852010-02-24 14:27:37 +00001830 PyObject *result = NULL;
1831 PyObject *reason_str = NULL;
Richard Jones7b9558d2006-05-27 12:29:24 +00001832
Eric Smith66807852010-02-24 14:27:37 +00001833 /* Get reason as a string, which it might not be if it's been
1834 modified after we were contructed. */
1835 reason_str = PyObject_Str(uself->reason);
1836 if (reason_str == NULL)
1837 goto done;
1838
1839 if (uself->start < PyUnicode_GET_SIZE(uself->object) && uself->end == uself->start+1) {
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001840 int badchar = (int)PyUnicode_AS_UNICODE(uself->object)[uself->start];
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001841 char badchar_str[20];
1842 if (badchar <= 0xff)
1843 PyOS_snprintf(badchar_str, sizeof(badchar_str), "x%02x", badchar);
1844 else if (badchar <= 0xffff)
1845 PyOS_snprintf(badchar_str, sizeof(badchar_str), "u%04x", badchar);
1846 else
1847 PyOS_snprintf(badchar_str, sizeof(badchar_str), "U%08x", badchar);
Eric Smith66807852010-02-24 14:27:37 +00001848 result = PyString_FromFormat(
Richard Jones7b9558d2006-05-27 12:29:24 +00001849 "can't translate character u'\\%s' in position %zd: %.400s",
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001850 badchar_str,
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001851 uself->start,
Eric Smith66807852010-02-24 14:27:37 +00001852 PyString_AS_STRING(reason_str));
1853 } else {
1854 result = PyString_FromFormat(
1855 "can't translate characters in position %zd-%zd: %.400s",
1856 uself->start,
1857 uself->end-1,
1858 PyString_AS_STRING(reason_str));
Richard Jones7b9558d2006-05-27 12:29:24 +00001859 }
Eric Smith66807852010-02-24 14:27:37 +00001860done:
1861 Py_XDECREF(reason_str);
1862 return result;
Richard Jones7b9558d2006-05-27 12:29:24 +00001863}
1864
1865static PyTypeObject _PyExc_UnicodeTranslateError = {
1866 PyObject_HEAD_INIT(NULL)
1867 0,
1868 EXC_MODULE_NAME "UnicodeTranslateError",
1869 sizeof(PyUnicodeErrorObject), 0,
1870 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1871 (reprfunc)UnicodeTranslateError_str, 0, 0, 0,
1872 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Georg Brandl38f62372006-09-06 06:50:05 +00001873 PyDoc_STR("Unicode translation error."), (traverseproc)UnicodeError_traverse,
Richard Jones7b9558d2006-05-27 12:29:24 +00001874 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
1875 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Michael W. Hudson96495ee2006-05-28 17:40:29 +00001876 (initproc)UnicodeTranslateError_init, 0, BaseException_new,
Richard Jones7b9558d2006-05-27 12:29:24 +00001877};
1878PyObject *PyExc_UnicodeTranslateError = (PyObject *)&_PyExc_UnicodeTranslateError;
1879
1880PyObject *
1881PyUnicodeTranslateError_Create(
1882 const Py_UNICODE *object, Py_ssize_t length,
1883 Py_ssize_t start, Py_ssize_t end, const char *reason)
1884{
1885 return PyObject_CallFunction(PyExc_UnicodeTranslateError, "u#nns",
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001886 object, length, start, end, reason);
Richard Jones7b9558d2006-05-27 12:29:24 +00001887}
1888#endif
1889
1890
1891/*
1892 * AssertionError extends StandardError
1893 */
1894SimpleExtendsException(PyExc_StandardError, AssertionError,
Richard Jones2d555b32006-05-27 16:15:11 +00001895 "Assertion failed.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001896
1897
1898/*
1899 * ArithmeticError extends StandardError
1900 */
1901SimpleExtendsException(PyExc_StandardError, ArithmeticError,
Richard Jones2d555b32006-05-27 16:15:11 +00001902 "Base class for arithmetic errors.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001903
1904
1905/*
1906 * FloatingPointError extends ArithmeticError
1907 */
1908SimpleExtendsException(PyExc_ArithmeticError, FloatingPointError,
Richard Jones2d555b32006-05-27 16:15:11 +00001909 "Floating point operation failed.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001910
1911
1912/*
1913 * OverflowError extends ArithmeticError
1914 */
1915SimpleExtendsException(PyExc_ArithmeticError, OverflowError,
Richard Jones2d555b32006-05-27 16:15:11 +00001916 "Result too large to be represented.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001917
1918
1919/*
1920 * ZeroDivisionError extends ArithmeticError
1921 */
1922SimpleExtendsException(PyExc_ArithmeticError, ZeroDivisionError,
Richard Jones2d555b32006-05-27 16:15:11 +00001923 "Second argument to a division or modulo operation was zero.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001924
1925
1926/*
1927 * SystemError extends StandardError
1928 */
1929SimpleExtendsException(PyExc_StandardError, SystemError,
1930 "Internal error in the Python interpreter.\n"
1931 "\n"
1932 "Please report this to the Python maintainer, along with the traceback,\n"
Richard Jones2d555b32006-05-27 16:15:11 +00001933 "the Python version, and the hardware/OS platform and version.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001934
1935
1936/*
1937 * ReferenceError extends StandardError
1938 */
1939SimpleExtendsException(PyExc_StandardError, ReferenceError,
Richard Jones2d555b32006-05-27 16:15:11 +00001940 "Weak ref proxy used after referent went away.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001941
1942
1943/*
1944 * MemoryError extends StandardError
1945 */
Richard Jones2d555b32006-05-27 16:15:11 +00001946SimpleExtendsException(PyExc_StandardError, MemoryError, "Out of memory.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001947
Travis E. Oliphant3781aef2008-03-18 04:44:57 +00001948/*
1949 * BufferError extends StandardError
1950 */
1951SimpleExtendsException(PyExc_StandardError, BufferError, "Buffer error.");
1952
Richard Jones7b9558d2006-05-27 12:29:24 +00001953
1954/* Warning category docstrings */
1955
1956/*
1957 * Warning extends Exception
1958 */
1959SimpleExtendsException(PyExc_Exception, Warning,
Richard Jones2d555b32006-05-27 16:15:11 +00001960 "Base class for warning categories.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001961
1962
1963/*
1964 * UserWarning extends Warning
1965 */
1966SimpleExtendsException(PyExc_Warning, UserWarning,
Richard Jones2d555b32006-05-27 16:15:11 +00001967 "Base class for warnings generated by user code.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001968
1969
1970/*
1971 * DeprecationWarning extends Warning
1972 */
1973SimpleExtendsException(PyExc_Warning, DeprecationWarning,
Richard Jones2d555b32006-05-27 16:15:11 +00001974 "Base class for warnings about deprecated features.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001975
1976
1977/*
1978 * PendingDeprecationWarning extends Warning
1979 */
1980SimpleExtendsException(PyExc_Warning, PendingDeprecationWarning,
1981 "Base class for warnings about features which will be deprecated\n"
Richard Jones2d555b32006-05-27 16:15:11 +00001982 "in the future.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001983
1984
1985/*
1986 * SyntaxWarning extends Warning
1987 */
1988SimpleExtendsException(PyExc_Warning, SyntaxWarning,
Richard Jones2d555b32006-05-27 16:15:11 +00001989 "Base class for warnings about dubious syntax.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001990
1991
1992/*
1993 * RuntimeWarning extends Warning
1994 */
1995SimpleExtendsException(PyExc_Warning, RuntimeWarning,
Richard Jones2d555b32006-05-27 16:15:11 +00001996 "Base class for warnings about dubious runtime behavior.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001997
1998
1999/*
2000 * FutureWarning extends Warning
2001 */
2002SimpleExtendsException(PyExc_Warning, FutureWarning,
2003 "Base class for warnings about constructs that will change semantically\n"
Richard Jones2d555b32006-05-27 16:15:11 +00002004 "in the future.");
Richard Jones7b9558d2006-05-27 12:29:24 +00002005
2006
2007/*
2008 * ImportWarning extends Warning
2009 */
2010SimpleExtendsException(PyExc_Warning, ImportWarning,
Richard Jones2d555b32006-05-27 16:15:11 +00002011 "Base class for warnings about probable mistakes in module imports");
Richard Jones7b9558d2006-05-27 12:29:24 +00002012
2013
Marc-André Lemburg040f76b2006-08-14 10:55:19 +00002014/*
2015 * UnicodeWarning extends Warning
2016 */
2017SimpleExtendsException(PyExc_Warning, UnicodeWarning,
2018 "Base class for warnings about Unicode related problems, mostly\n"
2019 "related to conversion problems.");
2020
Christian Heimes1a6387e2008-03-26 12:49:49 +00002021/*
2022 * BytesWarning extends Warning
2023 */
2024SimpleExtendsException(PyExc_Warning, BytesWarning,
2025 "Base class for warnings about bytes and buffer related problems, mostly\n"
2026 "related to conversion from str or comparing to str.");
Marc-André Lemburg040f76b2006-08-14 10:55:19 +00002027
Richard Jones7b9558d2006-05-27 12:29:24 +00002028/* Pre-computed MemoryError instance. Best to create this as early as
2029 * possible and not wait until a MemoryError is actually raised!
2030 */
2031PyObject *PyExc_MemoryErrorInst=NULL;
2032
Brett Cannon1e534b52007-09-07 04:18:30 +00002033/* Pre-computed RuntimeError instance for when recursion depth is reached.
2034 Meant to be used when normalizing the exception for exceeding the recursion
2035 depth will cause its own infinite recursion.
2036*/
2037PyObject *PyExc_RecursionErrorInst = NULL;
2038
Richard Jones7b9558d2006-05-27 12:29:24 +00002039/* module global functions */
2040static PyMethodDef functions[] = {
2041 /* Sentinel */
2042 {NULL, NULL}
2043};
2044
2045#define PRE_INIT(TYPE) if (PyType_Ready(&_PyExc_ ## TYPE) < 0) \
2046 Py_FatalError("exceptions bootstrapping error.");
2047
2048#define POST_INIT(TYPE) Py_INCREF(PyExc_ ## TYPE); \
2049 PyModule_AddObject(m, # TYPE, PyExc_ ## TYPE); \
2050 if (PyDict_SetItemString(bdict, # TYPE, PyExc_ ## TYPE)) \
2051 Py_FatalError("Module dictionary insertion problem.");
2052
Kristján Valur Jónsson74c3ea02006-07-03 14:59:05 +00002053#if defined _MSC_VER && _MSC_VER >= 1400 && defined(__STDC_SECURE_LIB__)
Kristján Valur Jónssonf6083172006-06-12 15:45:12 +00002054/* crt variable checking in VisualStudio .NET 2005 */
2055#include <crtdbg.h>
2056
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002057static int prevCrtReportMode;
2058static _invalid_parameter_handler prevCrtHandler;
Kristján Valur Jónssonf6083172006-06-12 15:45:12 +00002059
2060/* Invalid parameter handler. Sets a ValueError exception */
2061static void
2062InvalidParameterHandler(
2063 const wchar_t * expression,
2064 const wchar_t * function,
2065 const wchar_t * file,
2066 unsigned int line,
2067 uintptr_t pReserved)
2068{
2069 /* Do nothing, allow execution to continue. Usually this
2070 * means that the CRT will set errno to EINVAL
2071 */
2072}
2073#endif
2074
2075
Richard Jones7b9558d2006-05-27 12:29:24 +00002076PyMODINIT_FUNC
Michael W. Hudson22a80e72006-05-28 15:51:40 +00002077_PyExc_Init(void)
Richard Jones7b9558d2006-05-27 12:29:24 +00002078{
2079 PyObject *m, *bltinmod, *bdict;
2080
2081 PRE_INIT(BaseException)
2082 PRE_INIT(Exception)
2083 PRE_INIT(StandardError)
2084 PRE_INIT(TypeError)
2085 PRE_INIT(StopIteration)
2086 PRE_INIT(GeneratorExit)
2087 PRE_INIT(SystemExit)
2088 PRE_INIT(KeyboardInterrupt)
2089 PRE_INIT(ImportError)
2090 PRE_INIT(EnvironmentError)
2091 PRE_INIT(IOError)
2092 PRE_INIT(OSError)
2093#ifdef MS_WINDOWS
2094 PRE_INIT(WindowsError)
2095#endif
2096#ifdef __VMS
2097 PRE_INIT(VMSError)
2098#endif
2099 PRE_INIT(EOFError)
2100 PRE_INIT(RuntimeError)
2101 PRE_INIT(NotImplementedError)
2102 PRE_INIT(NameError)
2103 PRE_INIT(UnboundLocalError)
2104 PRE_INIT(AttributeError)
2105 PRE_INIT(SyntaxError)
2106 PRE_INIT(IndentationError)
2107 PRE_INIT(TabError)
2108 PRE_INIT(LookupError)
2109 PRE_INIT(IndexError)
2110 PRE_INIT(KeyError)
2111 PRE_INIT(ValueError)
2112 PRE_INIT(UnicodeError)
2113#ifdef Py_USING_UNICODE
2114 PRE_INIT(UnicodeEncodeError)
2115 PRE_INIT(UnicodeDecodeError)
2116 PRE_INIT(UnicodeTranslateError)
2117#endif
2118 PRE_INIT(AssertionError)
2119 PRE_INIT(ArithmeticError)
2120 PRE_INIT(FloatingPointError)
2121 PRE_INIT(OverflowError)
2122 PRE_INIT(ZeroDivisionError)
2123 PRE_INIT(SystemError)
2124 PRE_INIT(ReferenceError)
2125 PRE_INIT(MemoryError)
Benjamin Petersonc0bf76d2008-07-30 17:45:10 +00002126 PRE_INIT(BufferError)
Richard Jones7b9558d2006-05-27 12:29:24 +00002127 PRE_INIT(Warning)
2128 PRE_INIT(UserWarning)
2129 PRE_INIT(DeprecationWarning)
2130 PRE_INIT(PendingDeprecationWarning)
2131 PRE_INIT(SyntaxWarning)
2132 PRE_INIT(RuntimeWarning)
2133 PRE_INIT(FutureWarning)
2134 PRE_INIT(ImportWarning)
Marc-André Lemburg040f76b2006-08-14 10:55:19 +00002135 PRE_INIT(UnicodeWarning)
Christian Heimes1a6387e2008-03-26 12:49:49 +00002136 PRE_INIT(BytesWarning)
Richard Jones7b9558d2006-05-27 12:29:24 +00002137
Richard Jonesc5b2a2e2006-05-27 16:07:28 +00002138 m = Py_InitModule4("exceptions", functions, exceptions_doc,
2139 (PyObject *)NULL, PYTHON_API_VERSION);
Richard Jones7b9558d2006-05-27 12:29:24 +00002140 if (m == NULL) return;
2141
2142 bltinmod = PyImport_ImportModule("__builtin__");
2143 if (bltinmod == NULL)
2144 Py_FatalError("exceptions bootstrapping error.");
2145 bdict = PyModule_GetDict(bltinmod);
2146 if (bdict == NULL)
2147 Py_FatalError("exceptions bootstrapping error.");
2148
2149 POST_INIT(BaseException)
2150 POST_INIT(Exception)
2151 POST_INIT(StandardError)
2152 POST_INIT(TypeError)
2153 POST_INIT(StopIteration)
2154 POST_INIT(GeneratorExit)
2155 POST_INIT(SystemExit)
2156 POST_INIT(KeyboardInterrupt)
2157 POST_INIT(ImportError)
2158 POST_INIT(EnvironmentError)
2159 POST_INIT(IOError)
2160 POST_INIT(OSError)
2161#ifdef MS_WINDOWS
2162 POST_INIT(WindowsError)
2163#endif
2164#ifdef __VMS
2165 POST_INIT(VMSError)
2166#endif
2167 POST_INIT(EOFError)
2168 POST_INIT(RuntimeError)
2169 POST_INIT(NotImplementedError)
2170 POST_INIT(NameError)
2171 POST_INIT(UnboundLocalError)
2172 POST_INIT(AttributeError)
2173 POST_INIT(SyntaxError)
2174 POST_INIT(IndentationError)
2175 POST_INIT(TabError)
2176 POST_INIT(LookupError)
2177 POST_INIT(IndexError)
2178 POST_INIT(KeyError)
2179 POST_INIT(ValueError)
2180 POST_INIT(UnicodeError)
2181#ifdef Py_USING_UNICODE
2182 POST_INIT(UnicodeEncodeError)
2183 POST_INIT(UnicodeDecodeError)
2184 POST_INIT(UnicodeTranslateError)
2185#endif
2186 POST_INIT(AssertionError)
2187 POST_INIT(ArithmeticError)
2188 POST_INIT(FloatingPointError)
2189 POST_INIT(OverflowError)
2190 POST_INIT(ZeroDivisionError)
2191 POST_INIT(SystemError)
2192 POST_INIT(ReferenceError)
2193 POST_INIT(MemoryError)
Benjamin Petersonc0bf76d2008-07-30 17:45:10 +00002194 POST_INIT(BufferError)
Richard Jones7b9558d2006-05-27 12:29:24 +00002195 POST_INIT(Warning)
2196 POST_INIT(UserWarning)
2197 POST_INIT(DeprecationWarning)
2198 POST_INIT(PendingDeprecationWarning)
2199 POST_INIT(SyntaxWarning)
2200 POST_INIT(RuntimeWarning)
2201 POST_INIT(FutureWarning)
2202 POST_INIT(ImportWarning)
Marc-André Lemburg040f76b2006-08-14 10:55:19 +00002203 POST_INIT(UnicodeWarning)
Christian Heimes1a6387e2008-03-26 12:49:49 +00002204 POST_INIT(BytesWarning)
Richard Jones7b9558d2006-05-27 12:29:24 +00002205
2206 PyExc_MemoryErrorInst = BaseException_new(&_PyExc_MemoryError, NULL, NULL);
2207 if (!PyExc_MemoryErrorInst)
2208 Py_FatalError("Cannot pre-allocate MemoryError instance\n");
2209
Brett Cannon1e534b52007-09-07 04:18:30 +00002210 PyExc_RecursionErrorInst = BaseException_new(&_PyExc_RuntimeError, NULL, NULL);
2211 if (!PyExc_RecursionErrorInst)
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002212 Py_FatalError("Cannot pre-allocate RuntimeError instance for "
2213 "recursion errors");
Brett Cannon1e534b52007-09-07 04:18:30 +00002214 else {
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00002215 PyBaseExceptionObject *err_inst =
2216 (PyBaseExceptionObject *)PyExc_RecursionErrorInst;
2217 PyObject *args_tuple;
2218 PyObject *exc_message;
2219 exc_message = PyString_FromString("maximum recursion depth exceeded");
2220 if (!exc_message)
2221 Py_FatalError("cannot allocate argument for RuntimeError "
2222 "pre-allocation");
2223 args_tuple = PyTuple_Pack(1, exc_message);
2224 if (!args_tuple)
2225 Py_FatalError("cannot allocate tuple for RuntimeError "
2226 "pre-allocation");
2227 Py_DECREF(exc_message);
2228 if (BaseException_init(err_inst, args_tuple, NULL))
2229 Py_FatalError("init of pre-allocated RuntimeError failed");
2230 Py_DECREF(args_tuple);
Brett Cannon1e534b52007-09-07 04:18:30 +00002231 }
2232
Richard Jones7b9558d2006-05-27 12:29:24 +00002233 Py_DECREF(bltinmod);
Kristján Valur Jónssonf6083172006-06-12 15:45:12 +00002234
Kristján Valur Jónsson74c3ea02006-07-03 14:59:05 +00002235#if defined _MSC_VER && _MSC_VER >= 1400 && defined(__STDC_SECURE_LIB__)
Kristján Valur Jónssonf6083172006-06-12 15:45:12 +00002236 /* Set CRT argument error handler */
2237 prevCrtHandler = _set_invalid_parameter_handler(InvalidParameterHandler);
2238 /* turn off assertions in debug mode */
2239 prevCrtReportMode = _CrtSetReportMode(_CRT_ASSERT, 0);
2240#endif
Richard Jones7b9558d2006-05-27 12:29:24 +00002241}
2242
2243void
2244_PyExc_Fini(void)
2245{
2246 Py_XDECREF(PyExc_MemoryErrorInst);
2247 PyExc_MemoryErrorInst = NULL;
Kristján Valur Jónsson74c3ea02006-07-03 14:59:05 +00002248#if defined _MSC_VER && _MSC_VER >= 1400 && defined(__STDC_SECURE_LIB__)
Kristján Valur Jónssonf6083172006-06-12 15:45:12 +00002249 /* reset CRT error handling */
2250 _set_invalid_parameter_handler(prevCrtHandler);
2251 _CrtSetReportMode(_CRT_ASSERT, prevCrtReportMode);
2252#endif
Richard Jones7b9558d2006-05-27 12:29:24 +00002253}