blob: ec17bc23a4acf5beb93940ba0d6483ce3f44260f [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{
Guido van Rossum6d91be32008-03-18 04:42:22 +0000192 if (Py_Py3kWarningFlag) {
Georg Brandld5b635f2008-03-25 08:29:14 +0000193 if (PyErr_Warn(PyExc_DeprecationWarning,
194 "__getitem__ not supported for exception "
195 "classes in 3.x; use args attribute") == -1)
196 return NULL;
Guido van Rossum6d91be32008-03-18 04:42:22 +0000197 }
Richard Jones7b9558d2006-05-27 12:29:24 +0000198 return PySequence_GetItem(self->args, index);
199}
200
Brett Cannonf6aa86e2006-09-20 18:43:13 +0000201static PyObject *
202BaseException_getslice(PyBaseExceptionObject *self,
203 Py_ssize_t start, Py_ssize_t stop)
204{
Guido van Rossum6d91be32008-03-18 04:42:22 +0000205 if (Py_Py3kWarningFlag) {
Georg Brandld5b635f2008-03-25 08:29:14 +0000206 if (PyErr_Warn(PyExc_DeprecationWarning,
207 "__getslice__ not supported for exception "
208 "classes in 3.x; use args attribute") == -1)
209 return NULL;
Guido van Rossum6d91be32008-03-18 04:42:22 +0000210 }
Brett Cannonf6aa86e2006-09-20 18:43:13 +0000211 return PySequence_GetSlice(self->args, start, stop);
212}
213
Richard Jones7b9558d2006-05-27 12:29:24 +0000214static PySequenceMethods BaseException_as_sequence = {
215 0, /* sq_length; */
216 0, /* sq_concat; */
217 0, /* sq_repeat; */
218 (ssizeargfunc)BaseException_getitem, /* sq_item; */
Brett Cannonf6aa86e2006-09-20 18:43:13 +0000219 (ssizessizeargfunc)BaseException_getslice, /* sq_slice; */
Richard Jones7b9558d2006-05-27 12:29:24 +0000220 0, /* sq_ass_item; */
221 0, /* sq_ass_slice; */
222 0, /* sq_contains; */
223 0, /* sq_inplace_concat; */
224 0 /* sq_inplace_repeat; */
225};
226
Richard Jones7b9558d2006-05-27 12:29:24 +0000227static PyObject *
228BaseException_get_dict(PyBaseExceptionObject *self)
229{
230 if (self->dict == NULL) {
231 self->dict = PyDict_New();
232 if (!self->dict)
233 return NULL;
234 }
235 Py_INCREF(self->dict);
236 return self->dict;
237}
238
239static int
240BaseException_set_dict(PyBaseExceptionObject *self, PyObject *val)
241{
242 if (val == NULL) {
243 PyErr_SetString(PyExc_TypeError, "__dict__ may not be deleted");
244 return -1;
245 }
246 if (!PyDict_Check(val)) {
247 PyErr_SetString(PyExc_TypeError, "__dict__ must be a dictionary");
248 return -1;
249 }
250 Py_CLEAR(self->dict);
251 Py_INCREF(val);
252 self->dict = val;
253 return 0;
254}
255
256static PyObject *
257BaseException_get_args(PyBaseExceptionObject *self)
258{
259 if (self->args == NULL) {
260 Py_INCREF(Py_None);
261 return Py_None;
262 }
263 Py_INCREF(self->args);
264 return self->args;
265}
266
267static int
268BaseException_set_args(PyBaseExceptionObject *self, PyObject *val)
269{
270 PyObject *seq;
271 if (val == NULL) {
272 PyErr_SetString(PyExc_TypeError, "args may not be deleted");
273 return -1;
274 }
275 seq = PySequence_Tuple(val);
276 if (!seq) return -1;
Georg Brandlc7c51142006-05-29 09:46:51 +0000277 Py_CLEAR(self->args);
Richard Jones7b9558d2006-05-27 12:29:24 +0000278 self->args = seq;
279 return 0;
280}
281
Brett Cannon229cee22007-05-05 01:34:02 +0000282static PyObject *
283BaseException_get_message(PyBaseExceptionObject *self)
284{
285 int ret;
286 ret = PyErr_WarnEx(PyExc_DeprecationWarning,
287 "BaseException.message has been deprecated as "
288 "of Python 2.6",
289 1);
290 if (ret == -1)
291 return NULL;
292
293 Py_INCREF(self->message);
294 return self->message;
295}
296
297static int
298BaseException_set_message(PyBaseExceptionObject *self, PyObject *val)
299{
300 int ret;
301 ret = PyErr_WarnEx(PyExc_DeprecationWarning,
302 "BaseException.message has been deprecated as "
303 "of Python 2.6",
304 1);
305 if (ret == -1)
306 return -1;
307 Py_INCREF(val);
308 Py_DECREF(self->message);
309 self->message = val;
310 return 0;
311}
312
Richard Jones7b9558d2006-05-27 12:29:24 +0000313static PyGetSetDef BaseException_getset[] = {
314 {"__dict__", (getter)BaseException_get_dict, (setter)BaseException_set_dict},
315 {"args", (getter)BaseException_get_args, (setter)BaseException_set_args},
Brett Cannon229cee22007-05-05 01:34:02 +0000316 {"message", (getter)BaseException_get_message,
317 (setter)BaseException_set_message},
Richard Jones7b9558d2006-05-27 12:29:24 +0000318 {NULL},
319};
320
321
322static PyTypeObject _PyExc_BaseException = {
323 PyObject_HEAD_INIT(NULL)
324 0, /*ob_size*/
325 EXC_MODULE_NAME "BaseException", /*tp_name*/
326 sizeof(PyBaseExceptionObject), /*tp_basicsize*/
327 0, /*tp_itemsize*/
328 (destructor)BaseException_dealloc, /*tp_dealloc*/
329 0, /*tp_print*/
330 0, /*tp_getattr*/
331 0, /*tp_setattr*/
332 0, /* tp_compare; */
333 (reprfunc)BaseException_repr, /*tp_repr*/
334 0, /*tp_as_number*/
335 &BaseException_as_sequence, /*tp_as_sequence*/
336 0, /*tp_as_mapping*/
337 0, /*tp_hash */
338 0, /*tp_call*/
339 (reprfunc)BaseException_str, /*tp_str*/
340 PyObject_GenericGetAttr, /*tp_getattro*/
341 PyObject_GenericSetAttr, /*tp_setattro*/
342 0, /*tp_as_buffer*/
Neal Norwitzee3a1b52007-02-25 19:44:48 +0000343 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC |
344 Py_TPFLAGS_BASE_EXC_SUBCLASS, /*tp_flags*/
Richard Jones7b9558d2006-05-27 12:29:24 +0000345 PyDoc_STR("Common base class for all exceptions"), /* tp_doc */
346 (traverseproc)BaseException_traverse, /* tp_traverse */
347 (inquiry)BaseException_clear, /* tp_clear */
348 0, /* tp_richcompare */
349 0, /* tp_weaklistoffset */
350 0, /* tp_iter */
351 0, /* tp_iternext */
352 BaseException_methods, /* tp_methods */
Brett Cannon229cee22007-05-05 01:34:02 +0000353 0, /* tp_members */
Richard Jones7b9558d2006-05-27 12:29:24 +0000354 BaseException_getset, /* tp_getset */
355 0, /* tp_base */
356 0, /* tp_dict */
357 0, /* tp_descr_get */
358 0, /* tp_descr_set */
359 offsetof(PyBaseExceptionObject, dict), /* tp_dictoffset */
360 (initproc)BaseException_init, /* tp_init */
361 0, /* tp_alloc */
362 BaseException_new, /* tp_new */
363};
364/* the CPython API expects exceptions to be (PyObject *) - both a hold-over
365from the previous implmentation and also allowing Python objects to be used
366in the API */
367PyObject *PyExc_BaseException = (PyObject *)&_PyExc_BaseException;
368
Richard Jones2d555b32006-05-27 16:15:11 +0000369/* note these macros omit the last semicolon so the macro invocation may
370 * include it and not look strange.
371 */
Richard Jones7b9558d2006-05-27 12:29:24 +0000372#define SimpleExtendsException(EXCBASE, EXCNAME, EXCDOC) \
373static PyTypeObject _PyExc_ ## EXCNAME = { \
374 PyObject_HEAD_INIT(NULL) \
375 0, \
376 EXC_MODULE_NAME # EXCNAME, \
377 sizeof(PyBaseExceptionObject), \
378 0, (destructor)BaseException_dealloc, 0, 0, 0, 0, 0, 0, 0, \
379 0, 0, 0, 0, 0, 0, 0, \
380 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
381 PyDoc_STR(EXCDOC), (traverseproc)BaseException_traverse, \
382 (inquiry)BaseException_clear, 0, 0, 0, 0, 0, 0, 0, &_ ## EXCBASE, \
383 0, 0, 0, offsetof(PyBaseExceptionObject, dict), \
384 (initproc)BaseException_init, 0, BaseException_new,\
385}; \
Richard Jones2d555b32006-05-27 16:15:11 +0000386PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
Richard Jones7b9558d2006-05-27 12:29:24 +0000387
388#define MiddlingExtendsException(EXCBASE, EXCNAME, EXCSTORE, EXCDOC) \
389static PyTypeObject _PyExc_ ## EXCNAME = { \
390 PyObject_HEAD_INIT(NULL) \
391 0, \
392 EXC_MODULE_NAME # EXCNAME, \
393 sizeof(Py ## EXCSTORE ## Object), \
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000394 0, (destructor)EXCSTORE ## _dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
Richard Jones7b9558d2006-05-27 12:29:24 +0000395 0, 0, 0, 0, 0, \
396 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000397 PyDoc_STR(EXCDOC), (traverseproc)EXCSTORE ## _traverse, \
398 (inquiry)EXCSTORE ## _clear, 0, 0, 0, 0, 0, 0, 0, &_ ## EXCBASE, \
Richard Jones7b9558d2006-05-27 12:29:24 +0000399 0, 0, 0, offsetof(Py ## EXCSTORE ## Object, dict), \
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000400 (initproc)EXCSTORE ## _init, 0, BaseException_new,\
Richard Jones7b9558d2006-05-27 12:29:24 +0000401}; \
Richard Jones2d555b32006-05-27 16:15:11 +0000402PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
Richard Jones7b9558d2006-05-27 12:29:24 +0000403
404#define ComplexExtendsException(EXCBASE, EXCNAME, EXCSTORE, EXCDEALLOC, EXCMETHODS, EXCMEMBERS, EXCSTR, EXCDOC) \
405static PyTypeObject _PyExc_ ## EXCNAME = { \
406 PyObject_HEAD_INIT(NULL) \
407 0, \
408 EXC_MODULE_NAME # EXCNAME, \
409 sizeof(Py ## EXCSTORE ## Object), 0, \
410 (destructor)EXCSTORE ## _dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
411 (reprfunc)EXCSTR, 0, 0, 0, \
412 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
413 PyDoc_STR(EXCDOC), (traverseproc)EXCSTORE ## _traverse, \
414 (inquiry)EXCSTORE ## _clear, 0, 0, 0, 0, EXCMETHODS, \
415 EXCMEMBERS, 0, &_ ## EXCBASE, \
416 0, 0, 0, offsetof(Py ## EXCSTORE ## Object, dict), \
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000417 (initproc)EXCSTORE ## _init, 0, BaseException_new,\
Richard Jones7b9558d2006-05-27 12:29:24 +0000418}; \
Richard Jones2d555b32006-05-27 16:15:11 +0000419PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
Richard Jones7b9558d2006-05-27 12:29:24 +0000420
421
422/*
423 * Exception extends BaseException
424 */
425SimpleExtendsException(PyExc_BaseException, Exception,
Richard Jones2d555b32006-05-27 16:15:11 +0000426 "Common base class for all non-exit exceptions.");
Richard Jones7b9558d2006-05-27 12:29:24 +0000427
428
429/*
430 * StandardError extends Exception
431 */
Michael W. Hudson22a80e72006-05-28 15:51:40 +0000432SimpleExtendsException(PyExc_Exception, StandardError,
Richard Jones7b9558d2006-05-27 12:29:24 +0000433 "Base class for all standard Python exceptions that do not represent\n"
Richard Jones2d555b32006-05-27 16:15:11 +0000434 "interpreter exiting.");
Richard Jones7b9558d2006-05-27 12:29:24 +0000435
436
437/*
438 * TypeError extends StandardError
439 */
440SimpleExtendsException(PyExc_StandardError, TypeError,
Richard Jones2d555b32006-05-27 16:15:11 +0000441 "Inappropriate argument type.");
Richard Jones7b9558d2006-05-27 12:29:24 +0000442
443
444/*
445 * StopIteration extends Exception
446 */
447SimpleExtendsException(PyExc_Exception, StopIteration,
Richard Jones2d555b32006-05-27 16:15:11 +0000448 "Signal the end from iterator.next().");
Richard Jones7b9558d2006-05-27 12:29:24 +0000449
450
451/*
Christian Heimes44eeaec2007-12-03 20:01:02 +0000452 * GeneratorExit extends BaseException
Richard Jones7b9558d2006-05-27 12:29:24 +0000453 */
Christian Heimes44eeaec2007-12-03 20:01:02 +0000454SimpleExtendsException(PyExc_BaseException, GeneratorExit,
Richard Jones2d555b32006-05-27 16:15:11 +0000455 "Request that a generator exit.");
Richard Jones7b9558d2006-05-27 12:29:24 +0000456
457
458/*
459 * SystemExit extends BaseException
460 */
Richard Jones7b9558d2006-05-27 12:29:24 +0000461
462static int
463SystemExit_init(PySystemExitObject *self, PyObject *args, PyObject *kwds)
464{
465 Py_ssize_t size = PyTuple_GET_SIZE(args);
466
467 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
468 return -1;
469
Michael W. Hudson22a80e72006-05-28 15:51:40 +0000470 if (size == 0)
471 return 0;
472 Py_CLEAR(self->code);
Richard Jones7b9558d2006-05-27 12:29:24 +0000473 if (size == 1)
474 self->code = PyTuple_GET_ITEM(args, 0);
475 else if (size > 1)
476 self->code = args;
477 Py_INCREF(self->code);
478 return 0;
479}
480
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000481static int
Richard Jones7b9558d2006-05-27 12:29:24 +0000482SystemExit_clear(PySystemExitObject *self)
483{
484 Py_CLEAR(self->code);
485 return BaseException_clear((PyBaseExceptionObject *)self);
486}
487
488static void
489SystemExit_dealloc(PySystemExitObject *self)
490{
Georg Brandl38f62372006-09-06 06:50:05 +0000491 _PyObject_GC_UNTRACK(self);
Richard Jones7b9558d2006-05-27 12:29:24 +0000492 SystemExit_clear(self);
Christian Heimese93237d2007-12-19 02:37:44 +0000493 Py_TYPE(self)->tp_free((PyObject *)self);
Richard Jones7b9558d2006-05-27 12:29:24 +0000494}
495
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000496static int
Richard Jones7b9558d2006-05-27 12:29:24 +0000497SystemExit_traverse(PySystemExitObject *self, visitproc visit, void *arg)
498{
499 Py_VISIT(self->code);
500 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
501}
502
503static PyMemberDef SystemExit_members[] = {
Richard Jones7b9558d2006-05-27 12:29:24 +0000504 {"code", T_OBJECT, offsetof(PySystemExitObject, code), 0,
505 PyDoc_STR("exception code")},
506 {NULL} /* Sentinel */
507};
508
509ComplexExtendsException(PyExc_BaseException, SystemExit, SystemExit,
510 SystemExit_dealloc, 0, SystemExit_members, 0,
Richard Jones2d555b32006-05-27 16:15:11 +0000511 "Request to exit from the interpreter.");
Richard Jones7b9558d2006-05-27 12:29:24 +0000512
513/*
514 * KeyboardInterrupt extends BaseException
515 */
516SimpleExtendsException(PyExc_BaseException, KeyboardInterrupt,
Richard Jones2d555b32006-05-27 16:15:11 +0000517 "Program interrupted by user.");
Richard Jones7b9558d2006-05-27 12:29:24 +0000518
519
520/*
521 * ImportError extends StandardError
522 */
523SimpleExtendsException(PyExc_StandardError, ImportError,
Richard Jones2d555b32006-05-27 16:15:11 +0000524 "Import can't find module, or can't find name in module.");
Richard Jones7b9558d2006-05-27 12:29:24 +0000525
526
527/*
528 * EnvironmentError extends StandardError
529 */
530
Richard Jones7b9558d2006-05-27 12:29:24 +0000531/* Where a function has a single filename, such as open() or some
532 * of the os module functions, PyErr_SetFromErrnoWithFilename() is
533 * called, giving a third argument which is the filename. But, so
534 * that old code using in-place unpacking doesn't break, e.g.:
535 *
536 * except IOError, (errno, strerror):
537 *
538 * we hack args so that it only contains two items. This also
539 * means we need our own __str__() which prints out the filename
540 * when it was supplied.
541 */
542static int
543EnvironmentError_init(PyEnvironmentErrorObject *self, PyObject *args,
544 PyObject *kwds)
545{
546 PyObject *myerrno = NULL, *strerror = NULL, *filename = NULL;
547 PyObject *subslice = NULL;
548
549 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
550 return -1;
551
Georg Brandl3267d282006-09-30 09:03:42 +0000552 if (PyTuple_GET_SIZE(args) <= 1 || PyTuple_GET_SIZE(args) > 3) {
Richard Jones7b9558d2006-05-27 12:29:24 +0000553 return 0;
554 }
Michael W. Hudson22a80e72006-05-28 15:51:40 +0000555
556 if (!PyArg_UnpackTuple(args, "EnvironmentError", 2, 3,
Richard Jones7b9558d2006-05-27 12:29:24 +0000557 &myerrno, &strerror, &filename)) {
558 return -1;
559 }
Michael W. Hudson22a80e72006-05-28 15:51:40 +0000560 Py_CLEAR(self->myerrno); /* replacing */
Richard Jones7b9558d2006-05-27 12:29:24 +0000561 self->myerrno = myerrno;
562 Py_INCREF(self->myerrno);
563
Michael W. Hudson22a80e72006-05-28 15:51:40 +0000564 Py_CLEAR(self->strerror); /* replacing */
Richard Jones7b9558d2006-05-27 12:29:24 +0000565 self->strerror = strerror;
566 Py_INCREF(self->strerror);
567
568 /* self->filename will remain Py_None otherwise */
569 if (filename != NULL) {
Michael W. Hudson22a80e72006-05-28 15:51:40 +0000570 Py_CLEAR(self->filename); /* replacing */
Richard Jones7b9558d2006-05-27 12:29:24 +0000571 self->filename = filename;
572 Py_INCREF(self->filename);
573
574 subslice = PyTuple_GetSlice(args, 0, 2);
575 if (!subslice)
576 return -1;
577
578 Py_DECREF(self->args); /* replacing args */
579 self->args = subslice;
580 }
581 return 0;
582}
583
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000584static int
Richard Jones7b9558d2006-05-27 12:29:24 +0000585EnvironmentError_clear(PyEnvironmentErrorObject *self)
586{
587 Py_CLEAR(self->myerrno);
588 Py_CLEAR(self->strerror);
589 Py_CLEAR(self->filename);
590 return BaseException_clear((PyBaseExceptionObject *)self);
591}
592
593static void
594EnvironmentError_dealloc(PyEnvironmentErrorObject *self)
595{
Georg Brandl38f62372006-09-06 06:50:05 +0000596 _PyObject_GC_UNTRACK(self);
Richard Jones7b9558d2006-05-27 12:29:24 +0000597 EnvironmentError_clear(self);
Christian Heimese93237d2007-12-19 02:37:44 +0000598 Py_TYPE(self)->tp_free((PyObject *)self);
Richard Jones7b9558d2006-05-27 12:29:24 +0000599}
600
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000601static int
Richard Jones7b9558d2006-05-27 12:29:24 +0000602EnvironmentError_traverse(PyEnvironmentErrorObject *self, visitproc visit,
603 void *arg)
604{
605 Py_VISIT(self->myerrno);
606 Py_VISIT(self->strerror);
607 Py_VISIT(self->filename);
608 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
609}
610
611static PyObject *
612EnvironmentError_str(PyEnvironmentErrorObject *self)
613{
614 PyObject *rtnval = NULL;
615
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000616 if (self->filename) {
617 PyObject *fmt;
618 PyObject *repr;
619 PyObject *tuple;
Richard Jones7b9558d2006-05-27 12:29:24 +0000620
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000621 fmt = PyString_FromString("[Errno %s] %s: %s");
622 if (!fmt)
623 return NULL;
624
625 repr = PyObject_Repr(self->filename);
626 if (!repr) {
627 Py_DECREF(fmt);
Richard Jones7b9558d2006-05-27 12:29:24 +0000628 return NULL;
629 }
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000630 tuple = PyTuple_New(3);
631 if (!tuple) {
632 Py_DECREF(repr);
633 Py_DECREF(fmt);
634 return NULL;
635 }
636
637 if (self->myerrno) {
638 Py_INCREF(self->myerrno);
639 PyTuple_SET_ITEM(tuple, 0, self->myerrno);
640 }
641 else {
642 Py_INCREF(Py_None);
643 PyTuple_SET_ITEM(tuple, 0, Py_None);
644 }
645 if (self->strerror) {
646 Py_INCREF(self->strerror);
647 PyTuple_SET_ITEM(tuple, 1, self->strerror);
648 }
649 else {
650 Py_INCREF(Py_None);
651 PyTuple_SET_ITEM(tuple, 1, Py_None);
652 }
653
Richard Jones7b9558d2006-05-27 12:29:24 +0000654 PyTuple_SET_ITEM(tuple, 2, repr);
655
656 rtnval = PyString_Format(fmt, tuple);
657
658 Py_DECREF(fmt);
659 Py_DECREF(tuple);
660 }
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000661 else if (self->myerrno && self->strerror) {
662 PyObject *fmt;
663 PyObject *tuple;
Richard Jones7b9558d2006-05-27 12:29:24 +0000664
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000665 fmt = PyString_FromString("[Errno %s] %s");
666 if (!fmt)
667 return NULL;
668
669 tuple = PyTuple_New(2);
670 if (!tuple) {
671 Py_DECREF(fmt);
Richard Jones7b9558d2006-05-27 12:29:24 +0000672 return NULL;
673 }
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000674
675 if (self->myerrno) {
676 Py_INCREF(self->myerrno);
677 PyTuple_SET_ITEM(tuple, 0, self->myerrno);
678 }
679 else {
680 Py_INCREF(Py_None);
681 PyTuple_SET_ITEM(tuple, 0, Py_None);
682 }
683 if (self->strerror) {
684 Py_INCREF(self->strerror);
685 PyTuple_SET_ITEM(tuple, 1, self->strerror);
686 }
687 else {
688 Py_INCREF(Py_None);
689 PyTuple_SET_ITEM(tuple, 1, Py_None);
690 }
Richard Jones7b9558d2006-05-27 12:29:24 +0000691
692 rtnval = PyString_Format(fmt, tuple);
693
694 Py_DECREF(fmt);
695 Py_DECREF(tuple);
696 }
697 else
698 rtnval = BaseException_str((PyBaseExceptionObject *)self);
699
700 return rtnval;
701}
702
703static PyMemberDef EnvironmentError_members[] = {
Richard Jones7b9558d2006-05-27 12:29:24 +0000704 {"errno", T_OBJECT, offsetof(PyEnvironmentErrorObject, myerrno), 0,
Richard Jonesc5b2a2e2006-05-27 16:07:28 +0000705 PyDoc_STR("exception errno")},
Richard Jones7b9558d2006-05-27 12:29:24 +0000706 {"strerror", T_OBJECT, offsetof(PyEnvironmentErrorObject, strerror), 0,
Richard Jonesc5b2a2e2006-05-27 16:07:28 +0000707 PyDoc_STR("exception strerror")},
Richard Jones7b9558d2006-05-27 12:29:24 +0000708 {"filename", T_OBJECT, offsetof(PyEnvironmentErrorObject, filename), 0,
Richard Jonesc5b2a2e2006-05-27 16:07:28 +0000709 PyDoc_STR("exception filename")},
Richard Jones7b9558d2006-05-27 12:29:24 +0000710 {NULL} /* Sentinel */
711};
712
713
714static PyObject *
715EnvironmentError_reduce(PyEnvironmentErrorObject *self)
716{
717 PyObject *args = self->args;
718 PyObject *res = NULL, *tmp;
Georg Brandl05f97bf2006-05-30 07:13:29 +0000719
Richard Jones7b9558d2006-05-27 12:29:24 +0000720 /* self->args is only the first two real arguments if there was a
721 * file name given to EnvironmentError. */
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000722 if (PyTuple_GET_SIZE(args) == 2 && self->filename) {
Richard Jones7b9558d2006-05-27 12:29:24 +0000723 args = PyTuple_New(3);
724 if (!args) return NULL;
Michael W. Hudson22a80e72006-05-28 15:51:40 +0000725
726 tmp = PyTuple_GET_ITEM(self->args, 0);
Richard Jones7b9558d2006-05-27 12:29:24 +0000727 Py_INCREF(tmp);
728 PyTuple_SET_ITEM(args, 0, tmp);
Michael W. Hudson22a80e72006-05-28 15:51:40 +0000729
730 tmp = PyTuple_GET_ITEM(self->args, 1);
Richard Jones7b9558d2006-05-27 12:29:24 +0000731 Py_INCREF(tmp);
732 PyTuple_SET_ITEM(args, 1, tmp);
733
734 Py_INCREF(self->filename);
735 PyTuple_SET_ITEM(args, 2, self->filename);
Georg Brandl05f97bf2006-05-30 07:13:29 +0000736 } else
Richard Jones7b9558d2006-05-27 12:29:24 +0000737 Py_INCREF(args);
Georg Brandl05f97bf2006-05-30 07:13:29 +0000738
739 if (self->dict)
Christian Heimese93237d2007-12-19 02:37:44 +0000740 res = PyTuple_Pack(3, Py_TYPE(self), args, self->dict);
Georg Brandl05f97bf2006-05-30 07:13:29 +0000741 else
Christian Heimese93237d2007-12-19 02:37:44 +0000742 res = PyTuple_Pack(2, Py_TYPE(self), args);
Richard Jones7b9558d2006-05-27 12:29:24 +0000743 Py_DECREF(args);
744 return res;
745}
746
747
748static PyMethodDef EnvironmentError_methods[] = {
749 {"__reduce__", (PyCFunction)EnvironmentError_reduce, METH_NOARGS},
750 {NULL}
751};
752
753ComplexExtendsException(PyExc_StandardError, EnvironmentError,
754 EnvironmentError, EnvironmentError_dealloc,
755 EnvironmentError_methods, EnvironmentError_members,
Michael W. Hudson22a80e72006-05-28 15:51:40 +0000756 EnvironmentError_str,
Richard Jones2d555b32006-05-27 16:15:11 +0000757 "Base class for I/O related errors.");
Richard Jones7b9558d2006-05-27 12:29:24 +0000758
759
760/*
761 * IOError extends EnvironmentError
762 */
Michael W. Hudson22a80e72006-05-28 15:51:40 +0000763MiddlingExtendsException(PyExc_EnvironmentError, IOError,
Richard Jones2d555b32006-05-27 16:15:11 +0000764 EnvironmentError, "I/O operation failed.");
Richard Jones7b9558d2006-05-27 12:29:24 +0000765
766
767/*
768 * OSError extends EnvironmentError
769 */
770MiddlingExtendsException(PyExc_EnvironmentError, OSError,
Richard Jones2d555b32006-05-27 16:15:11 +0000771 EnvironmentError, "OS system call failed.");
Richard Jones7b9558d2006-05-27 12:29:24 +0000772
773
774/*
775 * WindowsError extends OSError
776 */
777#ifdef MS_WINDOWS
778#include "errmap.h"
779
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000780static int
Richard Jones7b9558d2006-05-27 12:29:24 +0000781WindowsError_clear(PyWindowsErrorObject *self)
782{
783 Py_CLEAR(self->myerrno);
784 Py_CLEAR(self->strerror);
785 Py_CLEAR(self->filename);
786 Py_CLEAR(self->winerror);
787 return BaseException_clear((PyBaseExceptionObject *)self);
788}
789
790static void
791WindowsError_dealloc(PyWindowsErrorObject *self)
792{
Georg Brandl38f62372006-09-06 06:50:05 +0000793 _PyObject_GC_UNTRACK(self);
Richard Jones7b9558d2006-05-27 12:29:24 +0000794 WindowsError_clear(self);
Christian Heimese93237d2007-12-19 02:37:44 +0000795 Py_TYPE(self)->tp_free((PyObject *)self);
Richard Jones7b9558d2006-05-27 12:29:24 +0000796}
797
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000798static int
Richard Jones7b9558d2006-05-27 12:29:24 +0000799WindowsError_traverse(PyWindowsErrorObject *self, visitproc visit, void *arg)
800{
801 Py_VISIT(self->myerrno);
802 Py_VISIT(self->strerror);
803 Py_VISIT(self->filename);
804 Py_VISIT(self->winerror);
805 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
806}
807
Richard Jones7b9558d2006-05-27 12:29:24 +0000808static int
809WindowsError_init(PyWindowsErrorObject *self, PyObject *args, PyObject *kwds)
810{
811 PyObject *o_errcode = NULL;
812 long errcode;
813 long posix_errno;
814
815 if (EnvironmentError_init((PyEnvironmentErrorObject *)self, args, kwds)
816 == -1)
817 return -1;
818
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000819 if (self->myerrno == NULL)
Richard Jones7b9558d2006-05-27 12:29:24 +0000820 return 0;
Richard Jones7b9558d2006-05-27 12:29:24 +0000821
822 /* Set errno to the POSIX errno, and winerror to the Win32
823 error code. */
824 errcode = PyInt_AsLong(self->myerrno);
825 if (errcode == -1 && PyErr_Occurred())
826 return -1;
827 posix_errno = winerror_to_errno(errcode);
828
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000829 Py_CLEAR(self->winerror);
Richard Jones7b9558d2006-05-27 12:29:24 +0000830 self->winerror = self->myerrno;
831
832 o_errcode = PyInt_FromLong(posix_errno);
833 if (!o_errcode)
834 return -1;
835
836 self->myerrno = o_errcode;
837
838 return 0;
839}
840
841
842static PyObject *
843WindowsError_str(PyWindowsErrorObject *self)
844{
Richard Jones7b9558d2006-05-27 12:29:24 +0000845 PyObject *rtnval = NULL;
846
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000847 if (self->filename) {
848 PyObject *fmt;
849 PyObject *repr;
850 PyObject *tuple;
Richard Jones7b9558d2006-05-27 12:29:24 +0000851
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000852 fmt = PyString_FromString("[Error %s] %s: %s");
853 if (!fmt)
854 return NULL;
855
856 repr = PyObject_Repr(self->filename);
857 if (!repr) {
858 Py_DECREF(fmt);
859 return NULL;
860 }
861 tuple = PyTuple_New(3);
862 if (!tuple) {
863 Py_DECREF(repr);
864 Py_DECREF(fmt);
865 return NULL;
866 }
867
Thomas Hellerdf08f0b2006-10-27 18:31:36 +0000868 if (self->winerror) {
869 Py_INCREF(self->winerror);
870 PyTuple_SET_ITEM(tuple, 0, self->winerror);
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000871 }
872 else {
873 Py_INCREF(Py_None);
874 PyTuple_SET_ITEM(tuple, 0, Py_None);
875 }
876 if (self->strerror) {
877 Py_INCREF(self->strerror);
878 PyTuple_SET_ITEM(tuple, 1, self->strerror);
879 }
880 else {
881 Py_INCREF(Py_None);
882 PyTuple_SET_ITEM(tuple, 1, Py_None);
883 }
884
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000885 PyTuple_SET_ITEM(tuple, 2, repr);
Richard Jones7b9558d2006-05-27 12:29:24 +0000886
887 rtnval = PyString_Format(fmt, tuple);
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000888
889 Py_DECREF(fmt);
Richard Jones7b9558d2006-05-27 12:29:24 +0000890 Py_DECREF(tuple);
891 }
Thomas Hellerdf08f0b2006-10-27 18:31:36 +0000892 else if (self->winerror && self->strerror) {
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000893 PyObject *fmt;
894 PyObject *tuple;
895
Richard Jones7b9558d2006-05-27 12:29:24 +0000896 fmt = PyString_FromString("[Error %s] %s");
897 if (!fmt)
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000898 return NULL;
Richard Jones7b9558d2006-05-27 12:29:24 +0000899
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000900 tuple = PyTuple_New(2);
901 if (!tuple) {
902 Py_DECREF(fmt);
903 return NULL;
904 }
905
Thomas Hellerdf08f0b2006-10-27 18:31:36 +0000906 if (self->winerror) {
907 Py_INCREF(self->winerror);
908 PyTuple_SET_ITEM(tuple, 0, self->winerror);
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000909 }
910 else {
911 Py_INCREF(Py_None);
912 PyTuple_SET_ITEM(tuple, 0, Py_None);
913 }
914 if (self->strerror) {
915 Py_INCREF(self->strerror);
916 PyTuple_SET_ITEM(tuple, 1, self->strerror);
917 }
918 else {
919 Py_INCREF(Py_None);
920 PyTuple_SET_ITEM(tuple, 1, Py_None);
921 }
Richard Jones7b9558d2006-05-27 12:29:24 +0000922
923 rtnval = PyString_Format(fmt, tuple);
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000924
925 Py_DECREF(fmt);
Richard Jones7b9558d2006-05-27 12:29:24 +0000926 Py_DECREF(tuple);
927 }
928 else
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000929 rtnval = EnvironmentError_str((PyEnvironmentErrorObject *)self);
Richard Jones7b9558d2006-05-27 12:29:24 +0000930
Richard Jones7b9558d2006-05-27 12:29:24 +0000931 return rtnval;
932}
933
934static PyMemberDef WindowsError_members[] = {
Richard Jones7b9558d2006-05-27 12:29:24 +0000935 {"errno", T_OBJECT, offsetof(PyWindowsErrorObject, myerrno), 0,
Richard Jonesc5b2a2e2006-05-27 16:07:28 +0000936 PyDoc_STR("POSIX exception code")},
Richard Jones7b9558d2006-05-27 12:29:24 +0000937 {"strerror", T_OBJECT, offsetof(PyWindowsErrorObject, strerror), 0,
Richard Jonesc5b2a2e2006-05-27 16:07:28 +0000938 PyDoc_STR("exception strerror")},
Richard Jones7b9558d2006-05-27 12:29:24 +0000939 {"filename", T_OBJECT, offsetof(PyWindowsErrorObject, filename), 0,
Richard Jonesc5b2a2e2006-05-27 16:07:28 +0000940 PyDoc_STR("exception filename")},
Richard Jones7b9558d2006-05-27 12:29:24 +0000941 {"winerror", T_OBJECT, offsetof(PyWindowsErrorObject, winerror), 0,
Richard Jonesc5b2a2e2006-05-27 16:07:28 +0000942 PyDoc_STR("Win32 exception code")},
Richard Jones7b9558d2006-05-27 12:29:24 +0000943 {NULL} /* Sentinel */
944};
945
Richard Jones2d555b32006-05-27 16:15:11 +0000946ComplexExtendsException(PyExc_OSError, WindowsError, WindowsError,
947 WindowsError_dealloc, 0, WindowsError_members,
948 WindowsError_str, "MS-Windows OS system call failed.");
Richard Jones7b9558d2006-05-27 12:29:24 +0000949
950#endif /* MS_WINDOWS */
951
952
953/*
954 * VMSError extends OSError (I think)
955 */
956#ifdef __VMS
957MiddlingExtendsException(PyExc_OSError, VMSError, EnvironmentError,
Richard Jones2d555b32006-05-27 16:15:11 +0000958 "OpenVMS OS system call failed.");
Richard Jones7b9558d2006-05-27 12:29:24 +0000959#endif
960
961
962/*
963 * EOFError extends StandardError
964 */
965SimpleExtendsException(PyExc_StandardError, EOFError,
Richard Jones2d555b32006-05-27 16:15:11 +0000966 "Read beyond end of file.");
Richard Jones7b9558d2006-05-27 12:29:24 +0000967
968
969/*
970 * RuntimeError extends StandardError
971 */
972SimpleExtendsException(PyExc_StandardError, RuntimeError,
Richard Jones2d555b32006-05-27 16:15:11 +0000973 "Unspecified run-time error.");
Richard Jones7b9558d2006-05-27 12:29:24 +0000974
975
976/*
977 * NotImplementedError extends RuntimeError
978 */
979SimpleExtendsException(PyExc_RuntimeError, NotImplementedError,
Richard Jones2d555b32006-05-27 16:15:11 +0000980 "Method or function hasn't been implemented yet.");
Richard Jones7b9558d2006-05-27 12:29:24 +0000981
982/*
983 * NameError extends StandardError
984 */
985SimpleExtendsException(PyExc_StandardError, NameError,
Richard Jones2d555b32006-05-27 16:15:11 +0000986 "Name not found globally.");
Richard Jones7b9558d2006-05-27 12:29:24 +0000987
988/*
989 * UnboundLocalError extends NameError
990 */
991SimpleExtendsException(PyExc_NameError, UnboundLocalError,
Richard Jones2d555b32006-05-27 16:15:11 +0000992 "Local name referenced but not bound to a value.");
Richard Jones7b9558d2006-05-27 12:29:24 +0000993
994/*
995 * AttributeError extends StandardError
996 */
997SimpleExtendsException(PyExc_StandardError, AttributeError,
Richard Jones2d555b32006-05-27 16:15:11 +0000998 "Attribute not found.");
Richard Jones7b9558d2006-05-27 12:29:24 +0000999
1000
1001/*
1002 * SyntaxError extends StandardError
1003 */
Richard Jones7b9558d2006-05-27 12:29:24 +00001004
1005static int
1006SyntaxError_init(PySyntaxErrorObject *self, PyObject *args, PyObject *kwds)
1007{
1008 PyObject *info = NULL;
1009 Py_ssize_t lenargs = PyTuple_GET_SIZE(args);
1010
1011 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1012 return -1;
1013
1014 if (lenargs >= 1) {
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001015 Py_CLEAR(self->msg);
Richard Jones7b9558d2006-05-27 12:29:24 +00001016 self->msg = PyTuple_GET_ITEM(args, 0);
1017 Py_INCREF(self->msg);
1018 }
1019 if (lenargs == 2) {
1020 info = PyTuple_GET_ITEM(args, 1);
1021 info = PySequence_Tuple(info);
1022 if (!info) return -1;
1023
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001024 if (PyTuple_GET_SIZE(info) != 4) {
1025 /* not a very good error message, but it's what Python 2.4 gives */
1026 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
1027 Py_DECREF(info);
1028 return -1;
1029 }
1030
1031 Py_CLEAR(self->filename);
Richard Jones7b9558d2006-05-27 12:29:24 +00001032 self->filename = PyTuple_GET_ITEM(info, 0);
1033 Py_INCREF(self->filename);
1034
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001035 Py_CLEAR(self->lineno);
Richard Jones7b9558d2006-05-27 12:29:24 +00001036 self->lineno = PyTuple_GET_ITEM(info, 1);
1037 Py_INCREF(self->lineno);
1038
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001039 Py_CLEAR(self->offset);
Richard Jones7b9558d2006-05-27 12:29:24 +00001040 self->offset = PyTuple_GET_ITEM(info, 2);
1041 Py_INCREF(self->offset);
1042
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001043 Py_CLEAR(self->text);
Richard Jones7b9558d2006-05-27 12:29:24 +00001044 self->text = PyTuple_GET_ITEM(info, 3);
1045 Py_INCREF(self->text);
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001046
1047 Py_DECREF(info);
Richard Jones7b9558d2006-05-27 12:29:24 +00001048 }
1049 return 0;
1050}
1051
Michael W. Hudson96495ee2006-05-28 17:40:29 +00001052static int
Richard Jones7b9558d2006-05-27 12:29:24 +00001053SyntaxError_clear(PySyntaxErrorObject *self)
1054{
1055 Py_CLEAR(self->msg);
1056 Py_CLEAR(self->filename);
1057 Py_CLEAR(self->lineno);
1058 Py_CLEAR(self->offset);
1059 Py_CLEAR(self->text);
1060 Py_CLEAR(self->print_file_and_line);
1061 return BaseException_clear((PyBaseExceptionObject *)self);
1062}
1063
1064static void
1065SyntaxError_dealloc(PySyntaxErrorObject *self)
1066{
Georg Brandl38f62372006-09-06 06:50:05 +00001067 _PyObject_GC_UNTRACK(self);
Richard Jones7b9558d2006-05-27 12:29:24 +00001068 SyntaxError_clear(self);
Christian Heimese93237d2007-12-19 02:37:44 +00001069 Py_TYPE(self)->tp_free((PyObject *)self);
Richard Jones7b9558d2006-05-27 12:29:24 +00001070}
1071
Michael W. Hudson96495ee2006-05-28 17:40:29 +00001072static int
Richard Jones7b9558d2006-05-27 12:29:24 +00001073SyntaxError_traverse(PySyntaxErrorObject *self, visitproc visit, void *arg)
1074{
1075 Py_VISIT(self->msg);
1076 Py_VISIT(self->filename);
1077 Py_VISIT(self->lineno);
1078 Py_VISIT(self->offset);
1079 Py_VISIT(self->text);
1080 Py_VISIT(self->print_file_and_line);
1081 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1082}
1083
1084/* This is called "my_basename" instead of just "basename" to avoid name
1085 conflicts with glibc; basename is already prototyped if _GNU_SOURCE is
1086 defined, and Python does define that. */
1087static char *
1088my_basename(char *name)
1089{
1090 char *cp = name;
1091 char *result = name;
1092
1093 if (name == NULL)
1094 return "???";
1095 while (*cp != '\0') {
1096 if (*cp == SEP)
1097 result = cp + 1;
1098 ++cp;
1099 }
1100 return result;
1101}
1102
1103
1104static PyObject *
1105SyntaxError_str(PySyntaxErrorObject *self)
1106{
1107 PyObject *str;
1108 PyObject *result;
Georg Brandl43ab1002006-05-28 20:57:09 +00001109 int have_filename = 0;
1110 int have_lineno = 0;
1111 char *buffer = NULL;
Thomas Woutersc1282ee2006-05-28 21:32:12 +00001112 Py_ssize_t bufsize;
Richard Jones7b9558d2006-05-27 12:29:24 +00001113
Michael W. Hudson96495ee2006-05-28 17:40:29 +00001114 if (self->msg)
1115 str = PyObject_Str(self->msg);
1116 else
1117 str = PyObject_Str(Py_None);
Georg Brandl43ab1002006-05-28 20:57:09 +00001118 if (!str) return NULL;
1119 /* Don't fiddle with non-string return (shouldn't happen anyway) */
1120 if (!PyString_Check(str)) return str;
Richard Jones7b9558d2006-05-27 12:29:24 +00001121
1122 /* XXX -- do all the additional formatting with filename and
1123 lineno here */
1124
Georg Brandl43ab1002006-05-28 20:57:09 +00001125 have_filename = (self->filename != NULL) &&
1126 PyString_Check(self->filename);
1127 have_lineno = (self->lineno != NULL) && PyInt_Check(self->lineno);
Richard Jones7b9558d2006-05-27 12:29:24 +00001128
Georg Brandl43ab1002006-05-28 20:57:09 +00001129 if (!have_filename && !have_lineno)
1130 return str;
Richard Jones7b9558d2006-05-27 12:29:24 +00001131
Thomas Woutersc1282ee2006-05-28 21:32:12 +00001132 bufsize = PyString_GET_SIZE(str) + 64;
Georg Brandl43ab1002006-05-28 20:57:09 +00001133 if (have_filename)
1134 bufsize += PyString_GET_SIZE(self->filename);
Richard Jones7b9558d2006-05-27 12:29:24 +00001135
Georg Brandl43ab1002006-05-28 20:57:09 +00001136 buffer = PyMem_MALLOC(bufsize);
1137 if (buffer == NULL)
1138 return str;
Richard Jones7b9558d2006-05-27 12:29:24 +00001139
Georg Brandl43ab1002006-05-28 20:57:09 +00001140 if (have_filename && have_lineno)
1141 PyOS_snprintf(buffer, bufsize, "%s (%s, line %ld)",
1142 PyString_AS_STRING(str),
1143 my_basename(PyString_AS_STRING(self->filename)),
1144 PyInt_AsLong(self->lineno));
1145 else if (have_filename)
1146 PyOS_snprintf(buffer, bufsize, "%s (%s)",
1147 PyString_AS_STRING(str),
1148 my_basename(PyString_AS_STRING(self->filename)));
1149 else /* only have_lineno */
1150 PyOS_snprintf(buffer, bufsize, "%s (line %ld)",
1151 PyString_AS_STRING(str),
1152 PyInt_AsLong(self->lineno));
Richard Jones7b9558d2006-05-27 12:29:24 +00001153
Georg Brandl43ab1002006-05-28 20:57:09 +00001154 result = PyString_FromString(buffer);
1155 PyMem_FREE(buffer);
1156
1157 if (result == NULL)
1158 result = str;
1159 else
1160 Py_DECREF(str);
Richard Jones7b9558d2006-05-27 12:29:24 +00001161 return result;
1162}
1163
1164static PyMemberDef SyntaxError_members[] = {
Richard Jones7b9558d2006-05-27 12:29:24 +00001165 {"msg", T_OBJECT, offsetof(PySyntaxErrorObject, msg), 0,
1166 PyDoc_STR("exception msg")},
1167 {"filename", T_OBJECT, offsetof(PySyntaxErrorObject, filename), 0,
1168 PyDoc_STR("exception filename")},
1169 {"lineno", T_OBJECT, offsetof(PySyntaxErrorObject, lineno), 0,
1170 PyDoc_STR("exception lineno")},
1171 {"offset", T_OBJECT, offsetof(PySyntaxErrorObject, offset), 0,
1172 PyDoc_STR("exception offset")},
1173 {"text", T_OBJECT, offsetof(PySyntaxErrorObject, text), 0,
1174 PyDoc_STR("exception text")},
1175 {"print_file_and_line", T_OBJECT,
1176 offsetof(PySyntaxErrorObject, print_file_and_line), 0,
1177 PyDoc_STR("exception print_file_and_line")},
1178 {NULL} /* Sentinel */
1179};
1180
1181ComplexExtendsException(PyExc_StandardError, SyntaxError, SyntaxError,
1182 SyntaxError_dealloc, 0, SyntaxError_members,
Richard Jones2d555b32006-05-27 16:15:11 +00001183 SyntaxError_str, "Invalid syntax.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001184
1185
1186/*
1187 * IndentationError extends SyntaxError
1188 */
1189MiddlingExtendsException(PyExc_SyntaxError, IndentationError, SyntaxError,
Richard Jones2d555b32006-05-27 16:15:11 +00001190 "Improper indentation.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001191
1192
1193/*
1194 * TabError extends IndentationError
1195 */
1196MiddlingExtendsException(PyExc_IndentationError, TabError, SyntaxError,
Richard Jones2d555b32006-05-27 16:15:11 +00001197 "Improper mixture of spaces and tabs.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001198
1199
1200/*
1201 * LookupError extends StandardError
1202 */
1203SimpleExtendsException(PyExc_StandardError, LookupError,
Richard Jones2d555b32006-05-27 16:15:11 +00001204 "Base class for lookup errors.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001205
1206
1207/*
1208 * IndexError extends LookupError
1209 */
1210SimpleExtendsException(PyExc_LookupError, IndexError,
Richard Jones2d555b32006-05-27 16:15:11 +00001211 "Sequence index out of range.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001212
1213
1214/*
1215 * KeyError extends LookupError
1216 */
1217static PyObject *
1218KeyError_str(PyBaseExceptionObject *self)
1219{
1220 /* If args is a tuple of exactly one item, apply repr to args[0].
1221 This is done so that e.g. the exception raised by {}[''] prints
1222 KeyError: ''
1223 rather than the confusing
1224 KeyError
1225 alone. The downside is that if KeyError is raised with an explanatory
1226 string, that string will be displayed in quotes. Too bad.
1227 If args is anything else, use the default BaseException__str__().
1228 */
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001229 if (PyTuple_GET_SIZE(self->args) == 1) {
1230 return PyObject_Repr(PyTuple_GET_ITEM(self->args, 0));
Richard Jones7b9558d2006-05-27 12:29:24 +00001231 }
1232 return BaseException_str(self);
1233}
1234
1235ComplexExtendsException(PyExc_LookupError, KeyError, BaseException,
Richard Jones2d555b32006-05-27 16:15:11 +00001236 0, 0, 0, KeyError_str, "Mapping key not found.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001237
1238
1239/*
1240 * ValueError extends StandardError
1241 */
1242SimpleExtendsException(PyExc_StandardError, ValueError,
Richard Jones2d555b32006-05-27 16:15:11 +00001243 "Inappropriate argument value (of correct type).");
Richard Jones7b9558d2006-05-27 12:29:24 +00001244
1245/*
1246 * UnicodeError extends ValueError
1247 */
1248
1249SimpleExtendsException(PyExc_ValueError, UnicodeError,
Richard Jones2d555b32006-05-27 16:15:11 +00001250 "Unicode related error.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001251
1252#ifdef Py_USING_UNICODE
Richard Jones7b9558d2006-05-27 12:29:24 +00001253static PyObject *
1254get_string(PyObject *attr, const char *name)
1255{
1256 if (!attr) {
1257 PyErr_Format(PyExc_TypeError, "%.200s attribute not set", name);
1258 return NULL;
1259 }
1260
1261 if (!PyString_Check(attr)) {
1262 PyErr_Format(PyExc_TypeError, "%.200s attribute must be str", name);
1263 return NULL;
1264 }
1265 Py_INCREF(attr);
1266 return attr;
1267}
1268
1269
1270static int
1271set_string(PyObject **attr, const char *value)
1272{
1273 PyObject *obj = PyString_FromString(value);
1274 if (!obj)
1275 return -1;
Georg Brandl43ab1002006-05-28 20:57:09 +00001276 Py_CLEAR(*attr);
Richard Jones7b9558d2006-05-27 12:29:24 +00001277 *attr = obj;
1278 return 0;
1279}
1280
1281
1282static PyObject *
1283get_unicode(PyObject *attr, const char *name)
1284{
1285 if (!attr) {
1286 PyErr_Format(PyExc_TypeError, "%.200s attribute not set", name);
1287 return NULL;
1288 }
1289
1290 if (!PyUnicode_Check(attr)) {
1291 PyErr_Format(PyExc_TypeError,
1292 "%.200s attribute must be unicode", name);
1293 return NULL;
1294 }
1295 Py_INCREF(attr);
1296 return attr;
1297}
1298
1299PyObject *
1300PyUnicodeEncodeError_GetEncoding(PyObject *exc)
1301{
1302 return get_string(((PyUnicodeErrorObject *)exc)->encoding, "encoding");
1303}
1304
1305PyObject *
1306PyUnicodeDecodeError_GetEncoding(PyObject *exc)
1307{
1308 return get_string(((PyUnicodeErrorObject *)exc)->encoding, "encoding");
1309}
1310
1311PyObject *
1312PyUnicodeEncodeError_GetObject(PyObject *exc)
1313{
1314 return get_unicode(((PyUnicodeErrorObject *)exc)->object, "object");
1315}
1316
1317PyObject *
1318PyUnicodeDecodeError_GetObject(PyObject *exc)
1319{
1320 return get_string(((PyUnicodeErrorObject *)exc)->object, "object");
1321}
1322
1323PyObject *
1324PyUnicodeTranslateError_GetObject(PyObject *exc)
1325{
1326 return get_unicode(((PyUnicodeErrorObject *)exc)->object, "object");
1327}
1328
1329int
1330PyUnicodeEncodeError_GetStart(PyObject *exc, Py_ssize_t *start)
1331{
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001332 Py_ssize_t size;
1333 PyObject *obj = get_unicode(((PyUnicodeErrorObject *)exc)->object,
1334 "object");
1335 if (!obj)
1336 return -1;
1337 *start = ((PyUnicodeErrorObject *)exc)->start;
1338 size = PyUnicode_GET_SIZE(obj);
1339 if (*start<0)
1340 *start = 0; /*XXX check for values <0*/
1341 if (*start>=size)
1342 *start = size-1;
1343 Py_DECREF(obj);
1344 return 0;
Richard Jones7b9558d2006-05-27 12:29:24 +00001345}
1346
1347
1348int
1349PyUnicodeDecodeError_GetStart(PyObject *exc, Py_ssize_t *start)
1350{
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001351 Py_ssize_t size;
1352 PyObject *obj = get_string(((PyUnicodeErrorObject *)exc)->object,
1353 "object");
1354 if (!obj)
1355 return -1;
1356 size = PyString_GET_SIZE(obj);
1357 *start = ((PyUnicodeErrorObject *)exc)->start;
1358 if (*start<0)
1359 *start = 0;
1360 if (*start>=size)
1361 *start = size-1;
1362 Py_DECREF(obj);
1363 return 0;
Richard Jones7b9558d2006-05-27 12:29:24 +00001364}
1365
1366
1367int
1368PyUnicodeTranslateError_GetStart(PyObject *exc, Py_ssize_t *start)
1369{
1370 return PyUnicodeEncodeError_GetStart(exc, start);
1371}
1372
1373
1374int
1375PyUnicodeEncodeError_SetStart(PyObject *exc, Py_ssize_t start)
1376{
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001377 ((PyUnicodeErrorObject *)exc)->start = start;
1378 return 0;
Richard Jones7b9558d2006-05-27 12:29:24 +00001379}
1380
1381
1382int
1383PyUnicodeDecodeError_SetStart(PyObject *exc, Py_ssize_t start)
1384{
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001385 ((PyUnicodeErrorObject *)exc)->start = start;
1386 return 0;
Richard Jones7b9558d2006-05-27 12:29:24 +00001387}
1388
1389
1390int
1391PyUnicodeTranslateError_SetStart(PyObject *exc, Py_ssize_t start)
1392{
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001393 ((PyUnicodeErrorObject *)exc)->start = start;
1394 return 0;
Richard Jones7b9558d2006-05-27 12:29:24 +00001395}
1396
1397
1398int
1399PyUnicodeEncodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
1400{
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001401 Py_ssize_t size;
1402 PyObject *obj = get_unicode(((PyUnicodeErrorObject *)exc)->object,
1403 "object");
1404 if (!obj)
1405 return -1;
1406 *end = ((PyUnicodeErrorObject *)exc)->end;
1407 size = PyUnicode_GET_SIZE(obj);
1408 if (*end<1)
1409 *end = 1;
1410 if (*end>size)
1411 *end = size;
1412 Py_DECREF(obj);
1413 return 0;
Richard Jones7b9558d2006-05-27 12:29:24 +00001414}
1415
1416
1417int
1418PyUnicodeDecodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
1419{
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001420 Py_ssize_t size;
1421 PyObject *obj = get_string(((PyUnicodeErrorObject *)exc)->object,
1422 "object");
1423 if (!obj)
1424 return -1;
1425 *end = ((PyUnicodeErrorObject *)exc)->end;
1426 size = PyString_GET_SIZE(obj);
1427 if (*end<1)
1428 *end = 1;
1429 if (*end>size)
1430 *end = size;
1431 Py_DECREF(obj);
1432 return 0;
Richard Jones7b9558d2006-05-27 12:29:24 +00001433}
1434
1435
1436int
1437PyUnicodeTranslateError_GetEnd(PyObject *exc, Py_ssize_t *start)
1438{
1439 return PyUnicodeEncodeError_GetEnd(exc, start);
1440}
1441
1442
1443int
1444PyUnicodeEncodeError_SetEnd(PyObject *exc, Py_ssize_t end)
1445{
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001446 ((PyUnicodeErrorObject *)exc)->end = end;
1447 return 0;
Richard Jones7b9558d2006-05-27 12:29:24 +00001448}
1449
1450
1451int
1452PyUnicodeDecodeError_SetEnd(PyObject *exc, Py_ssize_t end)
1453{
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001454 ((PyUnicodeErrorObject *)exc)->end = end;
1455 return 0;
Richard Jones7b9558d2006-05-27 12:29:24 +00001456}
1457
1458
1459int
1460PyUnicodeTranslateError_SetEnd(PyObject *exc, Py_ssize_t end)
1461{
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001462 ((PyUnicodeErrorObject *)exc)->end = end;
1463 return 0;
Richard Jones7b9558d2006-05-27 12:29:24 +00001464}
1465
1466PyObject *
1467PyUnicodeEncodeError_GetReason(PyObject *exc)
1468{
1469 return get_string(((PyUnicodeErrorObject *)exc)->reason, "reason");
1470}
1471
1472
1473PyObject *
1474PyUnicodeDecodeError_GetReason(PyObject *exc)
1475{
1476 return get_string(((PyUnicodeErrorObject *)exc)->reason, "reason");
1477}
1478
1479
1480PyObject *
1481PyUnicodeTranslateError_GetReason(PyObject *exc)
1482{
1483 return get_string(((PyUnicodeErrorObject *)exc)->reason, "reason");
1484}
1485
1486
1487int
1488PyUnicodeEncodeError_SetReason(PyObject *exc, const char *reason)
1489{
1490 return set_string(&((PyUnicodeErrorObject *)exc)->reason, reason);
1491}
1492
1493
1494int
1495PyUnicodeDecodeError_SetReason(PyObject *exc, const char *reason)
1496{
1497 return set_string(&((PyUnicodeErrorObject *)exc)->reason, reason);
1498}
1499
1500
1501int
1502PyUnicodeTranslateError_SetReason(PyObject *exc, const char *reason)
1503{
1504 return set_string(&((PyUnicodeErrorObject *)exc)->reason, reason);
1505}
1506
1507
Richard Jones7b9558d2006-05-27 12:29:24 +00001508static int
1509UnicodeError_init(PyUnicodeErrorObject *self, PyObject *args, PyObject *kwds,
1510 PyTypeObject *objecttype)
1511{
Michael W. Hudson96495ee2006-05-28 17:40:29 +00001512 Py_CLEAR(self->encoding);
1513 Py_CLEAR(self->object);
Michael W. Hudson96495ee2006-05-28 17:40:29 +00001514 Py_CLEAR(self->reason);
1515
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001516 if (!PyArg_ParseTuple(args, "O!O!nnO!",
Richard Jones7b9558d2006-05-27 12:29:24 +00001517 &PyString_Type, &self->encoding,
1518 objecttype, &self->object,
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001519 &self->start,
1520 &self->end,
Richard Jones7b9558d2006-05-27 12:29:24 +00001521 &PyString_Type, &self->reason)) {
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001522 self->encoding = self->object = self->reason = NULL;
Richard Jones7b9558d2006-05-27 12:29:24 +00001523 return -1;
1524 }
1525
1526 Py_INCREF(self->encoding);
1527 Py_INCREF(self->object);
Richard Jones7b9558d2006-05-27 12:29:24 +00001528 Py_INCREF(self->reason);
1529
1530 return 0;
1531}
1532
Michael W. Hudson96495ee2006-05-28 17:40:29 +00001533static int
Richard Jones7b9558d2006-05-27 12:29:24 +00001534UnicodeError_clear(PyUnicodeErrorObject *self)
1535{
1536 Py_CLEAR(self->encoding);
1537 Py_CLEAR(self->object);
Richard Jones7b9558d2006-05-27 12:29:24 +00001538 Py_CLEAR(self->reason);
1539 return BaseException_clear((PyBaseExceptionObject *)self);
1540}
1541
1542static void
1543UnicodeError_dealloc(PyUnicodeErrorObject *self)
1544{
Georg Brandl38f62372006-09-06 06:50:05 +00001545 _PyObject_GC_UNTRACK(self);
Richard Jones7b9558d2006-05-27 12:29:24 +00001546 UnicodeError_clear(self);
Christian Heimese93237d2007-12-19 02:37:44 +00001547 Py_TYPE(self)->tp_free((PyObject *)self);
Richard Jones7b9558d2006-05-27 12:29:24 +00001548}
1549
Michael W. Hudson96495ee2006-05-28 17:40:29 +00001550static int
Richard Jones7b9558d2006-05-27 12:29:24 +00001551UnicodeError_traverse(PyUnicodeErrorObject *self, visitproc visit, void *arg)
1552{
1553 Py_VISIT(self->encoding);
1554 Py_VISIT(self->object);
Richard Jones7b9558d2006-05-27 12:29:24 +00001555 Py_VISIT(self->reason);
1556 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1557}
1558
1559static PyMemberDef UnicodeError_members[] = {
Richard Jones7b9558d2006-05-27 12:29:24 +00001560 {"encoding", T_OBJECT, offsetof(PyUnicodeErrorObject, encoding), 0,
1561 PyDoc_STR("exception encoding")},
1562 {"object", T_OBJECT, offsetof(PyUnicodeErrorObject, object), 0,
1563 PyDoc_STR("exception object")},
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001564 {"start", T_PYSSIZET, offsetof(PyUnicodeErrorObject, start), 0,
Richard Jones7b9558d2006-05-27 12:29:24 +00001565 PyDoc_STR("exception start")},
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001566 {"end", T_PYSSIZET, offsetof(PyUnicodeErrorObject, end), 0,
Richard Jones7b9558d2006-05-27 12:29:24 +00001567 PyDoc_STR("exception end")},
1568 {"reason", T_OBJECT, offsetof(PyUnicodeErrorObject, reason), 0,
1569 PyDoc_STR("exception reason")},
1570 {NULL} /* Sentinel */
1571};
1572
1573
1574/*
1575 * UnicodeEncodeError extends UnicodeError
1576 */
Richard Jones7b9558d2006-05-27 12:29:24 +00001577
1578static int
1579UnicodeEncodeError_init(PyObject *self, PyObject *args, PyObject *kwds)
1580{
1581 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1582 return -1;
1583 return UnicodeError_init((PyUnicodeErrorObject *)self, args,
1584 kwds, &PyUnicode_Type);
1585}
1586
1587static PyObject *
1588UnicodeEncodeError_str(PyObject *self)
1589{
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001590 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Richard Jones7b9558d2006-05-27 12:29:24 +00001591
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001592 if (uself->end==uself->start+1) {
1593 int badchar = (int)PyUnicode_AS_UNICODE(uself->object)[uself->start];
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001594 char badchar_str[20];
1595 if (badchar <= 0xff)
1596 PyOS_snprintf(badchar_str, sizeof(badchar_str), "x%02x", badchar);
1597 else if (badchar <= 0xffff)
1598 PyOS_snprintf(badchar_str, sizeof(badchar_str), "u%04x", badchar);
1599 else
1600 PyOS_snprintf(badchar_str, sizeof(badchar_str), "U%08x", badchar);
1601 return PyString_FromFormat(
1602 "'%.400s' codec can't encode character u'\\%s' in position %zd: %.400s",
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001603 PyString_AS_STRING(uself->encoding),
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001604 badchar_str,
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001605 uself->start,
1606 PyString_AS_STRING(uself->reason)
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001607 );
Richard Jones7b9558d2006-05-27 12:29:24 +00001608 }
1609 return PyString_FromFormat(
1610 "'%.400s' codec can't encode characters in position %zd-%zd: %.400s",
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001611 PyString_AS_STRING(uself->encoding),
1612 uself->start,
1613 uself->end-1,
1614 PyString_AS_STRING(uself->reason)
Richard Jones7b9558d2006-05-27 12:29:24 +00001615 );
1616}
1617
1618static PyTypeObject _PyExc_UnicodeEncodeError = {
1619 PyObject_HEAD_INIT(NULL)
1620 0,
Georg Brandl38f62372006-09-06 06:50:05 +00001621 EXC_MODULE_NAME "UnicodeEncodeError",
Richard Jones7b9558d2006-05-27 12:29:24 +00001622 sizeof(PyUnicodeErrorObject), 0,
1623 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1624 (reprfunc)UnicodeEncodeError_str, 0, 0, 0,
1625 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Michael W. Hudson27596272006-05-28 21:19:03 +00001626 PyDoc_STR("Unicode encoding error."), (traverseproc)UnicodeError_traverse,
1627 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
Richard Jones7b9558d2006-05-27 12:29:24 +00001628 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Michael W. Hudson96495ee2006-05-28 17:40:29 +00001629 (initproc)UnicodeEncodeError_init, 0, BaseException_new,
Richard Jones7b9558d2006-05-27 12:29:24 +00001630};
1631PyObject *PyExc_UnicodeEncodeError = (PyObject *)&_PyExc_UnicodeEncodeError;
1632
1633PyObject *
1634PyUnicodeEncodeError_Create(
1635 const char *encoding, const Py_UNICODE *object, Py_ssize_t length,
1636 Py_ssize_t start, Py_ssize_t end, const char *reason)
1637{
1638 return PyObject_CallFunction(PyExc_UnicodeEncodeError, "su#nns",
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001639 encoding, object, length, start, end, reason);
Richard Jones7b9558d2006-05-27 12:29:24 +00001640}
1641
1642
1643/*
1644 * UnicodeDecodeError extends UnicodeError
1645 */
Richard Jones7b9558d2006-05-27 12:29:24 +00001646
1647static int
1648UnicodeDecodeError_init(PyObject *self, PyObject *args, PyObject *kwds)
1649{
1650 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1651 return -1;
1652 return UnicodeError_init((PyUnicodeErrorObject *)self, args,
1653 kwds, &PyString_Type);
1654}
1655
1656static PyObject *
1657UnicodeDecodeError_str(PyObject *self)
1658{
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001659 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Richard Jones7b9558d2006-05-27 12:29:24 +00001660
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001661 if (uself->end==uself->start+1) {
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001662 /* FromFormat does not support %02x, so format that separately */
1663 char byte[4];
1664 PyOS_snprintf(byte, sizeof(byte), "%02x",
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001665 ((int)PyString_AS_STRING(uself->object)[uself->start])&0xff);
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001666 return PyString_FromFormat(
1667 "'%.400s' codec can't decode byte 0x%s in position %zd: %.400s",
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001668 PyString_AS_STRING(uself->encoding),
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001669 byte,
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001670 uself->start,
1671 PyString_AS_STRING(uself->reason)
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001672 );
Richard Jones7b9558d2006-05-27 12:29:24 +00001673 }
1674 return PyString_FromFormat(
1675 "'%.400s' codec can't decode bytes in position %zd-%zd: %.400s",
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001676 PyString_AS_STRING(uself->encoding),
1677 uself->start,
1678 uself->end-1,
1679 PyString_AS_STRING(uself->reason)
Richard Jones7b9558d2006-05-27 12:29:24 +00001680 );
1681}
1682
1683static PyTypeObject _PyExc_UnicodeDecodeError = {
1684 PyObject_HEAD_INIT(NULL)
1685 0,
1686 EXC_MODULE_NAME "UnicodeDecodeError",
1687 sizeof(PyUnicodeErrorObject), 0,
1688 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1689 (reprfunc)UnicodeDecodeError_str, 0, 0, 0,
1690 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Michael W. Hudson27596272006-05-28 21:19:03 +00001691 PyDoc_STR("Unicode decoding error."), (traverseproc)UnicodeError_traverse,
1692 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
Richard Jones7b9558d2006-05-27 12:29:24 +00001693 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Michael W. Hudson96495ee2006-05-28 17:40:29 +00001694 (initproc)UnicodeDecodeError_init, 0, BaseException_new,
Richard Jones7b9558d2006-05-27 12:29:24 +00001695};
1696PyObject *PyExc_UnicodeDecodeError = (PyObject *)&_PyExc_UnicodeDecodeError;
1697
1698PyObject *
1699PyUnicodeDecodeError_Create(
1700 const char *encoding, const char *object, Py_ssize_t length,
1701 Py_ssize_t start, Py_ssize_t end, const char *reason)
1702{
1703 assert(length < INT_MAX);
1704 assert(start < INT_MAX);
1705 assert(end < INT_MAX);
1706 return PyObject_CallFunction(PyExc_UnicodeDecodeError, "ss#nns",
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001707 encoding, object, length, start, end, reason);
Richard Jones7b9558d2006-05-27 12:29:24 +00001708}
1709
1710
1711/*
1712 * UnicodeTranslateError extends UnicodeError
1713 */
Richard Jones7b9558d2006-05-27 12:29:24 +00001714
1715static int
1716UnicodeTranslateError_init(PyUnicodeErrorObject *self, PyObject *args,
1717 PyObject *kwds)
1718{
1719 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1720 return -1;
1721
1722 Py_CLEAR(self->object);
Richard Jones7b9558d2006-05-27 12:29:24 +00001723 Py_CLEAR(self->reason);
1724
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001725 if (!PyArg_ParseTuple(args, "O!nnO!",
Richard Jones7b9558d2006-05-27 12:29:24 +00001726 &PyUnicode_Type, &self->object,
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001727 &self->start,
1728 &self->end,
Richard Jones7b9558d2006-05-27 12:29:24 +00001729 &PyString_Type, &self->reason)) {
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001730 self->object = self->reason = NULL;
Richard Jones7b9558d2006-05-27 12:29:24 +00001731 return -1;
1732 }
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001733
Richard Jones7b9558d2006-05-27 12:29:24 +00001734 Py_INCREF(self->object);
Richard Jones7b9558d2006-05-27 12:29:24 +00001735 Py_INCREF(self->reason);
1736
1737 return 0;
1738}
1739
1740
1741static PyObject *
1742UnicodeTranslateError_str(PyObject *self)
1743{
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001744 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Richard Jones7b9558d2006-05-27 12:29:24 +00001745
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001746 if (uself->end==uself->start+1) {
1747 int badchar = (int)PyUnicode_AS_UNICODE(uself->object)[uself->start];
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001748 char badchar_str[20];
1749 if (badchar <= 0xff)
1750 PyOS_snprintf(badchar_str, sizeof(badchar_str), "x%02x", badchar);
1751 else if (badchar <= 0xffff)
1752 PyOS_snprintf(badchar_str, sizeof(badchar_str), "u%04x", badchar);
1753 else
1754 PyOS_snprintf(badchar_str, sizeof(badchar_str), "U%08x", badchar);
1755 return PyString_FromFormat(
Richard Jones7b9558d2006-05-27 12:29:24 +00001756 "can't translate character u'\\%s' in position %zd: %.400s",
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001757 badchar_str,
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001758 uself->start,
1759 PyString_AS_STRING(uself->reason)
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001760 );
Richard Jones7b9558d2006-05-27 12:29:24 +00001761 }
1762 return PyString_FromFormat(
1763 "can't translate characters in position %zd-%zd: %.400s",
Walter Dörwald84a3efe2007-06-13 16:57:12 +00001764 uself->start,
1765 uself->end-1,
1766 PyString_AS_STRING(uself->reason)
Richard Jones7b9558d2006-05-27 12:29:24 +00001767 );
1768}
1769
1770static PyTypeObject _PyExc_UnicodeTranslateError = {
1771 PyObject_HEAD_INIT(NULL)
1772 0,
1773 EXC_MODULE_NAME "UnicodeTranslateError",
1774 sizeof(PyUnicodeErrorObject), 0,
1775 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1776 (reprfunc)UnicodeTranslateError_str, 0, 0, 0,
1777 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Georg Brandl38f62372006-09-06 06:50:05 +00001778 PyDoc_STR("Unicode translation error."), (traverseproc)UnicodeError_traverse,
Richard Jones7b9558d2006-05-27 12:29:24 +00001779 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
1780 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Michael W. Hudson96495ee2006-05-28 17:40:29 +00001781 (initproc)UnicodeTranslateError_init, 0, BaseException_new,
Richard Jones7b9558d2006-05-27 12:29:24 +00001782};
1783PyObject *PyExc_UnicodeTranslateError = (PyObject *)&_PyExc_UnicodeTranslateError;
1784
1785PyObject *
1786PyUnicodeTranslateError_Create(
1787 const Py_UNICODE *object, Py_ssize_t length,
1788 Py_ssize_t start, Py_ssize_t end, const char *reason)
1789{
1790 return PyObject_CallFunction(PyExc_UnicodeTranslateError, "u#nns",
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001791 object, length, start, end, reason);
Richard Jones7b9558d2006-05-27 12:29:24 +00001792}
1793#endif
1794
1795
1796/*
1797 * AssertionError extends StandardError
1798 */
1799SimpleExtendsException(PyExc_StandardError, AssertionError,
Richard Jones2d555b32006-05-27 16:15:11 +00001800 "Assertion failed.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001801
1802
1803/*
1804 * ArithmeticError extends StandardError
1805 */
1806SimpleExtendsException(PyExc_StandardError, ArithmeticError,
Richard Jones2d555b32006-05-27 16:15:11 +00001807 "Base class for arithmetic errors.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001808
1809
1810/*
1811 * FloatingPointError extends ArithmeticError
1812 */
1813SimpleExtendsException(PyExc_ArithmeticError, FloatingPointError,
Richard Jones2d555b32006-05-27 16:15:11 +00001814 "Floating point operation failed.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001815
1816
1817/*
1818 * OverflowError extends ArithmeticError
1819 */
1820SimpleExtendsException(PyExc_ArithmeticError, OverflowError,
Richard Jones2d555b32006-05-27 16:15:11 +00001821 "Result too large to be represented.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001822
1823
1824/*
1825 * ZeroDivisionError extends ArithmeticError
1826 */
1827SimpleExtendsException(PyExc_ArithmeticError, ZeroDivisionError,
Richard Jones2d555b32006-05-27 16:15:11 +00001828 "Second argument to a division or modulo operation was zero.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001829
1830
1831/*
1832 * SystemError extends StandardError
1833 */
1834SimpleExtendsException(PyExc_StandardError, SystemError,
1835 "Internal error in the Python interpreter.\n"
1836 "\n"
1837 "Please report this to the Python maintainer, along with the traceback,\n"
Richard Jones2d555b32006-05-27 16:15:11 +00001838 "the Python version, and the hardware/OS platform and version.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001839
1840
1841/*
1842 * ReferenceError extends StandardError
1843 */
1844SimpleExtendsException(PyExc_StandardError, ReferenceError,
Richard Jones2d555b32006-05-27 16:15:11 +00001845 "Weak ref proxy used after referent went away.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001846
1847
1848/*
1849 * MemoryError extends StandardError
1850 */
Richard Jones2d555b32006-05-27 16:15:11 +00001851SimpleExtendsException(PyExc_StandardError, MemoryError, "Out of memory.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001852
Travis E. Oliphant3781aef2008-03-18 04:44:57 +00001853/*
1854 * BufferError extends StandardError
1855 */
1856SimpleExtendsException(PyExc_StandardError, BufferError, "Buffer error.");
1857
Richard Jones7b9558d2006-05-27 12:29:24 +00001858
1859/* Warning category docstrings */
1860
1861/*
1862 * Warning extends Exception
1863 */
1864SimpleExtendsException(PyExc_Exception, Warning,
Richard Jones2d555b32006-05-27 16:15:11 +00001865 "Base class for warning categories.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001866
1867
1868/*
1869 * UserWarning extends Warning
1870 */
1871SimpleExtendsException(PyExc_Warning, UserWarning,
Richard Jones2d555b32006-05-27 16:15:11 +00001872 "Base class for warnings generated by user code.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001873
1874
1875/*
1876 * DeprecationWarning extends Warning
1877 */
1878SimpleExtendsException(PyExc_Warning, DeprecationWarning,
Richard Jones2d555b32006-05-27 16:15:11 +00001879 "Base class for warnings about deprecated features.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001880
1881
1882/*
1883 * PendingDeprecationWarning extends Warning
1884 */
1885SimpleExtendsException(PyExc_Warning, PendingDeprecationWarning,
1886 "Base class for warnings about features which will be deprecated\n"
Richard Jones2d555b32006-05-27 16:15:11 +00001887 "in the future.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001888
1889
1890/*
1891 * SyntaxWarning extends Warning
1892 */
1893SimpleExtendsException(PyExc_Warning, SyntaxWarning,
Richard Jones2d555b32006-05-27 16:15:11 +00001894 "Base class for warnings about dubious syntax.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001895
1896
1897/*
1898 * RuntimeWarning extends Warning
1899 */
1900SimpleExtendsException(PyExc_Warning, RuntimeWarning,
Richard Jones2d555b32006-05-27 16:15:11 +00001901 "Base class for warnings about dubious runtime behavior.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001902
1903
1904/*
1905 * FutureWarning extends Warning
1906 */
1907SimpleExtendsException(PyExc_Warning, FutureWarning,
1908 "Base class for warnings about constructs that will change semantically\n"
Richard Jones2d555b32006-05-27 16:15:11 +00001909 "in the future.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001910
1911
1912/*
1913 * ImportWarning extends Warning
1914 */
1915SimpleExtendsException(PyExc_Warning, ImportWarning,
Richard Jones2d555b32006-05-27 16:15:11 +00001916 "Base class for warnings about probable mistakes in module imports");
Richard Jones7b9558d2006-05-27 12:29:24 +00001917
1918
Marc-André Lemburg040f76b2006-08-14 10:55:19 +00001919/*
1920 * UnicodeWarning extends Warning
1921 */
1922SimpleExtendsException(PyExc_Warning, UnicodeWarning,
1923 "Base class for warnings about Unicode related problems, mostly\n"
1924 "related to conversion problems.");
1925
1926
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)
Richard Jones7b9558d2006-05-27 12:29:24 +00002034
Richard Jonesc5b2a2e2006-05-27 16:07:28 +00002035 m = Py_InitModule4("exceptions", functions, exceptions_doc,
2036 (PyObject *)NULL, PYTHON_API_VERSION);
Richard Jones7b9558d2006-05-27 12:29:24 +00002037 if (m == NULL) return;
2038
2039 bltinmod = PyImport_ImportModule("__builtin__");
2040 if (bltinmod == NULL)
2041 Py_FatalError("exceptions bootstrapping error.");
2042 bdict = PyModule_GetDict(bltinmod);
2043 if (bdict == NULL)
2044 Py_FatalError("exceptions bootstrapping error.");
2045
2046 POST_INIT(BaseException)
2047 POST_INIT(Exception)
2048 POST_INIT(StandardError)
2049 POST_INIT(TypeError)
2050 POST_INIT(StopIteration)
2051 POST_INIT(GeneratorExit)
2052 POST_INIT(SystemExit)
2053 POST_INIT(KeyboardInterrupt)
2054 POST_INIT(ImportError)
2055 POST_INIT(EnvironmentError)
2056 POST_INIT(IOError)
2057 POST_INIT(OSError)
2058#ifdef MS_WINDOWS
2059 POST_INIT(WindowsError)
2060#endif
2061#ifdef __VMS
2062 POST_INIT(VMSError)
2063#endif
2064 POST_INIT(EOFError)
2065 POST_INIT(RuntimeError)
2066 POST_INIT(NotImplementedError)
2067 POST_INIT(NameError)
2068 POST_INIT(UnboundLocalError)
2069 POST_INIT(AttributeError)
2070 POST_INIT(SyntaxError)
2071 POST_INIT(IndentationError)
2072 POST_INIT(TabError)
2073 POST_INIT(LookupError)
2074 POST_INIT(IndexError)
2075 POST_INIT(KeyError)
2076 POST_INIT(ValueError)
2077 POST_INIT(UnicodeError)
2078#ifdef Py_USING_UNICODE
2079 POST_INIT(UnicodeEncodeError)
2080 POST_INIT(UnicodeDecodeError)
2081 POST_INIT(UnicodeTranslateError)
2082#endif
2083 POST_INIT(AssertionError)
2084 POST_INIT(ArithmeticError)
2085 POST_INIT(FloatingPointError)
2086 POST_INIT(OverflowError)
2087 POST_INIT(ZeroDivisionError)
2088 POST_INIT(SystemError)
2089 POST_INIT(ReferenceError)
2090 POST_INIT(MemoryError)
2091 POST_INIT(Warning)
2092 POST_INIT(UserWarning)
2093 POST_INIT(DeprecationWarning)
2094 POST_INIT(PendingDeprecationWarning)
2095 POST_INIT(SyntaxWarning)
2096 POST_INIT(RuntimeWarning)
2097 POST_INIT(FutureWarning)
2098 POST_INIT(ImportWarning)
Marc-André Lemburg040f76b2006-08-14 10:55:19 +00002099 POST_INIT(UnicodeWarning)
Richard Jones7b9558d2006-05-27 12:29:24 +00002100
2101 PyExc_MemoryErrorInst = BaseException_new(&_PyExc_MemoryError, NULL, NULL);
2102 if (!PyExc_MemoryErrorInst)
2103 Py_FatalError("Cannot pre-allocate MemoryError instance\n");
2104
Brett Cannon1e534b52007-09-07 04:18:30 +00002105 PyExc_RecursionErrorInst = BaseException_new(&_PyExc_RuntimeError, NULL, NULL);
2106 if (!PyExc_RecursionErrorInst)
2107 Py_FatalError("Cannot pre-allocate RuntimeError instance for "
2108 "recursion errors");
2109 else {
2110 PyBaseExceptionObject *err_inst =
2111 (PyBaseExceptionObject *)PyExc_RecursionErrorInst;
2112 PyObject *args_tuple;
2113 PyObject *exc_message;
2114 exc_message = PyString_FromString("maximum recursion depth exceeded");
2115 if (!exc_message)
2116 Py_FatalError("cannot allocate argument for RuntimeError "
2117 "pre-allocation");
2118 args_tuple = PyTuple_Pack(1, exc_message);
2119 if (!args_tuple)
2120 Py_FatalError("cannot allocate tuple for RuntimeError "
2121 "pre-allocation");
2122 Py_DECREF(exc_message);
2123 if (BaseException_init(err_inst, args_tuple, NULL))
2124 Py_FatalError("init of pre-allocated RuntimeError failed");
2125 Py_DECREF(args_tuple);
2126 }
2127
Richard Jones7b9558d2006-05-27 12:29:24 +00002128 Py_DECREF(bltinmod);
Kristján Valur Jónssonf6083172006-06-12 15:45:12 +00002129
Kristján Valur Jónsson74c3ea02006-07-03 14:59:05 +00002130#if defined _MSC_VER && _MSC_VER >= 1400 && defined(__STDC_SECURE_LIB__)
Kristján Valur Jónssonf6083172006-06-12 15:45:12 +00002131 /* Set CRT argument error handler */
2132 prevCrtHandler = _set_invalid_parameter_handler(InvalidParameterHandler);
2133 /* turn off assertions in debug mode */
2134 prevCrtReportMode = _CrtSetReportMode(_CRT_ASSERT, 0);
2135#endif
Richard Jones7b9558d2006-05-27 12:29:24 +00002136}
2137
2138void
2139_PyExc_Fini(void)
2140{
2141 Py_XDECREF(PyExc_MemoryErrorInst);
2142 PyExc_MemoryErrorInst = NULL;
Kristján Valur Jónsson74c3ea02006-07-03 14:59:05 +00002143#if defined _MSC_VER && _MSC_VER >= 1400 && defined(__STDC_SECURE_LIB__)
Kristján Valur Jónssonf6083172006-06-12 15:45:12 +00002144 /* reset CRT error handling */
2145 _set_invalid_parameter_handler(prevCrtHandler);
2146 _CrtSetReportMode(_CRT_ASSERT, prevCrtReportMode);
2147#endif
Richard Jones7b9558d2006-05-27 12:29:24 +00002148}