blob: 4a9eba1e469b840d3238a6b83cd23d97faa956f0 [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
Michael W. Hudson22a80e72006-05-28 15:51:40 +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:
107 out = PyString_FromString("");
108 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
120static PyObject *
121BaseException_repr(PyBaseExceptionObject *self)
122{
Richard Jones7b9558d2006-05-27 12:29:24 +0000123 PyObject *repr_suffix;
124 PyObject *repr;
125 char *name;
126 char *dot;
127
Michael W. Hudson22a80e72006-05-28 15:51:40 +0000128 repr_suffix = PyObject_Repr(self->args);
129 if (!repr_suffix)
Richard Jones7b9558d2006-05-27 12:29:24 +0000130 return NULL;
Richard Jones7b9558d2006-05-27 12:29:24 +0000131
Christian Heimese93237d2007-12-19 02:37:44 +0000132 name = (char *)Py_TYPE(self)->tp_name;
Richard Jones7b9558d2006-05-27 12:29:24 +0000133 dot = strrchr(name, '.');
134 if (dot != NULL) name = dot+1;
135
136 repr = PyString_FromString(name);
137 if (!repr) {
138 Py_DECREF(repr_suffix);
139 return NULL;
140 }
141
142 PyString_ConcatAndDel(&repr, repr_suffix);
143 return repr;
144}
145
146/* Pickling support */
147static PyObject *
148BaseException_reduce(PyBaseExceptionObject *self)
149{
Georg Brandlddba4732006-05-30 07:04:55 +0000150 if (self->args && self->dict)
Christian Heimese93237d2007-12-19 02:37:44 +0000151 return PyTuple_Pack(3, Py_TYPE(self), self->args, self->dict);
Georg Brandl05f97bf2006-05-30 07:13:29 +0000152 else
Christian Heimese93237d2007-12-19 02:37:44 +0000153 return PyTuple_Pack(2, Py_TYPE(self), self->args);
Richard Jones7b9558d2006-05-27 12:29:24 +0000154}
155
Georg Brandl85ac8502006-06-01 06:39:19 +0000156/*
157 * Needed for backward compatibility, since exceptions used to store
158 * all their attributes in the __dict__. Code is taken from cPickle's
159 * load_build function.
160 */
161static PyObject *
162BaseException_setstate(PyObject *self, PyObject *state)
163{
164 PyObject *d_key, *d_value;
165 Py_ssize_t i = 0;
166
167 if (state != Py_None) {
168 if (!PyDict_Check(state)) {
169 PyErr_SetString(PyExc_TypeError, "state is not a dictionary");
170 return NULL;
171 }
172 while (PyDict_Next(state, &i, &d_key, &d_value)) {
173 if (PyObject_SetAttr(self, d_key, d_value) < 0)
174 return NULL;
175 }
176 }
177 Py_RETURN_NONE;
178}
Richard Jones7b9558d2006-05-27 12:29:24 +0000179
Richard Jones7b9558d2006-05-27 12:29:24 +0000180
181static PyMethodDef BaseException_methods[] = {
182 {"__reduce__", (PyCFunction)BaseException_reduce, METH_NOARGS },
Georg Brandl85ac8502006-06-01 06:39:19 +0000183 {"__setstate__", (PyCFunction)BaseException_setstate, METH_O },
Richard Jones7b9558d2006-05-27 12:29:24 +0000184 {NULL, NULL, 0, NULL},
185};
186
187
188
189static PyObject *
190BaseException_getitem(PyBaseExceptionObject *self, Py_ssize_t index)
191{
Benjamin Peterson9f4f4812008-04-27 03:01:45 +0000192 if (PyErr_WarnPy3k("__getitem__ not supported for exception "
193 "classes in 3.x; use args attribute", 1) < 0)
194 return NULL;
Richard Jones7b9558d2006-05-27 12:29:24 +0000195 return PySequence_GetItem(self->args, index);
196}
197
Brett Cannonf6aa86e2006-09-20 18:43:13 +0000198static PyObject *
199BaseException_getslice(PyBaseExceptionObject *self,
200 Py_ssize_t start, Py_ssize_t stop)
201{
Benjamin Peterson9f4f4812008-04-27 03:01:45 +0000202 if (PyErr_WarnPy3k("__getslice__ not supported for exception "
203 "classes in 3.x; use args attribute", 1) < 0)
204 return NULL;
Brett Cannonf6aa86e2006-09-20 18:43:13 +0000205 return PySequence_GetSlice(self->args, start, stop);
206}
207
Richard Jones7b9558d2006-05-27 12:29:24 +0000208static PySequenceMethods BaseException_as_sequence = {
209 0, /* sq_length; */
210 0, /* sq_concat; */
211 0, /* sq_repeat; */
212 (ssizeargfunc)BaseException_getitem, /* sq_item; */
Brett Cannonf6aa86e2006-09-20 18:43:13 +0000213 (ssizessizeargfunc)BaseException_getslice, /* sq_slice; */
Richard Jones7b9558d2006-05-27 12:29:24 +0000214 0, /* sq_ass_item; */
215 0, /* sq_ass_slice; */
216 0, /* sq_contains; */
217 0, /* sq_inplace_concat; */
218 0 /* sq_inplace_repeat; */
219};
220
Richard Jones7b9558d2006-05-27 12:29:24 +0000221static PyObject *
222BaseException_get_dict(PyBaseExceptionObject *self)
223{
224 if (self->dict == NULL) {
225 self->dict = PyDict_New();
226 if (!self->dict)
227 return NULL;
228 }
229 Py_INCREF(self->dict);
230 return self->dict;
231}
232
233static int
234BaseException_set_dict(PyBaseExceptionObject *self, PyObject *val)
235{
236 if (val == NULL) {
237 PyErr_SetString(PyExc_TypeError, "__dict__ may not be deleted");
238 return -1;
239 }
240 if (!PyDict_Check(val)) {
241 PyErr_SetString(PyExc_TypeError, "__dict__ must be a dictionary");
242 return -1;
243 }
244 Py_CLEAR(self->dict);
245 Py_INCREF(val);
246 self->dict = val;
247 return 0;
248}
249
250static PyObject *
251BaseException_get_args(PyBaseExceptionObject *self)
252{
253 if (self->args == NULL) {
254 Py_INCREF(Py_None);
255 return Py_None;
256 }
257 Py_INCREF(self->args);
258 return self->args;
259}
260
261static int
262BaseException_set_args(PyBaseExceptionObject *self, PyObject *val)
263{
264 PyObject *seq;
265 if (val == NULL) {
266 PyErr_SetString(PyExc_TypeError, "args may not be deleted");
267 return -1;
268 }
269 seq = PySequence_Tuple(val);
270 if (!seq) return -1;
Georg Brandlc7c51142006-05-29 09:46:51 +0000271 Py_CLEAR(self->args);
Richard Jones7b9558d2006-05-27 12:29:24 +0000272 self->args = seq;
273 return 0;
274}
275
Brett Cannon229cee22007-05-05 01:34:02 +0000276static PyObject *
277BaseException_get_message(PyBaseExceptionObject *self)
278{
279 int ret;
280 ret = PyErr_WarnEx(PyExc_DeprecationWarning,
281 "BaseException.message has been deprecated as "
282 "of Python 2.6",
283 1);
284 if (ret == -1)
285 return NULL;
286
287 Py_INCREF(self->message);
288 return self->message;
289}
290
291static int
292BaseException_set_message(PyBaseExceptionObject *self, PyObject *val)
293{
294 int ret;
295 ret = PyErr_WarnEx(PyExc_DeprecationWarning,
296 "BaseException.message has been deprecated as "
297 "of Python 2.6",
298 1);
299 if (ret == -1)
300 return -1;
301 Py_INCREF(val);
302 Py_DECREF(self->message);
303 self->message = val;
304 return 0;
305}
306
Richard Jones7b9558d2006-05-27 12:29:24 +0000307static PyGetSetDef BaseException_getset[] = {
308 {"__dict__", (getter)BaseException_get_dict, (setter)BaseException_set_dict},
309 {"args", (getter)BaseException_get_args, (setter)BaseException_set_args},
Brett Cannon229cee22007-05-05 01:34:02 +0000310 {"message", (getter)BaseException_get_message,
311 (setter)BaseException_set_message},
Richard Jones7b9558d2006-05-27 12:29:24 +0000312 {NULL},
313};
314
315
316static PyTypeObject _PyExc_BaseException = {
317 PyObject_HEAD_INIT(NULL)
318 0, /*ob_size*/
319 EXC_MODULE_NAME "BaseException", /*tp_name*/
320 sizeof(PyBaseExceptionObject), /*tp_basicsize*/
321 0, /*tp_itemsize*/
322 (destructor)BaseException_dealloc, /*tp_dealloc*/
323 0, /*tp_print*/
324 0, /*tp_getattr*/
325 0, /*tp_setattr*/
326 0, /* tp_compare; */
327 (reprfunc)BaseException_repr, /*tp_repr*/
328 0, /*tp_as_number*/
329 &BaseException_as_sequence, /*tp_as_sequence*/
330 0, /*tp_as_mapping*/
331 0, /*tp_hash */
332 0, /*tp_call*/
333 (reprfunc)BaseException_str, /*tp_str*/
334 PyObject_GenericGetAttr, /*tp_getattro*/
335 PyObject_GenericSetAttr, /*tp_setattro*/
336 0, /*tp_as_buffer*/
Neal Norwitzee3a1b52007-02-25 19:44:48 +0000337 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC |
338 Py_TPFLAGS_BASE_EXC_SUBCLASS, /*tp_flags*/
Richard Jones7b9558d2006-05-27 12:29:24 +0000339 PyDoc_STR("Common base class for all exceptions"), /* tp_doc */
340 (traverseproc)BaseException_traverse, /* tp_traverse */
341 (inquiry)BaseException_clear, /* tp_clear */
342 0, /* tp_richcompare */
343 0, /* tp_weaklistoffset */
344 0, /* tp_iter */
345 0, /* tp_iternext */
346 BaseException_methods, /* tp_methods */
Brett Cannon229cee22007-05-05 01:34:02 +0000347 0, /* tp_members */
Richard Jones7b9558d2006-05-27 12:29:24 +0000348 BaseException_getset, /* tp_getset */
349 0, /* tp_base */
350 0, /* tp_dict */
351 0, /* tp_descr_get */
352 0, /* tp_descr_set */
353 offsetof(PyBaseExceptionObject, dict), /* tp_dictoffset */
354 (initproc)BaseException_init, /* tp_init */
355 0, /* tp_alloc */
356 BaseException_new, /* tp_new */
357};
358/* the CPython API expects exceptions to be (PyObject *) - both a hold-over
359from the previous implmentation and also allowing Python objects to be used
360in the API */
361PyObject *PyExc_BaseException = (PyObject *)&_PyExc_BaseException;
362
Richard Jones2d555b32006-05-27 16:15:11 +0000363/* note these macros omit the last semicolon so the macro invocation may
364 * include it and not look strange.
365 */
Richard Jones7b9558d2006-05-27 12:29:24 +0000366#define SimpleExtendsException(EXCBASE, EXCNAME, EXCDOC) \
367static PyTypeObject _PyExc_ ## EXCNAME = { \
368 PyObject_HEAD_INIT(NULL) \
369 0, \
370 EXC_MODULE_NAME # EXCNAME, \
371 sizeof(PyBaseExceptionObject), \
372 0, (destructor)BaseException_dealloc, 0, 0, 0, 0, 0, 0, 0, \
373 0, 0, 0, 0, 0, 0, 0, \
374 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
375 PyDoc_STR(EXCDOC), (traverseproc)BaseException_traverse, \
376 (inquiry)BaseException_clear, 0, 0, 0, 0, 0, 0, 0, &_ ## EXCBASE, \
377 0, 0, 0, offsetof(PyBaseExceptionObject, dict), \
378 (initproc)BaseException_init, 0, BaseException_new,\
379}; \
Richard Jones2d555b32006-05-27 16:15:11 +0000380PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
Richard Jones7b9558d2006-05-27 12:29:24 +0000381
382#define MiddlingExtendsException(EXCBASE, EXCNAME, EXCSTORE, EXCDOC) \
383static PyTypeObject _PyExc_ ## EXCNAME = { \
384 PyObject_HEAD_INIT(NULL) \
385 0, \
386 EXC_MODULE_NAME # EXCNAME, \
387 sizeof(Py ## EXCSTORE ## Object), \
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000388 0, (destructor)EXCSTORE ## _dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
Richard Jones7b9558d2006-05-27 12:29:24 +0000389 0, 0, 0, 0, 0, \
390 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000391 PyDoc_STR(EXCDOC), (traverseproc)EXCSTORE ## _traverse, \
392 (inquiry)EXCSTORE ## _clear, 0, 0, 0, 0, 0, 0, 0, &_ ## EXCBASE, \
Richard Jones7b9558d2006-05-27 12:29:24 +0000393 0, 0, 0, offsetof(Py ## EXCSTORE ## Object, dict), \
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000394 (initproc)EXCSTORE ## _init, 0, BaseException_new,\
Richard Jones7b9558d2006-05-27 12:29:24 +0000395}; \
Richard Jones2d555b32006-05-27 16:15:11 +0000396PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
Richard Jones7b9558d2006-05-27 12:29:24 +0000397
398#define ComplexExtendsException(EXCBASE, EXCNAME, EXCSTORE, EXCDEALLOC, EXCMETHODS, EXCMEMBERS, EXCSTR, EXCDOC) \
399static PyTypeObject _PyExc_ ## EXCNAME = { \
400 PyObject_HEAD_INIT(NULL) \
401 0, \
402 EXC_MODULE_NAME # EXCNAME, \
403 sizeof(Py ## EXCSTORE ## Object), 0, \
404 (destructor)EXCSTORE ## _dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
405 (reprfunc)EXCSTR, 0, 0, 0, \
406 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
407 PyDoc_STR(EXCDOC), (traverseproc)EXCSTORE ## _traverse, \
408 (inquiry)EXCSTORE ## _clear, 0, 0, 0, 0, EXCMETHODS, \
409 EXCMEMBERS, 0, &_ ## EXCBASE, \
410 0, 0, 0, offsetof(Py ## EXCSTORE ## Object, dict), \
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000411 (initproc)EXCSTORE ## _init, 0, BaseException_new,\
Richard Jones7b9558d2006-05-27 12:29:24 +0000412}; \
Richard Jones2d555b32006-05-27 16:15:11 +0000413PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
Richard Jones7b9558d2006-05-27 12:29:24 +0000414
415
416/*
417 * Exception extends BaseException
418 */
419SimpleExtendsException(PyExc_BaseException, Exception,
Richard Jones2d555b32006-05-27 16:15:11 +0000420 "Common base class for all non-exit exceptions.");
Richard Jones7b9558d2006-05-27 12:29:24 +0000421
422
423/*
424 * StandardError extends Exception
425 */
Michael W. Hudson22a80e72006-05-28 15:51:40 +0000426SimpleExtendsException(PyExc_Exception, StandardError,
Richard Jones7b9558d2006-05-27 12:29:24 +0000427 "Base class for all standard Python exceptions that do not represent\n"
Richard Jones2d555b32006-05-27 16:15:11 +0000428 "interpreter exiting.");
Richard Jones7b9558d2006-05-27 12:29:24 +0000429
430
431/*
432 * TypeError extends StandardError
433 */
434SimpleExtendsException(PyExc_StandardError, TypeError,
Richard Jones2d555b32006-05-27 16:15:11 +0000435 "Inappropriate argument type.");
Richard Jones7b9558d2006-05-27 12:29:24 +0000436
437
438/*
439 * StopIteration extends Exception
440 */
441SimpleExtendsException(PyExc_Exception, StopIteration,
Richard Jones2d555b32006-05-27 16:15:11 +0000442 "Signal the end from iterator.next().");
Richard Jones7b9558d2006-05-27 12:29:24 +0000443
444
445/*
Christian Heimes44eeaec2007-12-03 20:01:02 +0000446 * GeneratorExit extends BaseException
Richard Jones7b9558d2006-05-27 12:29:24 +0000447 */
Christian Heimes44eeaec2007-12-03 20:01:02 +0000448SimpleExtendsException(PyExc_BaseException, GeneratorExit,
Richard Jones2d555b32006-05-27 16:15:11 +0000449 "Request that a generator exit.");
Richard Jones7b9558d2006-05-27 12:29:24 +0000450
451
452/*
453 * SystemExit extends BaseException
454 */
Richard Jones7b9558d2006-05-27 12:29:24 +0000455
456static int
457SystemExit_init(PySystemExitObject *self, PyObject *args, PyObject *kwds)
458{
459 Py_ssize_t size = PyTuple_GET_SIZE(args);
460
461 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
462 return -1;
463
Michael W. Hudson22a80e72006-05-28 15:51:40 +0000464 if (size == 0)
465 return 0;
466 Py_CLEAR(self->code);
Richard Jones7b9558d2006-05-27 12:29:24 +0000467 if (size == 1)
468 self->code = PyTuple_GET_ITEM(args, 0);
469 else if (size > 1)
470 self->code = args;
471 Py_INCREF(self->code);
472 return 0;
473}
474
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000475static int
Richard Jones7b9558d2006-05-27 12:29:24 +0000476SystemExit_clear(PySystemExitObject *self)
477{
478 Py_CLEAR(self->code);
479 return BaseException_clear((PyBaseExceptionObject *)self);
480}
481
482static void
483SystemExit_dealloc(PySystemExitObject *self)
484{
Georg Brandl38f62372006-09-06 06:50:05 +0000485 _PyObject_GC_UNTRACK(self);
Richard Jones7b9558d2006-05-27 12:29:24 +0000486 SystemExit_clear(self);
Christian Heimese93237d2007-12-19 02:37:44 +0000487 Py_TYPE(self)->tp_free((PyObject *)self);
Richard Jones7b9558d2006-05-27 12:29:24 +0000488}
489
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000490static int
Richard Jones7b9558d2006-05-27 12:29:24 +0000491SystemExit_traverse(PySystemExitObject *self, visitproc visit, void *arg)
492{
493 Py_VISIT(self->code);
494 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
495}
496
497static PyMemberDef SystemExit_members[] = {
Richard Jones7b9558d2006-05-27 12:29:24 +0000498 {"code", T_OBJECT, offsetof(PySystemExitObject, code), 0,
499 PyDoc_STR("exception code")},
500 {NULL} /* Sentinel */
501};
502
503ComplexExtendsException(PyExc_BaseException, SystemExit, SystemExit,
504 SystemExit_dealloc, 0, SystemExit_members, 0,
Richard Jones2d555b32006-05-27 16:15:11 +0000505 "Request to exit from the interpreter.");
Richard Jones7b9558d2006-05-27 12:29:24 +0000506
507/*
508 * KeyboardInterrupt extends BaseException
509 */
510SimpleExtendsException(PyExc_BaseException, KeyboardInterrupt,
Richard Jones2d555b32006-05-27 16:15:11 +0000511 "Program interrupted by user.");
Richard Jones7b9558d2006-05-27 12:29:24 +0000512
513
514/*
515 * ImportError extends StandardError
516 */
517SimpleExtendsException(PyExc_StandardError, ImportError,
Richard Jones2d555b32006-05-27 16:15:11 +0000518 "Import can't find module, or can't find name in module.");
Richard Jones7b9558d2006-05-27 12:29:24 +0000519
520
521/*
522 * EnvironmentError extends StandardError
523 */
524
Richard Jones7b9558d2006-05-27 12:29:24 +0000525/* Where a function has a single filename, such as open() or some
526 * of the os module functions, PyErr_SetFromErrnoWithFilename() is
527 * called, giving a third argument which is the filename. But, so
528 * that old code using in-place unpacking doesn't break, e.g.:
529 *
530 * except IOError, (errno, strerror):
531 *
532 * we hack args so that it only contains two items. This also
533 * means we need our own __str__() which prints out the filename
534 * when it was supplied.
535 */
536static int
537EnvironmentError_init(PyEnvironmentErrorObject *self, PyObject *args,
538 PyObject *kwds)
539{
540 PyObject *myerrno = NULL, *strerror = NULL, *filename = NULL;
541 PyObject *subslice = NULL;
542
543 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
544 return -1;
545
Georg Brandl3267d282006-09-30 09:03:42 +0000546 if (PyTuple_GET_SIZE(args) <= 1 || PyTuple_GET_SIZE(args) > 3) {
Richard Jones7b9558d2006-05-27 12:29:24 +0000547 return 0;
548 }
Michael W. Hudson22a80e72006-05-28 15:51:40 +0000549
550 if (!PyArg_UnpackTuple(args, "EnvironmentError", 2, 3,
Richard Jones7b9558d2006-05-27 12:29:24 +0000551 &myerrno, &strerror, &filename)) {
552 return -1;
553 }
Michael W. Hudson22a80e72006-05-28 15:51:40 +0000554 Py_CLEAR(self->myerrno); /* replacing */
Richard Jones7b9558d2006-05-27 12:29:24 +0000555 self->myerrno = myerrno;
556 Py_INCREF(self->myerrno);
557
Michael W. Hudson22a80e72006-05-28 15:51:40 +0000558 Py_CLEAR(self->strerror); /* replacing */
Richard Jones7b9558d2006-05-27 12:29:24 +0000559 self->strerror = strerror;
560 Py_INCREF(self->strerror);
561
562 /* self->filename will remain Py_None otherwise */
563 if (filename != NULL) {
Michael W. Hudson22a80e72006-05-28 15:51:40 +0000564 Py_CLEAR(self->filename); /* replacing */
Richard Jones7b9558d2006-05-27 12:29:24 +0000565 self->filename = filename;
566 Py_INCREF(self->filename);
567
568 subslice = PyTuple_GetSlice(args, 0, 2);
569 if (!subslice)
570 return -1;
571
572 Py_DECREF(self->args); /* replacing args */
573 self->args = subslice;
574 }
575 return 0;
576}
577
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000578static int
Richard Jones7b9558d2006-05-27 12:29:24 +0000579EnvironmentError_clear(PyEnvironmentErrorObject *self)
580{
581 Py_CLEAR(self->myerrno);
582 Py_CLEAR(self->strerror);
583 Py_CLEAR(self->filename);
584 return BaseException_clear((PyBaseExceptionObject *)self);
585}
586
587static void
588EnvironmentError_dealloc(PyEnvironmentErrorObject *self)
589{
Georg Brandl38f62372006-09-06 06:50:05 +0000590 _PyObject_GC_UNTRACK(self);
Richard Jones7b9558d2006-05-27 12:29:24 +0000591 EnvironmentError_clear(self);
Christian Heimese93237d2007-12-19 02:37:44 +0000592 Py_TYPE(self)->tp_free((PyObject *)self);
Richard Jones7b9558d2006-05-27 12:29:24 +0000593}
594
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000595static int
Richard Jones7b9558d2006-05-27 12:29:24 +0000596EnvironmentError_traverse(PyEnvironmentErrorObject *self, visitproc visit,
597 void *arg)
598{
599 Py_VISIT(self->myerrno);
600 Py_VISIT(self->strerror);
601 Py_VISIT(self->filename);
602 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
603}
604
605static PyObject *
606EnvironmentError_str(PyEnvironmentErrorObject *self)
607{
608 PyObject *rtnval = NULL;
609
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000610 if (self->filename) {
611 PyObject *fmt;
612 PyObject *repr;
613 PyObject *tuple;
Richard Jones7b9558d2006-05-27 12:29:24 +0000614
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000615 fmt = PyString_FromString("[Errno %s] %s: %s");
616 if (!fmt)
617 return NULL;
618
619 repr = PyObject_Repr(self->filename);
620 if (!repr) {
621 Py_DECREF(fmt);
Richard Jones7b9558d2006-05-27 12:29:24 +0000622 return NULL;
623 }
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000624 tuple = PyTuple_New(3);
625 if (!tuple) {
626 Py_DECREF(repr);
627 Py_DECREF(fmt);
628 return NULL;
629 }
630
631 if (self->myerrno) {
632 Py_INCREF(self->myerrno);
633 PyTuple_SET_ITEM(tuple, 0, self->myerrno);
634 }
635 else {
636 Py_INCREF(Py_None);
637 PyTuple_SET_ITEM(tuple, 0, Py_None);
638 }
639 if (self->strerror) {
640 Py_INCREF(self->strerror);
641 PyTuple_SET_ITEM(tuple, 1, self->strerror);
642 }
643 else {
644 Py_INCREF(Py_None);
645 PyTuple_SET_ITEM(tuple, 1, Py_None);
646 }
647
Richard Jones7b9558d2006-05-27 12:29:24 +0000648 PyTuple_SET_ITEM(tuple, 2, repr);
649
650 rtnval = PyString_Format(fmt, tuple);
651
652 Py_DECREF(fmt);
653 Py_DECREF(tuple);
654 }
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000655 else if (self->myerrno && self->strerror) {
656 PyObject *fmt;
657 PyObject *tuple;
Richard Jones7b9558d2006-05-27 12:29:24 +0000658
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000659 fmt = PyString_FromString("[Errno %s] %s");
660 if (!fmt)
661 return NULL;
662
663 tuple = PyTuple_New(2);
664 if (!tuple) {
665 Py_DECREF(fmt);
Richard Jones7b9558d2006-05-27 12:29:24 +0000666 return NULL;
667 }
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000668
669 if (self->myerrno) {
670 Py_INCREF(self->myerrno);
671 PyTuple_SET_ITEM(tuple, 0, self->myerrno);
672 }
673 else {
674 Py_INCREF(Py_None);
675 PyTuple_SET_ITEM(tuple, 0, Py_None);
676 }
677 if (self->strerror) {
678 Py_INCREF(self->strerror);
679 PyTuple_SET_ITEM(tuple, 1, self->strerror);
680 }
681 else {
682 Py_INCREF(Py_None);
683 PyTuple_SET_ITEM(tuple, 1, Py_None);
684 }
Richard Jones7b9558d2006-05-27 12:29:24 +0000685
686 rtnval = PyString_Format(fmt, tuple);
687
688 Py_DECREF(fmt);
689 Py_DECREF(tuple);
690 }
691 else
692 rtnval = BaseException_str((PyBaseExceptionObject *)self);
693
694 return rtnval;
695}
696
697static PyMemberDef EnvironmentError_members[] = {
Richard Jones7b9558d2006-05-27 12:29:24 +0000698 {"errno", T_OBJECT, offsetof(PyEnvironmentErrorObject, myerrno), 0,
Richard Jonesc5b2a2e2006-05-27 16:07:28 +0000699 PyDoc_STR("exception errno")},
Richard Jones7b9558d2006-05-27 12:29:24 +0000700 {"strerror", T_OBJECT, offsetof(PyEnvironmentErrorObject, strerror), 0,
Richard Jonesc5b2a2e2006-05-27 16:07:28 +0000701 PyDoc_STR("exception strerror")},
Richard Jones7b9558d2006-05-27 12:29:24 +0000702 {"filename", T_OBJECT, offsetof(PyEnvironmentErrorObject, filename), 0,
Richard Jonesc5b2a2e2006-05-27 16:07:28 +0000703 PyDoc_STR("exception filename")},
Richard Jones7b9558d2006-05-27 12:29:24 +0000704 {NULL} /* Sentinel */
705};
706
707
708static PyObject *
709EnvironmentError_reduce(PyEnvironmentErrorObject *self)
710{
711 PyObject *args = self->args;
712 PyObject *res = NULL, *tmp;
Georg Brandl05f97bf2006-05-30 07:13:29 +0000713
Richard Jones7b9558d2006-05-27 12:29:24 +0000714 /* self->args is only the first two real arguments if there was a
715 * file name given to EnvironmentError. */
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000716 if (PyTuple_GET_SIZE(args) == 2 && self->filename) {
Richard Jones7b9558d2006-05-27 12:29:24 +0000717 args = PyTuple_New(3);
718 if (!args) return NULL;
Michael W. Hudson22a80e72006-05-28 15:51:40 +0000719
720 tmp = PyTuple_GET_ITEM(self->args, 0);
Richard Jones7b9558d2006-05-27 12:29:24 +0000721 Py_INCREF(tmp);
722 PyTuple_SET_ITEM(args, 0, tmp);
Michael W. Hudson22a80e72006-05-28 15:51:40 +0000723
724 tmp = PyTuple_GET_ITEM(self->args, 1);
Richard Jones7b9558d2006-05-27 12:29:24 +0000725 Py_INCREF(tmp);
726 PyTuple_SET_ITEM(args, 1, tmp);
727
728 Py_INCREF(self->filename);
729 PyTuple_SET_ITEM(args, 2, self->filename);
Georg Brandl05f97bf2006-05-30 07:13:29 +0000730 } else
Richard Jones7b9558d2006-05-27 12:29:24 +0000731 Py_INCREF(args);
Georg Brandl05f97bf2006-05-30 07:13:29 +0000732
733 if (self->dict)
Christian Heimese93237d2007-12-19 02:37:44 +0000734 res = PyTuple_Pack(3, Py_TYPE(self), args, self->dict);
Georg Brandl05f97bf2006-05-30 07:13:29 +0000735 else
Christian Heimese93237d2007-12-19 02:37:44 +0000736 res = PyTuple_Pack(2, Py_TYPE(self), args);
Richard Jones7b9558d2006-05-27 12:29:24 +0000737 Py_DECREF(args);
738 return res;
739}
740
741
742static PyMethodDef EnvironmentError_methods[] = {
743 {"__reduce__", (PyCFunction)EnvironmentError_reduce, METH_NOARGS},
744 {NULL}
745};
746
747ComplexExtendsException(PyExc_StandardError, EnvironmentError,
748 EnvironmentError, EnvironmentError_dealloc,
749 EnvironmentError_methods, EnvironmentError_members,
Michael W. Hudson22a80e72006-05-28 15:51:40 +0000750 EnvironmentError_str,
Richard Jones2d555b32006-05-27 16:15:11 +0000751 "Base class for I/O related errors.");
Richard Jones7b9558d2006-05-27 12:29:24 +0000752
753
754/*
755 * IOError extends EnvironmentError
756 */
Michael W. Hudson22a80e72006-05-28 15:51:40 +0000757MiddlingExtendsException(PyExc_EnvironmentError, IOError,
Richard Jones2d555b32006-05-27 16:15:11 +0000758 EnvironmentError, "I/O operation failed.");
Richard Jones7b9558d2006-05-27 12:29:24 +0000759
760
761/*
762 * OSError extends EnvironmentError
763 */
764MiddlingExtendsException(PyExc_EnvironmentError, OSError,
Richard Jones2d555b32006-05-27 16:15:11 +0000765 EnvironmentError, "OS system call failed.");
Richard Jones7b9558d2006-05-27 12:29:24 +0000766
767
768/*
769 * WindowsError extends OSError
770 */
771#ifdef MS_WINDOWS
772#include "errmap.h"
773
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000774static int
Richard Jones7b9558d2006-05-27 12:29:24 +0000775WindowsError_clear(PyWindowsErrorObject *self)
776{
777 Py_CLEAR(self->myerrno);
778 Py_CLEAR(self->strerror);
779 Py_CLEAR(self->filename);
780 Py_CLEAR(self->winerror);
781 return BaseException_clear((PyBaseExceptionObject *)self);
782}
783
784static void
785WindowsError_dealloc(PyWindowsErrorObject *self)
786{
Georg Brandl38f62372006-09-06 06:50:05 +0000787 _PyObject_GC_UNTRACK(self);
Richard Jones7b9558d2006-05-27 12:29:24 +0000788 WindowsError_clear(self);
Christian Heimese93237d2007-12-19 02:37:44 +0000789 Py_TYPE(self)->tp_free((PyObject *)self);
Richard Jones7b9558d2006-05-27 12:29:24 +0000790}
791
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000792static int
Richard Jones7b9558d2006-05-27 12:29:24 +0000793WindowsError_traverse(PyWindowsErrorObject *self, visitproc visit, void *arg)
794{
795 Py_VISIT(self->myerrno);
796 Py_VISIT(self->strerror);
797 Py_VISIT(self->filename);
798 Py_VISIT(self->winerror);
799 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
800}
801
Richard Jones7b9558d2006-05-27 12:29:24 +0000802static int
803WindowsError_init(PyWindowsErrorObject *self, PyObject *args, PyObject *kwds)
804{
805 PyObject *o_errcode = NULL;
806 long errcode;
807 long posix_errno;
808
809 if (EnvironmentError_init((PyEnvironmentErrorObject *)self, args, kwds)
810 == -1)
811 return -1;
812
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000813 if (self->myerrno == NULL)
Richard Jones7b9558d2006-05-27 12:29:24 +0000814 return 0;
Richard Jones7b9558d2006-05-27 12:29:24 +0000815
816 /* Set errno to the POSIX errno, and winerror to the Win32
817 error code. */
818 errcode = PyInt_AsLong(self->myerrno);
819 if (errcode == -1 && PyErr_Occurred())
820 return -1;
821 posix_errno = winerror_to_errno(errcode);
822
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000823 Py_CLEAR(self->winerror);
Richard Jones7b9558d2006-05-27 12:29:24 +0000824 self->winerror = self->myerrno;
825
826 o_errcode = PyInt_FromLong(posix_errno);
827 if (!o_errcode)
828 return -1;
829
830 self->myerrno = o_errcode;
831
832 return 0;
833}
834
835
836static PyObject *
837WindowsError_str(PyWindowsErrorObject *self)
838{
Richard Jones7b9558d2006-05-27 12:29:24 +0000839 PyObject *rtnval = NULL;
840
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000841 if (self->filename) {
842 PyObject *fmt;
843 PyObject *repr;
844 PyObject *tuple;
Richard Jones7b9558d2006-05-27 12:29:24 +0000845
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000846 fmt = PyString_FromString("[Error %s] %s: %s");
847 if (!fmt)
848 return NULL;
849
850 repr = PyObject_Repr(self->filename);
851 if (!repr) {
852 Py_DECREF(fmt);
853 return NULL;
854 }
855 tuple = PyTuple_New(3);
856 if (!tuple) {
857 Py_DECREF(repr);
858 Py_DECREF(fmt);
859 return NULL;
860 }
861
Thomas Hellerdf08f0b2006-10-27 18:31:36 +0000862 if (self->winerror) {
863 Py_INCREF(self->winerror);
864 PyTuple_SET_ITEM(tuple, 0, self->winerror);
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000865 }
866 else {
867 Py_INCREF(Py_None);
868 PyTuple_SET_ITEM(tuple, 0, Py_None);
869 }
870 if (self->strerror) {
871 Py_INCREF(self->strerror);
872 PyTuple_SET_ITEM(tuple, 1, self->strerror);
873 }
874 else {
875 Py_INCREF(Py_None);
876 PyTuple_SET_ITEM(tuple, 1, Py_None);
877 }
878
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000879 PyTuple_SET_ITEM(tuple, 2, repr);
Richard Jones7b9558d2006-05-27 12:29:24 +0000880
881 rtnval = PyString_Format(fmt, tuple);
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000882
883 Py_DECREF(fmt);
Richard Jones7b9558d2006-05-27 12:29:24 +0000884 Py_DECREF(tuple);
885 }
Thomas Hellerdf08f0b2006-10-27 18:31:36 +0000886 else if (self->winerror && self->strerror) {
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000887 PyObject *fmt;
888 PyObject *tuple;
889
Richard Jones7b9558d2006-05-27 12:29:24 +0000890 fmt = PyString_FromString("[Error %s] %s");
891 if (!fmt)
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000892 return NULL;
Richard Jones7b9558d2006-05-27 12:29:24 +0000893
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000894 tuple = PyTuple_New(2);
895 if (!tuple) {
896 Py_DECREF(fmt);
897 return NULL;
898 }
899
Thomas Hellerdf08f0b2006-10-27 18:31:36 +0000900 if (self->winerror) {
901 Py_INCREF(self->winerror);
902 PyTuple_SET_ITEM(tuple, 0, self->winerror);
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000903 }
904 else {
905 Py_INCREF(Py_None);
906 PyTuple_SET_ITEM(tuple, 0, Py_None);
907 }
908 if (self->strerror) {
909 Py_INCREF(self->strerror);
910 PyTuple_SET_ITEM(tuple, 1, self->strerror);
911 }
912 else {
913 Py_INCREF(Py_None);
914 PyTuple_SET_ITEM(tuple, 1, Py_None);
915 }
Richard Jones7b9558d2006-05-27 12:29:24 +0000916
917 rtnval = PyString_Format(fmt, tuple);
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000918
919 Py_DECREF(fmt);
Richard Jones7b9558d2006-05-27 12:29:24 +0000920 Py_DECREF(tuple);
921 }
922 else
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000923 rtnval = EnvironmentError_str((PyEnvironmentErrorObject *)self);
Richard Jones7b9558d2006-05-27 12:29:24 +0000924
Richard Jones7b9558d2006-05-27 12:29:24 +0000925 return rtnval;
926}
927
928static PyMemberDef WindowsError_members[] = {
Richard Jones7b9558d2006-05-27 12:29:24 +0000929 {"errno", T_OBJECT, offsetof(PyWindowsErrorObject, myerrno), 0,
Richard Jonesc5b2a2e2006-05-27 16:07:28 +0000930 PyDoc_STR("POSIX exception code")},
Richard Jones7b9558d2006-05-27 12:29:24 +0000931 {"strerror", T_OBJECT, offsetof(PyWindowsErrorObject, strerror), 0,
Richard Jonesc5b2a2e2006-05-27 16:07:28 +0000932 PyDoc_STR("exception strerror")},
Richard Jones7b9558d2006-05-27 12:29:24 +0000933 {"filename", T_OBJECT, offsetof(PyWindowsErrorObject, filename), 0,
Richard Jonesc5b2a2e2006-05-27 16:07:28 +0000934 PyDoc_STR("exception filename")},
Richard Jones7b9558d2006-05-27 12:29:24 +0000935 {"winerror", T_OBJECT, offsetof(PyWindowsErrorObject, winerror), 0,
Richard Jonesc5b2a2e2006-05-27 16:07:28 +0000936 PyDoc_STR("Win32 exception code")},
Richard Jones7b9558d2006-05-27 12:29:24 +0000937 {NULL} /* Sentinel */
938};
939
Richard Jones2d555b32006-05-27 16:15:11 +0000940ComplexExtendsException(PyExc_OSError, WindowsError, WindowsError,
941 WindowsError_dealloc, 0, WindowsError_members,
942 WindowsError_str, "MS-Windows OS system call failed.");
Richard Jones7b9558d2006-05-27 12:29:24 +0000943
944#endif /* MS_WINDOWS */
945
946
947/*
948 * VMSError extends OSError (I think)
949 */
950#ifdef __VMS
951MiddlingExtendsException(PyExc_OSError, VMSError, EnvironmentError,
Richard Jones2d555b32006-05-27 16:15:11 +0000952 "OpenVMS OS system call failed.");
Richard Jones7b9558d2006-05-27 12:29:24 +0000953#endif
954
955
956/*
957 * EOFError extends StandardError
958 */
959SimpleExtendsException(PyExc_StandardError, EOFError,
Richard Jones2d555b32006-05-27 16:15:11 +0000960 "Read beyond end of file.");
Richard Jones7b9558d2006-05-27 12:29:24 +0000961
962
963/*
964 * RuntimeError extends StandardError
965 */
966SimpleExtendsException(PyExc_StandardError, RuntimeError,
Richard Jones2d555b32006-05-27 16:15:11 +0000967 "Unspecified run-time error.");
Richard Jones7b9558d2006-05-27 12:29:24 +0000968
969
970/*
971 * NotImplementedError extends RuntimeError
972 */
973SimpleExtendsException(PyExc_RuntimeError, NotImplementedError,
Richard Jones2d555b32006-05-27 16:15:11 +0000974 "Method or function hasn't been implemented yet.");
Richard Jones7b9558d2006-05-27 12:29:24 +0000975
976/*
977 * NameError extends StandardError
978 */
979SimpleExtendsException(PyExc_StandardError, NameError,
Richard Jones2d555b32006-05-27 16:15:11 +0000980 "Name not found globally.");
Richard Jones7b9558d2006-05-27 12:29:24 +0000981
982/*
983 * UnboundLocalError extends NameError
984 */
985SimpleExtendsException(PyExc_NameError, UnboundLocalError,
Richard Jones2d555b32006-05-27 16:15:11 +0000986 "Local name referenced but not bound to a value.");
Richard Jones7b9558d2006-05-27 12:29:24 +0000987
988/*
989 * AttributeError extends StandardError
990 */
991SimpleExtendsException(PyExc_StandardError, AttributeError,
Richard Jones2d555b32006-05-27 16:15:11 +0000992 "Attribute not found.");
Richard Jones7b9558d2006-05-27 12:29:24 +0000993
994
995/*
996 * SyntaxError extends StandardError
997 */
Richard Jones7b9558d2006-05-27 12:29:24 +0000998
999static int
1000SyntaxError_init(PySyntaxErrorObject *self, PyObject *args, PyObject *kwds)
1001{
1002 PyObject *info = NULL;
1003 Py_ssize_t lenargs = PyTuple_GET_SIZE(args);
1004
1005 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1006 return -1;
1007
1008 if (lenargs >= 1) {
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001009 Py_CLEAR(self->msg);
Richard Jones7b9558d2006-05-27 12:29:24 +00001010 self->msg = PyTuple_GET_ITEM(args, 0);
1011 Py_INCREF(self->msg);
1012 }
1013 if (lenargs == 2) {
1014 info = PyTuple_GET_ITEM(args, 1);
1015 info = PySequence_Tuple(info);
1016 if (!info) return -1;
1017
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001018 if (PyTuple_GET_SIZE(info) != 4) {
1019 /* not a very good error message, but it's what Python 2.4 gives */
1020 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
1021 Py_DECREF(info);
1022 return -1;
1023 }
1024
1025 Py_CLEAR(self->filename);
Richard Jones7b9558d2006-05-27 12:29:24 +00001026 self->filename = PyTuple_GET_ITEM(info, 0);
1027 Py_INCREF(self->filename);
1028
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001029 Py_CLEAR(self->lineno);
Richard Jones7b9558d2006-05-27 12:29:24 +00001030 self->lineno = PyTuple_GET_ITEM(info, 1);
1031 Py_INCREF(self->lineno);
1032
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001033 Py_CLEAR(self->offset);
Richard Jones7b9558d2006-05-27 12:29:24 +00001034 self->offset = PyTuple_GET_ITEM(info, 2);
1035 Py_INCREF(self->offset);
1036
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001037 Py_CLEAR(self->text);
Richard Jones7b9558d2006-05-27 12:29:24 +00001038 self->text = PyTuple_GET_ITEM(info, 3);
1039 Py_INCREF(self->text);
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001040
1041 Py_DECREF(info);
Richard Jones7b9558d2006-05-27 12:29:24 +00001042 }
1043 return 0;
1044}
1045
Michael W. Hudson96495ee2006-05-28 17:40:29 +00001046static int
Richard Jones7b9558d2006-05-27 12:29:24 +00001047SyntaxError_clear(PySyntaxErrorObject *self)
1048{
1049 Py_CLEAR(self->msg);
1050 Py_CLEAR(self->filename);
1051 Py_CLEAR(self->lineno);
1052 Py_CLEAR(self->offset);
1053 Py_CLEAR(self->text);
1054 Py_CLEAR(self->print_file_and_line);
1055 return BaseException_clear((PyBaseExceptionObject *)self);
1056}
1057
1058static void
1059SyntaxError_dealloc(PySyntaxErrorObject *self)
1060{
Georg Brandl38f62372006-09-06 06:50:05 +00001061 _PyObject_GC_UNTRACK(self);
Richard Jones7b9558d2006-05-27 12:29:24 +00001062 SyntaxError_clear(self);
Christian Heimese93237d2007-12-19 02:37:44 +00001063 Py_TYPE(self)->tp_free((PyObject *)self);
Richard Jones7b9558d2006-05-27 12:29:24 +00001064}
1065
Michael W. Hudson96495ee2006-05-28 17:40:29 +00001066static int
Richard Jones7b9558d2006-05-27 12:29:24 +00001067SyntaxError_traverse(PySyntaxErrorObject *self, visitproc visit, void *arg)
1068{
1069 Py_VISIT(self->msg);
1070 Py_VISIT(self->filename);
1071 Py_VISIT(self->lineno);
1072 Py_VISIT(self->offset);
1073 Py_VISIT(self->text);
1074 Py_VISIT(self->print_file_and_line);
1075 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1076}
1077
1078/* This is called "my_basename" instead of just "basename" to avoid name
1079 conflicts with glibc; basename is already prototyped if _GNU_SOURCE is
1080 defined, and Python does define that. */
1081static char *
1082my_basename(char *name)
1083{
1084 char *cp = name;
1085 char *result = name;
1086
1087 if (name == NULL)
1088 return "???";
1089 while (*cp != '\0') {
1090 if (*cp == SEP)
1091 result = cp + 1;
1092 ++cp;
1093 }
1094 return result;
1095}
1096
1097
1098static PyObject *
1099SyntaxError_str(PySyntaxErrorObject *self)
1100{
1101 PyObject *str;
1102 PyObject *result;
Georg Brandl43ab1002006-05-28 20:57:09 +00001103 int have_filename = 0;
1104 int have_lineno = 0;
1105 char *buffer = NULL;
Thomas Woutersc1282ee2006-05-28 21:32:12 +00001106 Py_ssize_t bufsize;
Richard Jones7b9558d2006-05-27 12:29:24 +00001107
Michael W. Hudson96495ee2006-05-28 17:40:29 +00001108 if (self->msg)
1109 str = PyObject_Str(self->msg);
1110 else
1111 str = PyObject_Str(Py_None);
Georg Brandl43ab1002006-05-28 20:57:09 +00001112 if (!str) return NULL;
1113 /* Don't fiddle with non-string return (shouldn't happen anyway) */
1114 if (!PyString_Check(str)) return str;
Richard Jones7b9558d2006-05-27 12:29:24 +00001115
1116 /* XXX -- do all the additional formatting with filename and
1117 lineno here */
1118
Georg Brandl43ab1002006-05-28 20:57:09 +00001119 have_filename = (self->filename != NULL) &&
1120 PyString_Check(self->filename);
1121 have_lineno = (self->lineno != NULL) && PyInt_Check(self->lineno);
Richard Jones7b9558d2006-05-27 12:29:24 +00001122
Georg Brandl43ab1002006-05-28 20:57:09 +00001123 if (!have_filename && !have_lineno)
1124 return str;
Richard Jones7b9558d2006-05-27 12:29:24 +00001125
Thomas Woutersc1282ee2006-05-28 21:32:12 +00001126 bufsize = PyString_GET_SIZE(str) + 64;
Georg Brandl43ab1002006-05-28 20:57:09 +00001127 if (have_filename)
1128 bufsize += PyString_GET_SIZE(self->filename);
Richard Jones7b9558d2006-05-27 12:29:24 +00001129
Georg Brandl43ab1002006-05-28 20:57:09 +00001130 buffer = PyMem_MALLOC(bufsize);
1131 if (buffer == NULL)
1132 return str;
Richard Jones7b9558d2006-05-27 12:29:24 +00001133
Georg Brandl43ab1002006-05-28 20:57:09 +00001134 if (have_filename && have_lineno)
1135 PyOS_snprintf(buffer, bufsize, "%s (%s, line %ld)",
1136 PyString_AS_STRING(str),
1137 my_basename(PyString_AS_STRING(self->filename)),
1138 PyInt_AsLong(self->lineno));
1139 else if (have_filename)
1140 PyOS_snprintf(buffer, bufsize, "%s (%s)",
1141 PyString_AS_STRING(str),
1142 my_basename(PyString_AS_STRING(self->filename)));
1143 else /* only have_lineno */
1144 PyOS_snprintf(buffer, bufsize, "%s (line %ld)",
1145 PyString_AS_STRING(str),
1146 PyInt_AsLong(self->lineno));
Richard Jones7b9558d2006-05-27 12:29:24 +00001147
Georg Brandl43ab1002006-05-28 20:57:09 +00001148 result = PyString_FromString(buffer);
1149 PyMem_FREE(buffer);
1150
1151 if (result == NULL)
1152 result = str;
1153 else
1154 Py_DECREF(str);
Richard Jones7b9558d2006-05-27 12:29:24 +00001155 return result;
1156}
1157
1158static PyMemberDef SyntaxError_members[] = {
Richard Jones7b9558d2006-05-27 12:29:24 +00001159 {"msg", T_OBJECT, offsetof(PySyntaxErrorObject, msg), 0,
1160 PyDoc_STR("exception msg")},
1161 {"filename", T_OBJECT, offsetof(PySyntaxErrorObject, filename), 0,
1162 PyDoc_STR("exception filename")},
1163 {"lineno", T_OBJECT, offsetof(PySyntaxErrorObject, lineno), 0,
1164 PyDoc_STR("exception lineno")},
1165 {"offset", T_OBJECT, offsetof(PySyntaxErrorObject, offset), 0,
1166 PyDoc_STR("exception offset")},
1167 {"text", T_OBJECT, offsetof(PySyntaxErrorObject, text), 0,
1168 PyDoc_STR("exception text")},
1169 {"print_file_and_line", T_OBJECT,
1170 offsetof(PySyntaxErrorObject, print_file_and_line), 0,
1171 PyDoc_STR("exception print_file_and_line")},
1172 {NULL} /* Sentinel */
1173};
1174
1175ComplexExtendsException(PyExc_StandardError, SyntaxError, SyntaxError,
1176 SyntaxError_dealloc, 0, SyntaxError_members,
Richard Jones2d555b32006-05-27 16:15:11 +00001177 SyntaxError_str, "Invalid syntax.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001178
1179
1180/*
1181 * IndentationError extends SyntaxError
1182 */
1183MiddlingExtendsException(PyExc_SyntaxError, IndentationError, SyntaxError,
Richard Jones2d555b32006-05-27 16:15:11 +00001184 "Improper indentation.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001185
1186
1187/*
1188 * TabError extends IndentationError
1189 */
1190MiddlingExtendsException(PyExc_IndentationError, TabError, SyntaxError,
Richard Jones2d555b32006-05-27 16:15:11 +00001191 "Improper mixture of spaces and tabs.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001192
1193
1194/*
1195 * LookupError extends StandardError
1196 */
1197SimpleExtendsException(PyExc_StandardError, LookupError,
Richard Jones2d555b32006-05-27 16:15:11 +00001198 "Base class for lookup errors.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001199
1200
1201/*
1202 * IndexError extends LookupError
1203 */
1204SimpleExtendsException(PyExc_LookupError, IndexError,
Richard Jones2d555b32006-05-27 16:15:11 +00001205 "Sequence index out of range.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001206
1207
1208/*
1209 * KeyError extends LookupError
1210 */
1211static PyObject *
1212KeyError_str(PyBaseExceptionObject *self)
1213{
1214 /* If args is a tuple of exactly one item, apply repr to args[0].
1215 This is done so that e.g. the exception raised by {}[''] prints
1216 KeyError: ''
1217 rather than the confusing
1218 KeyError
1219 alone. The downside is that if KeyError is raised with an explanatory
1220 string, that string will be displayed in quotes. Too bad.
1221 If args is anything else, use the default BaseException__str__().
1222 */
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001223 if (PyTuple_GET_SIZE(self->args) == 1) {
1224 return PyObject_Repr(PyTuple_GET_ITEM(self->args, 0));
Richard Jones7b9558d2006-05-27 12:29:24 +00001225 }
1226 return BaseException_str(self);
1227}
1228
1229ComplexExtendsException(PyExc_LookupError, KeyError, BaseException,
Richard Jones2d555b32006-05-27 16:15:11 +00001230 0, 0, 0, KeyError_str, "Mapping key not found.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001231
1232
1233/*
1234 * ValueError extends StandardError
1235 */
1236SimpleExtendsException(PyExc_StandardError, ValueError,
Richard Jones2d555b32006-05-27 16:15:11 +00001237 "Inappropriate argument value (of correct type).");
Richard Jones7b9558d2006-05-27 12:29:24 +00001238
1239/*
1240 * UnicodeError extends ValueError
1241 */
1242
1243SimpleExtendsException(PyExc_ValueError, UnicodeError,
Richard Jones2d555b32006-05-27 16:15:11 +00001244 "Unicode related error.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001245
1246#ifdef Py_USING_UNICODE
Richard Jones7b9558d2006-05-27 12:29:24 +00001247static PyObject *
1248get_string(PyObject *attr, const char *name)
1249{
1250 if (!attr) {
1251 PyErr_Format(PyExc_TypeError, "%.200s attribute not set", name);
1252 return NULL;
1253 }
1254
1255 if (!PyString_Check(attr)) {
1256 PyErr_Format(PyExc_TypeError, "%.200s attribute must be str", name);
1257 return NULL;
1258 }
1259 Py_INCREF(attr);
1260 return attr;
1261}
1262
1263
1264static int
1265set_string(PyObject **attr, const char *value)
1266{
1267 PyObject *obj = PyString_FromString(value);
1268 if (!obj)
1269 return -1;
Georg Brandl43ab1002006-05-28 20:57:09 +00001270 Py_CLEAR(*attr);
Richard Jones7b9558d2006-05-27 12:29:24 +00001271 *attr = obj;
1272 return 0;
1273}
1274
1275
1276static PyObject *
1277get_unicode(PyObject *attr, const char *name)
1278{
1279 if (!attr) {
1280 PyErr_Format(PyExc_TypeError, "%.200s attribute not set", name);
1281 return NULL;
1282 }
1283
1284 if (!PyUnicode_Check(attr)) {
1285 PyErr_Format(PyExc_TypeError,
1286 "%.200s attribute must be unicode", name);
1287 return NULL;
1288 }
1289 Py_INCREF(attr);
1290 return attr;
1291}
1292
1293PyObject *
1294PyUnicodeEncodeError_GetEncoding(PyObject *exc)
1295{
1296 return get_string(((PyUnicodeErrorObject *)exc)->encoding, "encoding");
1297}
1298
1299PyObject *
1300PyUnicodeDecodeError_GetEncoding(PyObject *exc)
1301{
1302 return get_string(((PyUnicodeErrorObject *)exc)->encoding, "encoding");
1303}
1304
1305PyObject *
1306PyUnicodeEncodeError_GetObject(PyObject *exc)
1307{
1308 return get_unicode(((PyUnicodeErrorObject *)exc)->object, "object");
1309}
1310
1311PyObject *
1312PyUnicodeDecodeError_GetObject(PyObject *exc)
1313{
1314 return get_string(((PyUnicodeErrorObject *)exc)->object, "object");
1315}
1316
1317PyObject *
1318PyUnicodeTranslateError_GetObject(PyObject *exc)
1319{
1320 return get_unicode(((PyUnicodeErrorObject *)exc)->object, "object");
1321}
1322
1323int
1324PyUnicodeEncodeError_GetStart(PyObject *exc, Py_ssize_t *start)
1325{
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001326 Py_ssize_t size;
1327 PyObject *obj = get_unicode(((PyUnicodeErrorObject *)exc)->object,
1328 "object");
1329 if (!obj)
1330 return -1;
1331 *start = ((PyUnicodeErrorObject *)exc)->start;
1332 size = PyUnicode_GET_SIZE(obj);
1333 if (*start<0)
1334 *start = 0; /*XXX check for values <0*/
1335 if (*start>=size)
1336 *start = size-1;
1337 Py_DECREF(obj);
1338 return 0;
Richard Jones7b9558d2006-05-27 12:29:24 +00001339}
1340
1341
1342int
1343PyUnicodeDecodeError_GetStart(PyObject *exc, Py_ssize_t *start)
1344{
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001345 Py_ssize_t size;
1346 PyObject *obj = get_string(((PyUnicodeErrorObject *)exc)->object,
1347 "object");
1348 if (!obj)
1349 return -1;
1350 size = PyString_GET_SIZE(obj);
1351 *start = ((PyUnicodeErrorObject *)exc)->start;
1352 if (*start<0)
1353 *start = 0;
1354 if (*start>=size)
1355 *start = size-1;
1356 Py_DECREF(obj);
1357 return 0;
Richard Jones7b9558d2006-05-27 12:29:24 +00001358}
1359
1360
1361int
1362PyUnicodeTranslateError_GetStart(PyObject *exc, Py_ssize_t *start)
1363{
1364 return PyUnicodeEncodeError_GetStart(exc, start);
1365}
1366
1367
1368int
1369PyUnicodeEncodeError_SetStart(PyObject *exc, Py_ssize_t start)
1370{
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001371 ((PyUnicodeErrorObject *)exc)->start = start;
1372 return 0;
Richard Jones7b9558d2006-05-27 12:29:24 +00001373}
1374
1375
1376int
1377PyUnicodeDecodeError_SetStart(PyObject *exc, Py_ssize_t start)
1378{
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001379 ((PyUnicodeErrorObject *)exc)->start = start;
1380 return 0;
Richard Jones7b9558d2006-05-27 12:29:24 +00001381}
1382
1383
1384int
1385PyUnicodeTranslateError_SetStart(PyObject *exc, Py_ssize_t start)
1386{
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001387 ((PyUnicodeErrorObject *)exc)->start = start;
1388 return 0;
Richard Jones7b9558d2006-05-27 12:29:24 +00001389}
1390
1391
1392int
1393PyUnicodeEncodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
1394{
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001395 Py_ssize_t size;
1396 PyObject *obj = get_unicode(((PyUnicodeErrorObject *)exc)->object,
1397 "object");
1398 if (!obj)
1399 return -1;
1400 *end = ((PyUnicodeErrorObject *)exc)->end;
1401 size = PyUnicode_GET_SIZE(obj);
1402 if (*end<1)
1403 *end = 1;
1404 if (*end>size)
1405 *end = size;
1406 Py_DECREF(obj);
1407 return 0;
Richard Jones7b9558d2006-05-27 12:29:24 +00001408}
1409
1410
1411int
1412PyUnicodeDecodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
1413{
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001414 Py_ssize_t size;
1415 PyObject *obj = get_string(((PyUnicodeErrorObject *)exc)->object,
1416 "object");
1417 if (!obj)
1418 return -1;
1419 *end = ((PyUnicodeErrorObject *)exc)->end;
1420 size = PyString_GET_SIZE(obj);
1421 if (*end<1)
1422 *end = 1;
1423 if (*end>size)
1424 *end = size;
1425 Py_DECREF(obj);
1426 return 0;
Richard Jones7b9558d2006-05-27 12:29:24 +00001427}
1428
1429
1430int
1431PyUnicodeTranslateError_GetEnd(PyObject *exc, Py_ssize_t *start)
1432{
1433 return PyUnicodeEncodeError_GetEnd(exc, start);
1434}
1435
1436
1437int
1438PyUnicodeEncodeError_SetEnd(PyObject *exc, Py_ssize_t end)
1439{
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001440 ((PyUnicodeErrorObject *)exc)->end = end;
1441 return 0;
Richard Jones7b9558d2006-05-27 12:29:24 +00001442}
1443
1444
1445int
1446PyUnicodeDecodeError_SetEnd(PyObject *exc, Py_ssize_t end)
1447{
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001448 ((PyUnicodeErrorObject *)exc)->end = end;
1449 return 0;
Richard Jones7b9558d2006-05-27 12:29:24 +00001450}
1451
1452
1453int
1454PyUnicodeTranslateError_SetEnd(PyObject *exc, Py_ssize_t end)
1455{
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001456 ((PyUnicodeErrorObject *)exc)->end = end;
1457 return 0;
Richard Jones7b9558d2006-05-27 12:29:24 +00001458}
1459
1460PyObject *
1461PyUnicodeEncodeError_GetReason(PyObject *exc)
1462{
1463 return get_string(((PyUnicodeErrorObject *)exc)->reason, "reason");
1464}
1465
1466
1467PyObject *
1468PyUnicodeDecodeError_GetReason(PyObject *exc)
1469{
1470 return get_string(((PyUnicodeErrorObject *)exc)->reason, "reason");
1471}
1472
1473
1474PyObject *
1475PyUnicodeTranslateError_GetReason(PyObject *exc)
1476{
1477 return get_string(((PyUnicodeErrorObject *)exc)->reason, "reason");
1478}
1479
1480
1481int
1482PyUnicodeEncodeError_SetReason(PyObject *exc, const char *reason)
1483{
1484 return set_string(&((PyUnicodeErrorObject *)exc)->reason, reason);
1485}
1486
1487
1488int
1489PyUnicodeDecodeError_SetReason(PyObject *exc, const char *reason)
1490{
1491 return set_string(&((PyUnicodeErrorObject *)exc)->reason, reason);
1492}
1493
1494
1495int
1496PyUnicodeTranslateError_SetReason(PyObject *exc, const char *reason)
1497{
1498 return set_string(&((PyUnicodeErrorObject *)exc)->reason, reason);
1499}
1500
1501
Richard Jones7b9558d2006-05-27 12:29:24 +00001502static int
1503UnicodeError_init(PyUnicodeErrorObject *self, PyObject *args, PyObject *kwds,
1504 PyTypeObject *objecttype)
1505{
Michael W. Hudson96495ee2006-05-28 17:40:29 +00001506 Py_CLEAR(self->encoding);
1507 Py_CLEAR(self->object);
Michael W. Hudson96495ee2006-05-28 17:40:29 +00001508 Py_CLEAR(self->reason);
1509
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001510 if (!PyArg_ParseTuple(args, "O!O!nnO!",
Richard Jones7b9558d2006-05-27 12:29:24 +00001511 &PyString_Type, &self->encoding,
1512 objecttype, &self->object,
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001513 &self->start,
1514 &self->end,
Richard Jones7b9558d2006-05-27 12:29:24 +00001515 &PyString_Type, &self->reason)) {
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001516 self->encoding = self->object = self->reason = NULL;
Richard Jones7b9558d2006-05-27 12:29:24 +00001517 return -1;
1518 }
1519
1520 Py_INCREF(self->encoding);
1521 Py_INCREF(self->object);
Richard Jones7b9558d2006-05-27 12:29:24 +00001522 Py_INCREF(self->reason);
1523
1524 return 0;
1525}
1526
Michael W. Hudson96495ee2006-05-28 17:40:29 +00001527static int
Richard Jones7b9558d2006-05-27 12:29:24 +00001528UnicodeError_clear(PyUnicodeErrorObject *self)
1529{
1530 Py_CLEAR(self->encoding);
1531 Py_CLEAR(self->object);
Richard Jones7b9558d2006-05-27 12:29:24 +00001532 Py_CLEAR(self->reason);
1533 return BaseException_clear((PyBaseExceptionObject *)self);
1534}
1535
1536static void
1537UnicodeError_dealloc(PyUnicodeErrorObject *self)
1538{
Georg Brandl38f62372006-09-06 06:50:05 +00001539 _PyObject_GC_UNTRACK(self);
Richard Jones7b9558d2006-05-27 12:29:24 +00001540 UnicodeError_clear(self);
Christian Heimese93237d2007-12-19 02:37:44 +00001541 Py_TYPE(self)->tp_free((PyObject *)self);
Richard Jones7b9558d2006-05-27 12:29:24 +00001542}
1543
Michael W. Hudson96495ee2006-05-28 17:40:29 +00001544static int
Richard Jones7b9558d2006-05-27 12:29:24 +00001545UnicodeError_traverse(PyUnicodeErrorObject *self, visitproc visit, void *arg)
1546{
1547 Py_VISIT(self->encoding);
1548 Py_VISIT(self->object);
Richard Jones7b9558d2006-05-27 12:29:24 +00001549 Py_VISIT(self->reason);
1550 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1551}
1552
1553static PyMemberDef UnicodeError_members[] = {
Richard Jones7b9558d2006-05-27 12:29:24 +00001554 {"encoding", T_OBJECT, offsetof(PyUnicodeErrorObject, encoding), 0,
1555 PyDoc_STR("exception encoding")},
1556 {"object", T_OBJECT, offsetof(PyUnicodeErrorObject, object), 0,
1557 PyDoc_STR("exception object")},
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001558 {"start", T_PYSSIZET, offsetof(PyUnicodeErrorObject, start), 0,
Richard Jones7b9558d2006-05-27 12:29:24 +00001559 PyDoc_STR("exception start")},
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001560 {"end", T_PYSSIZET, offsetof(PyUnicodeErrorObject, end), 0,
Richard Jones7b9558d2006-05-27 12:29:24 +00001561 PyDoc_STR("exception end")},
1562 {"reason", T_OBJECT, offsetof(PyUnicodeErrorObject, reason), 0,
1563 PyDoc_STR("exception reason")},
1564 {NULL} /* Sentinel */
1565};
1566
1567
1568/*
1569 * UnicodeEncodeError extends UnicodeError
1570 */
Richard Jones7b9558d2006-05-27 12:29:24 +00001571
1572static int
1573UnicodeEncodeError_init(PyObject *self, PyObject *args, PyObject *kwds)
1574{
1575 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1576 return -1;
1577 return UnicodeError_init((PyUnicodeErrorObject *)self, args,
1578 kwds, &PyUnicode_Type);
1579}
1580
1581static PyObject *
1582UnicodeEncodeError_str(PyObject *self)
1583{
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001584 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Richard Jones7b9558d2006-05-27 12:29:24 +00001585
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001586 if (uself->end==uself->start+1) {
1587 int badchar = (int)PyUnicode_AS_UNICODE(uself->object)[uself->start];
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001588 char badchar_str[20];
1589 if (badchar <= 0xff)
1590 PyOS_snprintf(badchar_str, sizeof(badchar_str), "x%02x", badchar);
1591 else if (badchar <= 0xffff)
1592 PyOS_snprintf(badchar_str, sizeof(badchar_str), "u%04x", badchar);
1593 else
1594 PyOS_snprintf(badchar_str, sizeof(badchar_str), "U%08x", badchar);
1595 return PyString_FromFormat(
1596 "'%.400s' codec can't encode character u'\\%s' in position %zd: %.400s",
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001597 PyString_AS_STRING(uself->encoding),
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001598 badchar_str,
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001599 uself->start,
1600 PyString_AS_STRING(uself->reason)
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001601 );
Richard Jones7b9558d2006-05-27 12:29:24 +00001602 }
1603 return PyString_FromFormat(
1604 "'%.400s' codec can't encode characters in position %zd-%zd: %.400s",
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001605 PyString_AS_STRING(uself->encoding),
1606 uself->start,
1607 uself->end-1,
1608 PyString_AS_STRING(uself->reason)
Richard Jones7b9558d2006-05-27 12:29:24 +00001609 );
1610}
1611
1612static PyTypeObject _PyExc_UnicodeEncodeError = {
1613 PyObject_HEAD_INIT(NULL)
1614 0,
Georg Brandl38f62372006-09-06 06:50:05 +00001615 EXC_MODULE_NAME "UnicodeEncodeError",
Richard Jones7b9558d2006-05-27 12:29:24 +00001616 sizeof(PyUnicodeErrorObject), 0,
1617 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1618 (reprfunc)UnicodeEncodeError_str, 0, 0, 0,
1619 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Michael W. Hudson27596272006-05-28 21:19:03 +00001620 PyDoc_STR("Unicode encoding error."), (traverseproc)UnicodeError_traverse,
1621 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
Richard Jones7b9558d2006-05-27 12:29:24 +00001622 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Michael W. Hudson96495ee2006-05-28 17:40:29 +00001623 (initproc)UnicodeEncodeError_init, 0, BaseException_new,
Richard Jones7b9558d2006-05-27 12:29:24 +00001624};
1625PyObject *PyExc_UnicodeEncodeError = (PyObject *)&_PyExc_UnicodeEncodeError;
1626
1627PyObject *
1628PyUnicodeEncodeError_Create(
1629 const char *encoding, const Py_UNICODE *object, Py_ssize_t length,
1630 Py_ssize_t start, Py_ssize_t end, const char *reason)
1631{
1632 return PyObject_CallFunction(PyExc_UnicodeEncodeError, "su#nns",
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001633 encoding, object, length, start, end, reason);
Richard Jones7b9558d2006-05-27 12:29:24 +00001634}
1635
1636
1637/*
1638 * UnicodeDecodeError extends UnicodeError
1639 */
Richard Jones7b9558d2006-05-27 12:29:24 +00001640
1641static int
1642UnicodeDecodeError_init(PyObject *self, PyObject *args, PyObject *kwds)
1643{
1644 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1645 return -1;
1646 return UnicodeError_init((PyUnicodeErrorObject *)self, args,
1647 kwds, &PyString_Type);
1648}
1649
1650static PyObject *
1651UnicodeDecodeError_str(PyObject *self)
1652{
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001653 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Richard Jones7b9558d2006-05-27 12:29:24 +00001654
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001655 if (uself->end==uself->start+1) {
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001656 /* FromFormat does not support %02x, so format that separately */
1657 char byte[4];
1658 PyOS_snprintf(byte, sizeof(byte), "%02x",
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001659 ((int)PyString_AS_STRING(uself->object)[uself->start])&0xff);
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001660 return PyString_FromFormat(
1661 "'%.400s' codec can't decode byte 0x%s in position %zd: %.400s",
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001662 PyString_AS_STRING(uself->encoding),
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001663 byte,
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001664 uself->start,
1665 PyString_AS_STRING(uself->reason)
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001666 );
Richard Jones7b9558d2006-05-27 12:29:24 +00001667 }
1668 return PyString_FromFormat(
1669 "'%.400s' codec can't decode bytes in position %zd-%zd: %.400s",
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001670 PyString_AS_STRING(uself->encoding),
1671 uself->start,
1672 uself->end-1,
1673 PyString_AS_STRING(uself->reason)
Richard Jones7b9558d2006-05-27 12:29:24 +00001674 );
1675}
1676
1677static PyTypeObject _PyExc_UnicodeDecodeError = {
1678 PyObject_HEAD_INIT(NULL)
1679 0,
1680 EXC_MODULE_NAME "UnicodeDecodeError",
1681 sizeof(PyUnicodeErrorObject), 0,
1682 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1683 (reprfunc)UnicodeDecodeError_str, 0, 0, 0,
1684 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Michael W. Hudson27596272006-05-28 21:19:03 +00001685 PyDoc_STR("Unicode decoding error."), (traverseproc)UnicodeError_traverse,
1686 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
Richard Jones7b9558d2006-05-27 12:29:24 +00001687 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Michael W. Hudson96495ee2006-05-28 17:40:29 +00001688 (initproc)UnicodeDecodeError_init, 0, BaseException_new,
Richard Jones7b9558d2006-05-27 12:29:24 +00001689};
1690PyObject *PyExc_UnicodeDecodeError = (PyObject *)&_PyExc_UnicodeDecodeError;
1691
1692PyObject *
1693PyUnicodeDecodeError_Create(
1694 const char *encoding, const char *object, Py_ssize_t length,
1695 Py_ssize_t start, Py_ssize_t end, const char *reason)
1696{
1697 assert(length < INT_MAX);
1698 assert(start < INT_MAX);
1699 assert(end < INT_MAX);
1700 return PyObject_CallFunction(PyExc_UnicodeDecodeError, "ss#nns",
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001701 encoding, object, length, start, end, reason);
Richard Jones7b9558d2006-05-27 12:29:24 +00001702}
1703
1704
1705/*
1706 * UnicodeTranslateError extends UnicodeError
1707 */
Richard Jones7b9558d2006-05-27 12:29:24 +00001708
1709static int
1710UnicodeTranslateError_init(PyUnicodeErrorObject *self, PyObject *args,
1711 PyObject *kwds)
1712{
1713 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1714 return -1;
1715
1716 Py_CLEAR(self->object);
Richard Jones7b9558d2006-05-27 12:29:24 +00001717 Py_CLEAR(self->reason);
1718
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001719 if (!PyArg_ParseTuple(args, "O!nnO!",
Richard Jones7b9558d2006-05-27 12:29:24 +00001720 &PyUnicode_Type, &self->object,
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001721 &self->start,
1722 &self->end,
Richard Jones7b9558d2006-05-27 12:29:24 +00001723 &PyString_Type, &self->reason)) {
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001724 self->object = self->reason = NULL;
Richard Jones7b9558d2006-05-27 12:29:24 +00001725 return -1;
1726 }
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001727
Richard Jones7b9558d2006-05-27 12:29:24 +00001728 Py_INCREF(self->object);
Richard Jones7b9558d2006-05-27 12:29:24 +00001729 Py_INCREF(self->reason);
1730
1731 return 0;
1732}
1733
1734
1735static PyObject *
1736UnicodeTranslateError_str(PyObject *self)
1737{
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001738 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Richard Jones7b9558d2006-05-27 12:29:24 +00001739
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001740 if (uself->end==uself->start+1) {
1741 int badchar = (int)PyUnicode_AS_UNICODE(uself->object)[uself->start];
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001742 char badchar_str[20];
1743 if (badchar <= 0xff)
1744 PyOS_snprintf(badchar_str, sizeof(badchar_str), "x%02x", badchar);
1745 else if (badchar <= 0xffff)
1746 PyOS_snprintf(badchar_str, sizeof(badchar_str), "u%04x", badchar);
1747 else
1748 PyOS_snprintf(badchar_str, sizeof(badchar_str), "U%08x", badchar);
1749 return PyString_FromFormat(
Richard Jones7b9558d2006-05-27 12:29:24 +00001750 "can't translate character u'\\%s' in position %zd: %.400s",
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001751 badchar_str,
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001752 uself->start,
1753 PyString_AS_STRING(uself->reason)
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001754 );
Richard Jones7b9558d2006-05-27 12:29:24 +00001755 }
1756 return PyString_FromFormat(
1757 "can't translate characters in position %zd-%zd: %.400s",
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001758 uself->start,
1759 uself->end-1,
1760 PyString_AS_STRING(uself->reason)
Richard Jones7b9558d2006-05-27 12:29:24 +00001761 );
1762}
1763
1764static PyTypeObject _PyExc_UnicodeTranslateError = {
1765 PyObject_HEAD_INIT(NULL)
1766 0,
1767 EXC_MODULE_NAME "UnicodeTranslateError",
1768 sizeof(PyUnicodeErrorObject), 0,
1769 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1770 (reprfunc)UnicodeTranslateError_str, 0, 0, 0,
1771 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Georg Brandl38f62372006-09-06 06:50:05 +00001772 PyDoc_STR("Unicode translation error."), (traverseproc)UnicodeError_traverse,
Richard Jones7b9558d2006-05-27 12:29:24 +00001773 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
1774 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Michael W. Hudson96495ee2006-05-28 17:40:29 +00001775 (initproc)UnicodeTranslateError_init, 0, BaseException_new,
Richard Jones7b9558d2006-05-27 12:29:24 +00001776};
1777PyObject *PyExc_UnicodeTranslateError = (PyObject *)&_PyExc_UnicodeTranslateError;
1778
1779PyObject *
1780PyUnicodeTranslateError_Create(
1781 const Py_UNICODE *object, Py_ssize_t length,
1782 Py_ssize_t start, Py_ssize_t end, const char *reason)
1783{
1784 return PyObject_CallFunction(PyExc_UnicodeTranslateError, "u#nns",
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001785 object, length, start, end, reason);
Richard Jones7b9558d2006-05-27 12:29:24 +00001786}
1787#endif
1788
1789
1790/*
1791 * AssertionError extends StandardError
1792 */
1793SimpleExtendsException(PyExc_StandardError, AssertionError,
Richard Jones2d555b32006-05-27 16:15:11 +00001794 "Assertion failed.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001795
1796
1797/*
1798 * ArithmeticError extends StandardError
1799 */
1800SimpleExtendsException(PyExc_StandardError, ArithmeticError,
Richard Jones2d555b32006-05-27 16:15:11 +00001801 "Base class for arithmetic errors.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001802
1803
1804/*
1805 * FloatingPointError extends ArithmeticError
1806 */
1807SimpleExtendsException(PyExc_ArithmeticError, FloatingPointError,
Richard Jones2d555b32006-05-27 16:15:11 +00001808 "Floating point operation failed.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001809
1810
1811/*
1812 * OverflowError extends ArithmeticError
1813 */
1814SimpleExtendsException(PyExc_ArithmeticError, OverflowError,
Richard Jones2d555b32006-05-27 16:15:11 +00001815 "Result too large to be represented.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001816
1817
1818/*
1819 * ZeroDivisionError extends ArithmeticError
1820 */
1821SimpleExtendsException(PyExc_ArithmeticError, ZeroDivisionError,
Richard Jones2d555b32006-05-27 16:15:11 +00001822 "Second argument to a division or modulo operation was zero.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001823
1824
1825/*
1826 * SystemError extends StandardError
1827 */
1828SimpleExtendsException(PyExc_StandardError, SystemError,
1829 "Internal error in the Python interpreter.\n"
1830 "\n"
1831 "Please report this to the Python maintainer, along with the traceback,\n"
Richard Jones2d555b32006-05-27 16:15:11 +00001832 "the Python version, and the hardware/OS platform and version.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001833
1834
1835/*
1836 * ReferenceError extends StandardError
1837 */
1838SimpleExtendsException(PyExc_StandardError, ReferenceError,
Richard Jones2d555b32006-05-27 16:15:11 +00001839 "Weak ref proxy used after referent went away.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001840
1841
1842/*
1843 * MemoryError extends StandardError
1844 */
Richard Jones2d555b32006-05-27 16:15:11 +00001845SimpleExtendsException(PyExc_StandardError, MemoryError, "Out of memory.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001846
Travis E. Oliphant3781aef2008-03-18 04:44:57 +00001847/*
1848 * BufferError extends StandardError
1849 */
1850SimpleExtendsException(PyExc_StandardError, BufferError, "Buffer error.");
1851
Richard Jones7b9558d2006-05-27 12:29:24 +00001852
1853/* Warning category docstrings */
1854
1855/*
1856 * Warning extends Exception
1857 */
1858SimpleExtendsException(PyExc_Exception, Warning,
Richard Jones2d555b32006-05-27 16:15:11 +00001859 "Base class for warning categories.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001860
1861
1862/*
1863 * UserWarning extends Warning
1864 */
1865SimpleExtendsException(PyExc_Warning, UserWarning,
Richard Jones2d555b32006-05-27 16:15:11 +00001866 "Base class for warnings generated by user code.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001867
1868
1869/*
1870 * DeprecationWarning extends Warning
1871 */
1872SimpleExtendsException(PyExc_Warning, DeprecationWarning,
Richard Jones2d555b32006-05-27 16:15:11 +00001873 "Base class for warnings about deprecated features.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001874
1875
1876/*
1877 * PendingDeprecationWarning extends Warning
1878 */
1879SimpleExtendsException(PyExc_Warning, PendingDeprecationWarning,
1880 "Base class for warnings about features which will be deprecated\n"
Richard Jones2d555b32006-05-27 16:15:11 +00001881 "in the future.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001882
1883
1884/*
1885 * SyntaxWarning extends Warning
1886 */
1887SimpleExtendsException(PyExc_Warning, SyntaxWarning,
Richard Jones2d555b32006-05-27 16:15:11 +00001888 "Base class for warnings about dubious syntax.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001889
1890
1891/*
1892 * RuntimeWarning extends Warning
1893 */
1894SimpleExtendsException(PyExc_Warning, RuntimeWarning,
Richard Jones2d555b32006-05-27 16:15:11 +00001895 "Base class for warnings about dubious runtime behavior.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001896
1897
1898/*
1899 * FutureWarning extends Warning
1900 */
1901SimpleExtendsException(PyExc_Warning, FutureWarning,
1902 "Base class for warnings about constructs that will change semantically\n"
Richard Jones2d555b32006-05-27 16:15:11 +00001903 "in the future.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001904
1905
1906/*
1907 * ImportWarning extends Warning
1908 */
1909SimpleExtendsException(PyExc_Warning, ImportWarning,
Richard Jones2d555b32006-05-27 16:15:11 +00001910 "Base class for warnings about probable mistakes in module imports");
Richard Jones7b9558d2006-05-27 12:29:24 +00001911
1912
Marc-André Lemburg040f76b2006-08-14 10:55:19 +00001913/*
1914 * UnicodeWarning extends Warning
1915 */
1916SimpleExtendsException(PyExc_Warning, UnicodeWarning,
1917 "Base class for warnings about Unicode related problems, mostly\n"
1918 "related to conversion problems.");
1919
Christian Heimes1a6387e2008-03-26 12:49:49 +00001920/*
1921 * BytesWarning extends Warning
1922 */
1923SimpleExtendsException(PyExc_Warning, BytesWarning,
1924 "Base class for warnings about bytes and buffer related problems, mostly\n"
1925 "related to conversion from str or comparing to str.");
Marc-André Lemburg040f76b2006-08-14 10:55:19 +00001926
Richard Jones7b9558d2006-05-27 12:29:24 +00001927/* Pre-computed MemoryError instance. Best to create this as early as
1928 * possible and not wait until a MemoryError is actually raised!
1929 */
1930PyObject *PyExc_MemoryErrorInst=NULL;
1931
Brett Cannon1e534b52007-09-07 04:18:30 +00001932/* Pre-computed RuntimeError instance for when recursion depth is reached.
1933 Meant to be used when normalizing the exception for exceeding the recursion
1934 depth will cause its own infinite recursion.
1935*/
1936PyObject *PyExc_RecursionErrorInst = NULL;
1937
Richard Jones7b9558d2006-05-27 12:29:24 +00001938/* module global functions */
1939static PyMethodDef functions[] = {
1940 /* Sentinel */
1941 {NULL, NULL}
1942};
1943
1944#define PRE_INIT(TYPE) if (PyType_Ready(&_PyExc_ ## TYPE) < 0) \
1945 Py_FatalError("exceptions bootstrapping error.");
1946
1947#define POST_INIT(TYPE) Py_INCREF(PyExc_ ## TYPE); \
1948 PyModule_AddObject(m, # TYPE, PyExc_ ## TYPE); \
1949 if (PyDict_SetItemString(bdict, # TYPE, PyExc_ ## TYPE)) \
1950 Py_FatalError("Module dictionary insertion problem.");
1951
Kristján Valur Jónsson74c3ea02006-07-03 14:59:05 +00001952#if defined _MSC_VER && _MSC_VER >= 1400 && defined(__STDC_SECURE_LIB__)
Kristján Valur Jónssonf6083172006-06-12 15:45:12 +00001953/* crt variable checking in VisualStudio .NET 2005 */
1954#include <crtdbg.h>
1955
1956static int prevCrtReportMode;
1957static _invalid_parameter_handler prevCrtHandler;
1958
1959/* Invalid parameter handler. Sets a ValueError exception */
1960static void
1961InvalidParameterHandler(
1962 const wchar_t * expression,
1963 const wchar_t * function,
1964 const wchar_t * file,
1965 unsigned int line,
1966 uintptr_t pReserved)
1967{
1968 /* Do nothing, allow execution to continue. Usually this
1969 * means that the CRT will set errno to EINVAL
1970 */
1971}
1972#endif
1973
1974
Richard Jones7b9558d2006-05-27 12:29:24 +00001975PyMODINIT_FUNC
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001976_PyExc_Init(void)
Richard Jones7b9558d2006-05-27 12:29:24 +00001977{
1978 PyObject *m, *bltinmod, *bdict;
1979
1980 PRE_INIT(BaseException)
1981 PRE_INIT(Exception)
1982 PRE_INIT(StandardError)
1983 PRE_INIT(TypeError)
1984 PRE_INIT(StopIteration)
1985 PRE_INIT(GeneratorExit)
1986 PRE_INIT(SystemExit)
1987 PRE_INIT(KeyboardInterrupt)
1988 PRE_INIT(ImportError)
1989 PRE_INIT(EnvironmentError)
1990 PRE_INIT(IOError)
1991 PRE_INIT(OSError)
1992#ifdef MS_WINDOWS
1993 PRE_INIT(WindowsError)
1994#endif
1995#ifdef __VMS
1996 PRE_INIT(VMSError)
1997#endif
1998 PRE_INIT(EOFError)
1999 PRE_INIT(RuntimeError)
2000 PRE_INIT(NotImplementedError)
2001 PRE_INIT(NameError)
2002 PRE_INIT(UnboundLocalError)
2003 PRE_INIT(AttributeError)
2004 PRE_INIT(SyntaxError)
2005 PRE_INIT(IndentationError)
2006 PRE_INIT(TabError)
2007 PRE_INIT(LookupError)
2008 PRE_INIT(IndexError)
2009 PRE_INIT(KeyError)
2010 PRE_INIT(ValueError)
2011 PRE_INIT(UnicodeError)
2012#ifdef Py_USING_UNICODE
2013 PRE_INIT(UnicodeEncodeError)
2014 PRE_INIT(UnicodeDecodeError)
2015 PRE_INIT(UnicodeTranslateError)
2016#endif
2017 PRE_INIT(AssertionError)
2018 PRE_INIT(ArithmeticError)
2019 PRE_INIT(FloatingPointError)
2020 PRE_INIT(OverflowError)
2021 PRE_INIT(ZeroDivisionError)
2022 PRE_INIT(SystemError)
2023 PRE_INIT(ReferenceError)
2024 PRE_INIT(MemoryError)
2025 PRE_INIT(Warning)
2026 PRE_INIT(UserWarning)
2027 PRE_INIT(DeprecationWarning)
2028 PRE_INIT(PendingDeprecationWarning)
2029 PRE_INIT(SyntaxWarning)
2030 PRE_INIT(RuntimeWarning)
2031 PRE_INIT(FutureWarning)
2032 PRE_INIT(ImportWarning)
Marc-André Lemburg040f76b2006-08-14 10:55:19 +00002033 PRE_INIT(UnicodeWarning)
Christian Heimes1a6387e2008-03-26 12:49:49 +00002034 PRE_INIT(BytesWarning)
Richard Jones7b9558d2006-05-27 12:29:24 +00002035
Richard Jonesc5b2a2e2006-05-27 16:07:28 +00002036 m = Py_InitModule4("exceptions", functions, exceptions_doc,
2037 (PyObject *)NULL, PYTHON_API_VERSION);
Richard Jones7b9558d2006-05-27 12:29:24 +00002038 if (m == NULL) return;
2039
2040 bltinmod = PyImport_ImportModule("__builtin__");
2041 if (bltinmod == NULL)
2042 Py_FatalError("exceptions bootstrapping error.");
2043 bdict = PyModule_GetDict(bltinmod);
2044 if (bdict == NULL)
2045 Py_FatalError("exceptions bootstrapping error.");
2046
2047 POST_INIT(BaseException)
2048 POST_INIT(Exception)
2049 POST_INIT(StandardError)
2050 POST_INIT(TypeError)
2051 POST_INIT(StopIteration)
2052 POST_INIT(GeneratorExit)
2053 POST_INIT(SystemExit)
2054 POST_INIT(KeyboardInterrupt)
2055 POST_INIT(ImportError)
2056 POST_INIT(EnvironmentError)
2057 POST_INIT(IOError)
2058 POST_INIT(OSError)
2059#ifdef MS_WINDOWS
2060 POST_INIT(WindowsError)
2061#endif
2062#ifdef __VMS
2063 POST_INIT(VMSError)
2064#endif
2065 POST_INIT(EOFError)
2066 POST_INIT(RuntimeError)
2067 POST_INIT(NotImplementedError)
2068 POST_INIT(NameError)
2069 POST_INIT(UnboundLocalError)
2070 POST_INIT(AttributeError)
2071 POST_INIT(SyntaxError)
2072 POST_INIT(IndentationError)
2073 POST_INIT(TabError)
2074 POST_INIT(LookupError)
2075 POST_INIT(IndexError)
2076 POST_INIT(KeyError)
2077 POST_INIT(ValueError)
2078 POST_INIT(UnicodeError)
2079#ifdef Py_USING_UNICODE
2080 POST_INIT(UnicodeEncodeError)
2081 POST_INIT(UnicodeDecodeError)
2082 POST_INIT(UnicodeTranslateError)
2083#endif
2084 POST_INIT(AssertionError)
2085 POST_INIT(ArithmeticError)
2086 POST_INIT(FloatingPointError)
2087 POST_INIT(OverflowError)
2088 POST_INIT(ZeroDivisionError)
2089 POST_INIT(SystemError)
2090 POST_INIT(ReferenceError)
2091 POST_INIT(MemoryError)
2092 POST_INIT(Warning)
2093 POST_INIT(UserWarning)
2094 POST_INIT(DeprecationWarning)
2095 POST_INIT(PendingDeprecationWarning)
2096 POST_INIT(SyntaxWarning)
2097 POST_INIT(RuntimeWarning)
2098 POST_INIT(FutureWarning)
2099 POST_INIT(ImportWarning)
Marc-André Lemburg040f76b2006-08-14 10:55:19 +00002100 POST_INIT(UnicodeWarning)
Christian Heimes1a6387e2008-03-26 12:49:49 +00002101 POST_INIT(BytesWarning)
Richard Jones7b9558d2006-05-27 12:29:24 +00002102
2103 PyExc_MemoryErrorInst = BaseException_new(&_PyExc_MemoryError, NULL, NULL);
2104 if (!PyExc_MemoryErrorInst)
2105 Py_FatalError("Cannot pre-allocate MemoryError instance\n");
2106
Brett Cannon1e534b52007-09-07 04:18:30 +00002107 PyExc_RecursionErrorInst = BaseException_new(&_PyExc_RuntimeError, NULL, NULL);
2108 if (!PyExc_RecursionErrorInst)
2109 Py_FatalError("Cannot pre-allocate RuntimeError instance for "
2110 "recursion errors");
2111 else {
2112 PyBaseExceptionObject *err_inst =
2113 (PyBaseExceptionObject *)PyExc_RecursionErrorInst;
2114 PyObject *args_tuple;
2115 PyObject *exc_message;
2116 exc_message = PyString_FromString("maximum recursion depth exceeded");
2117 if (!exc_message)
2118 Py_FatalError("cannot allocate argument for RuntimeError "
2119 "pre-allocation");
2120 args_tuple = PyTuple_Pack(1, exc_message);
2121 if (!args_tuple)
2122 Py_FatalError("cannot allocate tuple for RuntimeError "
2123 "pre-allocation");
2124 Py_DECREF(exc_message);
2125 if (BaseException_init(err_inst, args_tuple, NULL))
2126 Py_FatalError("init of pre-allocated RuntimeError failed");
2127 Py_DECREF(args_tuple);
2128 }
2129
Richard Jones7b9558d2006-05-27 12:29:24 +00002130 Py_DECREF(bltinmod);
Kristján Valur Jónssonf6083172006-06-12 15:45:12 +00002131
Kristján Valur Jónsson74c3ea02006-07-03 14:59:05 +00002132#if defined _MSC_VER && _MSC_VER >= 1400 && defined(__STDC_SECURE_LIB__)
Kristján Valur Jónssonf6083172006-06-12 15:45:12 +00002133 /* Set CRT argument error handler */
2134 prevCrtHandler = _set_invalid_parameter_handler(InvalidParameterHandler);
2135 /* turn off assertions in debug mode */
2136 prevCrtReportMode = _CrtSetReportMode(_CRT_ASSERT, 0);
2137#endif
Richard Jones7b9558d2006-05-27 12:29:24 +00002138}
2139
2140void
2141_PyExc_Fini(void)
2142{
2143 Py_XDECREF(PyExc_MemoryErrorInst);
2144 PyExc_MemoryErrorInst = NULL;
Kristján Valur Jónsson74c3ea02006-07-03 14:59:05 +00002145#if defined _MSC_VER && _MSC_VER >= 1400 && defined(__STDC_SECURE_LIB__)
Kristján Valur Jónssonf6083172006-06-12 15:45:12 +00002146 /* reset CRT error handling */
2147 _set_invalid_parameter_handler(prevCrtHandler);
2148 _CrtSetReportMode(_CRT_ASSERT, prevCrtReportMode);
2149#endif
Richard Jones7b9558d2006-05-27 12:29:24 +00002150}