blob: 927114eb42dad848fdd9a6910daab33bc7938076 [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
41 self->args = PyTuple_New(0);
42 if (!self->args) {
43 Py_DECREF(self);
44 return NULL;
45 }
46
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 }
52
53 return (PyObject *)self;
54}
55
56static int
57BaseException_init(PyBaseExceptionObject *self, PyObject *args, PyObject *kwds)
58{
Georg Brandlb0432bc2006-05-30 08:17:00 +000059 if (!_PyArg_NoKeywords(self->ob_type->tp_name, kwds))
60 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);
88 self->ob_type->tp_free((PyObject *)self);
89}
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
132 name = (char *)self->ob_type->tp_name;
133 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)
151 return PyTuple_Pack(3, self->ob_type, self->args, self->dict);
Georg Brandl05f97bf2006-05-30 07:13:29 +0000152 else
Georg Brandlddba4732006-05-30 07:04:55 +0000153 return PyTuple_Pack(2, self->ob_type, 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{
192 return PySequence_GetItem(self->args, index);
193}
194
Brett Cannonf6aa86e2006-09-20 18:43:13 +0000195static PyObject *
196BaseException_getslice(PyBaseExceptionObject *self,
197 Py_ssize_t start, Py_ssize_t stop)
198{
199 return PySequence_GetSlice(self->args, start, stop);
200}
201
Richard Jones7b9558d2006-05-27 12:29:24 +0000202static PySequenceMethods BaseException_as_sequence = {
203 0, /* sq_length; */
204 0, /* sq_concat; */
205 0, /* sq_repeat; */
206 (ssizeargfunc)BaseException_getitem, /* sq_item; */
Brett Cannonf6aa86e2006-09-20 18:43:13 +0000207 (ssizessizeargfunc)BaseException_getslice, /* sq_slice; */
Richard Jones7b9558d2006-05-27 12:29:24 +0000208 0, /* sq_ass_item; */
209 0, /* sq_ass_slice; */
210 0, /* sq_contains; */
211 0, /* sq_inplace_concat; */
212 0 /* sq_inplace_repeat; */
213};
214
Richard Jones7b9558d2006-05-27 12:29:24 +0000215static PyObject *
216BaseException_get_dict(PyBaseExceptionObject *self)
217{
218 if (self->dict == NULL) {
219 self->dict = PyDict_New();
220 if (!self->dict)
221 return NULL;
222 }
223 Py_INCREF(self->dict);
224 return self->dict;
225}
226
227static int
228BaseException_set_dict(PyBaseExceptionObject *self, PyObject *val)
229{
230 if (val == NULL) {
231 PyErr_SetString(PyExc_TypeError, "__dict__ may not be deleted");
232 return -1;
233 }
234 if (!PyDict_Check(val)) {
235 PyErr_SetString(PyExc_TypeError, "__dict__ must be a dictionary");
236 return -1;
237 }
238 Py_CLEAR(self->dict);
239 Py_INCREF(val);
240 self->dict = val;
241 return 0;
242}
243
244static PyObject *
245BaseException_get_args(PyBaseExceptionObject *self)
246{
247 if (self->args == NULL) {
248 Py_INCREF(Py_None);
249 return Py_None;
250 }
251 Py_INCREF(self->args);
252 return self->args;
253}
254
255static int
256BaseException_set_args(PyBaseExceptionObject *self, PyObject *val)
257{
258 PyObject *seq;
259 if (val == NULL) {
260 PyErr_SetString(PyExc_TypeError, "args may not be deleted");
261 return -1;
262 }
263 seq = PySequence_Tuple(val);
264 if (!seq) return -1;
Georg Brandlc7c51142006-05-29 09:46:51 +0000265 Py_CLEAR(self->args);
Richard Jones7b9558d2006-05-27 12:29:24 +0000266 self->args = seq;
267 return 0;
268}
269
Brett Cannon229cee22007-05-05 01:34:02 +0000270static PyObject *
271BaseException_get_message(PyBaseExceptionObject *self)
272{
273 int ret;
274 ret = PyErr_WarnEx(PyExc_DeprecationWarning,
275 "BaseException.message has been deprecated as "
276 "of Python 2.6",
277 1);
278 if (ret == -1)
279 return NULL;
280
281 Py_INCREF(self->message);
282 return self->message;
283}
284
285static int
286BaseException_set_message(PyBaseExceptionObject *self, PyObject *val)
287{
288 int ret;
289 ret = PyErr_WarnEx(PyExc_DeprecationWarning,
290 "BaseException.message has been deprecated as "
291 "of Python 2.6",
292 1);
293 if (ret == -1)
294 return -1;
295 Py_INCREF(val);
296 Py_DECREF(self->message);
297 self->message = val;
298 return 0;
299}
300
Richard Jones7b9558d2006-05-27 12:29:24 +0000301static PyGetSetDef BaseException_getset[] = {
302 {"__dict__", (getter)BaseException_get_dict, (setter)BaseException_set_dict},
303 {"args", (getter)BaseException_get_args, (setter)BaseException_set_args},
Brett Cannon229cee22007-05-05 01:34:02 +0000304 {"message", (getter)BaseException_get_message,
305 (setter)BaseException_set_message},
Richard Jones7b9558d2006-05-27 12:29:24 +0000306 {NULL},
307};
308
309
310static PyTypeObject _PyExc_BaseException = {
311 PyObject_HEAD_INIT(NULL)
312 0, /*ob_size*/
313 EXC_MODULE_NAME "BaseException", /*tp_name*/
314 sizeof(PyBaseExceptionObject), /*tp_basicsize*/
315 0, /*tp_itemsize*/
316 (destructor)BaseException_dealloc, /*tp_dealloc*/
317 0, /*tp_print*/
318 0, /*tp_getattr*/
319 0, /*tp_setattr*/
320 0, /* tp_compare; */
321 (reprfunc)BaseException_repr, /*tp_repr*/
322 0, /*tp_as_number*/
323 &BaseException_as_sequence, /*tp_as_sequence*/
324 0, /*tp_as_mapping*/
325 0, /*tp_hash */
326 0, /*tp_call*/
327 (reprfunc)BaseException_str, /*tp_str*/
328 PyObject_GenericGetAttr, /*tp_getattro*/
329 PyObject_GenericSetAttr, /*tp_setattro*/
330 0, /*tp_as_buffer*/
Neal Norwitzee3a1b52007-02-25 19:44:48 +0000331 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC |
332 Py_TPFLAGS_BASE_EXC_SUBCLASS, /*tp_flags*/
Richard Jones7b9558d2006-05-27 12:29:24 +0000333 PyDoc_STR("Common base class for all exceptions"), /* tp_doc */
334 (traverseproc)BaseException_traverse, /* tp_traverse */
335 (inquiry)BaseException_clear, /* tp_clear */
336 0, /* tp_richcompare */
337 0, /* tp_weaklistoffset */
338 0, /* tp_iter */
339 0, /* tp_iternext */
340 BaseException_methods, /* tp_methods */
Brett Cannon229cee22007-05-05 01:34:02 +0000341 0, /* tp_members */
Richard Jones7b9558d2006-05-27 12:29:24 +0000342 BaseException_getset, /* tp_getset */
343 0, /* tp_base */
344 0, /* tp_dict */
345 0, /* tp_descr_get */
346 0, /* tp_descr_set */
347 offsetof(PyBaseExceptionObject, dict), /* tp_dictoffset */
348 (initproc)BaseException_init, /* tp_init */
349 0, /* tp_alloc */
350 BaseException_new, /* tp_new */
351};
352/* the CPython API expects exceptions to be (PyObject *) - both a hold-over
353from the previous implmentation and also allowing Python objects to be used
354in the API */
355PyObject *PyExc_BaseException = (PyObject *)&_PyExc_BaseException;
356
Richard Jones2d555b32006-05-27 16:15:11 +0000357/* note these macros omit the last semicolon so the macro invocation may
358 * include it and not look strange.
359 */
Richard Jones7b9558d2006-05-27 12:29:24 +0000360#define SimpleExtendsException(EXCBASE, EXCNAME, EXCDOC) \
361static PyTypeObject _PyExc_ ## EXCNAME = { \
362 PyObject_HEAD_INIT(NULL) \
363 0, \
364 EXC_MODULE_NAME # EXCNAME, \
365 sizeof(PyBaseExceptionObject), \
366 0, (destructor)BaseException_dealloc, 0, 0, 0, 0, 0, 0, 0, \
367 0, 0, 0, 0, 0, 0, 0, \
368 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
369 PyDoc_STR(EXCDOC), (traverseproc)BaseException_traverse, \
370 (inquiry)BaseException_clear, 0, 0, 0, 0, 0, 0, 0, &_ ## EXCBASE, \
371 0, 0, 0, offsetof(PyBaseExceptionObject, dict), \
372 (initproc)BaseException_init, 0, BaseException_new,\
373}; \
Richard Jones2d555b32006-05-27 16:15:11 +0000374PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
Richard Jones7b9558d2006-05-27 12:29:24 +0000375
376#define MiddlingExtendsException(EXCBASE, EXCNAME, EXCSTORE, EXCDOC) \
377static PyTypeObject _PyExc_ ## EXCNAME = { \
378 PyObject_HEAD_INIT(NULL) \
379 0, \
380 EXC_MODULE_NAME # EXCNAME, \
381 sizeof(Py ## EXCSTORE ## Object), \
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000382 0, (destructor)EXCSTORE ## _dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
Richard Jones7b9558d2006-05-27 12:29:24 +0000383 0, 0, 0, 0, 0, \
384 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000385 PyDoc_STR(EXCDOC), (traverseproc)EXCSTORE ## _traverse, \
386 (inquiry)EXCSTORE ## _clear, 0, 0, 0, 0, 0, 0, 0, &_ ## EXCBASE, \
Richard Jones7b9558d2006-05-27 12:29:24 +0000387 0, 0, 0, offsetof(Py ## EXCSTORE ## Object, dict), \
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000388 (initproc)EXCSTORE ## _init, 0, BaseException_new,\
Richard Jones7b9558d2006-05-27 12:29:24 +0000389}; \
Richard Jones2d555b32006-05-27 16:15:11 +0000390PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
Richard Jones7b9558d2006-05-27 12:29:24 +0000391
392#define ComplexExtendsException(EXCBASE, EXCNAME, EXCSTORE, EXCDEALLOC, EXCMETHODS, EXCMEMBERS, EXCSTR, EXCDOC) \
393static PyTypeObject _PyExc_ ## EXCNAME = { \
394 PyObject_HEAD_INIT(NULL) \
395 0, \
396 EXC_MODULE_NAME # EXCNAME, \
397 sizeof(Py ## EXCSTORE ## Object), 0, \
398 (destructor)EXCSTORE ## _dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
399 (reprfunc)EXCSTR, 0, 0, 0, \
400 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
401 PyDoc_STR(EXCDOC), (traverseproc)EXCSTORE ## _traverse, \
402 (inquiry)EXCSTORE ## _clear, 0, 0, 0, 0, EXCMETHODS, \
403 EXCMEMBERS, 0, &_ ## EXCBASE, \
404 0, 0, 0, offsetof(Py ## EXCSTORE ## Object, dict), \
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000405 (initproc)EXCSTORE ## _init, 0, BaseException_new,\
Richard Jones7b9558d2006-05-27 12:29:24 +0000406}; \
Richard Jones2d555b32006-05-27 16:15:11 +0000407PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
Richard Jones7b9558d2006-05-27 12:29:24 +0000408
409
410/*
411 * Exception extends BaseException
412 */
413SimpleExtendsException(PyExc_BaseException, Exception,
Richard Jones2d555b32006-05-27 16:15:11 +0000414 "Common base class for all non-exit exceptions.");
Richard Jones7b9558d2006-05-27 12:29:24 +0000415
416
417/*
418 * StandardError extends Exception
419 */
Michael W. Hudson22a80e72006-05-28 15:51:40 +0000420SimpleExtendsException(PyExc_Exception, StandardError,
Richard Jones7b9558d2006-05-27 12:29:24 +0000421 "Base class for all standard Python exceptions that do not represent\n"
Richard Jones2d555b32006-05-27 16:15:11 +0000422 "interpreter exiting.");
Richard Jones7b9558d2006-05-27 12:29:24 +0000423
424
425/*
426 * TypeError extends StandardError
427 */
428SimpleExtendsException(PyExc_StandardError, TypeError,
Richard Jones2d555b32006-05-27 16:15:11 +0000429 "Inappropriate argument type.");
Richard Jones7b9558d2006-05-27 12:29:24 +0000430
431
432/*
433 * StopIteration extends Exception
434 */
435SimpleExtendsException(PyExc_Exception, StopIteration,
Richard Jones2d555b32006-05-27 16:15:11 +0000436 "Signal the end from iterator.next().");
Richard Jones7b9558d2006-05-27 12:29:24 +0000437
438
439/*
440 * GeneratorExit extends Exception
441 */
442SimpleExtendsException(PyExc_Exception, GeneratorExit,
Richard Jones2d555b32006-05-27 16:15:11 +0000443 "Request that a generator exit.");
Richard Jones7b9558d2006-05-27 12:29:24 +0000444
445
446/*
447 * SystemExit extends BaseException
448 */
Richard Jones7b9558d2006-05-27 12:29:24 +0000449
450static int
451SystemExit_init(PySystemExitObject *self, PyObject *args, PyObject *kwds)
452{
453 Py_ssize_t size = PyTuple_GET_SIZE(args);
454
455 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
456 return -1;
457
Michael W. Hudson22a80e72006-05-28 15:51:40 +0000458 if (size == 0)
459 return 0;
460 Py_CLEAR(self->code);
Richard Jones7b9558d2006-05-27 12:29:24 +0000461 if (size == 1)
462 self->code = PyTuple_GET_ITEM(args, 0);
463 else if (size > 1)
464 self->code = args;
465 Py_INCREF(self->code);
466 return 0;
467}
468
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000469static int
Richard Jones7b9558d2006-05-27 12:29:24 +0000470SystemExit_clear(PySystemExitObject *self)
471{
472 Py_CLEAR(self->code);
473 return BaseException_clear((PyBaseExceptionObject *)self);
474}
475
476static void
477SystemExit_dealloc(PySystemExitObject *self)
478{
Georg Brandl38f62372006-09-06 06:50:05 +0000479 _PyObject_GC_UNTRACK(self);
Richard Jones7b9558d2006-05-27 12:29:24 +0000480 SystemExit_clear(self);
481 self->ob_type->tp_free((PyObject *)self);
482}
483
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000484static int
Richard Jones7b9558d2006-05-27 12:29:24 +0000485SystemExit_traverse(PySystemExitObject *self, visitproc visit, void *arg)
486{
487 Py_VISIT(self->code);
488 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
489}
490
491static PyMemberDef SystemExit_members[] = {
492 {"message", T_OBJECT, offsetof(PySystemExitObject, message), 0,
493 PyDoc_STR("exception message")},
494 {"code", T_OBJECT, offsetof(PySystemExitObject, code), 0,
495 PyDoc_STR("exception code")},
496 {NULL} /* Sentinel */
497};
498
499ComplexExtendsException(PyExc_BaseException, SystemExit, SystemExit,
500 SystemExit_dealloc, 0, SystemExit_members, 0,
Richard Jones2d555b32006-05-27 16:15:11 +0000501 "Request to exit from the interpreter.");
Richard Jones7b9558d2006-05-27 12:29:24 +0000502
503/*
504 * KeyboardInterrupt extends BaseException
505 */
506SimpleExtendsException(PyExc_BaseException, KeyboardInterrupt,
Richard Jones2d555b32006-05-27 16:15:11 +0000507 "Program interrupted by user.");
Richard Jones7b9558d2006-05-27 12:29:24 +0000508
509
510/*
511 * ImportError extends StandardError
512 */
513SimpleExtendsException(PyExc_StandardError, ImportError,
Richard Jones2d555b32006-05-27 16:15:11 +0000514 "Import can't find module, or can't find name in module.");
Richard Jones7b9558d2006-05-27 12:29:24 +0000515
516
517/*
518 * EnvironmentError extends StandardError
519 */
520
Richard Jones7b9558d2006-05-27 12:29:24 +0000521/* Where a function has a single filename, such as open() or some
522 * of the os module functions, PyErr_SetFromErrnoWithFilename() is
523 * called, giving a third argument which is the filename. But, so
524 * that old code using in-place unpacking doesn't break, e.g.:
525 *
526 * except IOError, (errno, strerror):
527 *
528 * we hack args so that it only contains two items. This also
529 * means we need our own __str__() which prints out the filename
530 * when it was supplied.
531 */
532static int
533EnvironmentError_init(PyEnvironmentErrorObject *self, PyObject *args,
534 PyObject *kwds)
535{
536 PyObject *myerrno = NULL, *strerror = NULL, *filename = NULL;
537 PyObject *subslice = NULL;
538
539 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
540 return -1;
541
Georg Brandl3267d282006-09-30 09:03:42 +0000542 if (PyTuple_GET_SIZE(args) <= 1 || PyTuple_GET_SIZE(args) > 3) {
Richard Jones7b9558d2006-05-27 12:29:24 +0000543 return 0;
544 }
Michael W. Hudson22a80e72006-05-28 15:51:40 +0000545
546 if (!PyArg_UnpackTuple(args, "EnvironmentError", 2, 3,
Richard Jones7b9558d2006-05-27 12:29:24 +0000547 &myerrno, &strerror, &filename)) {
548 return -1;
549 }
Michael W. Hudson22a80e72006-05-28 15:51:40 +0000550 Py_CLEAR(self->myerrno); /* replacing */
Richard Jones7b9558d2006-05-27 12:29:24 +0000551 self->myerrno = myerrno;
552 Py_INCREF(self->myerrno);
553
Michael W. Hudson22a80e72006-05-28 15:51:40 +0000554 Py_CLEAR(self->strerror); /* replacing */
Richard Jones7b9558d2006-05-27 12:29:24 +0000555 self->strerror = strerror;
556 Py_INCREF(self->strerror);
557
558 /* self->filename will remain Py_None otherwise */
559 if (filename != NULL) {
Michael W. Hudson22a80e72006-05-28 15:51:40 +0000560 Py_CLEAR(self->filename); /* replacing */
Richard Jones7b9558d2006-05-27 12:29:24 +0000561 self->filename = filename;
562 Py_INCREF(self->filename);
563
564 subslice = PyTuple_GetSlice(args, 0, 2);
565 if (!subslice)
566 return -1;
567
568 Py_DECREF(self->args); /* replacing args */
569 self->args = subslice;
570 }
571 return 0;
572}
573
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000574static int
Richard Jones7b9558d2006-05-27 12:29:24 +0000575EnvironmentError_clear(PyEnvironmentErrorObject *self)
576{
577 Py_CLEAR(self->myerrno);
578 Py_CLEAR(self->strerror);
579 Py_CLEAR(self->filename);
580 return BaseException_clear((PyBaseExceptionObject *)self);
581}
582
583static void
584EnvironmentError_dealloc(PyEnvironmentErrorObject *self)
585{
Georg Brandl38f62372006-09-06 06:50:05 +0000586 _PyObject_GC_UNTRACK(self);
Richard Jones7b9558d2006-05-27 12:29:24 +0000587 EnvironmentError_clear(self);
588 self->ob_type->tp_free((PyObject *)self);
589}
590
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000591static int
Richard Jones7b9558d2006-05-27 12:29:24 +0000592EnvironmentError_traverse(PyEnvironmentErrorObject *self, visitproc visit,
593 void *arg)
594{
595 Py_VISIT(self->myerrno);
596 Py_VISIT(self->strerror);
597 Py_VISIT(self->filename);
598 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
599}
600
601static PyObject *
602EnvironmentError_str(PyEnvironmentErrorObject *self)
603{
604 PyObject *rtnval = NULL;
605
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000606 if (self->filename) {
607 PyObject *fmt;
608 PyObject *repr;
609 PyObject *tuple;
Richard Jones7b9558d2006-05-27 12:29:24 +0000610
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000611 fmt = PyString_FromString("[Errno %s] %s: %s");
612 if (!fmt)
613 return NULL;
614
615 repr = PyObject_Repr(self->filename);
616 if (!repr) {
617 Py_DECREF(fmt);
Richard Jones7b9558d2006-05-27 12:29:24 +0000618 return NULL;
619 }
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000620 tuple = PyTuple_New(3);
621 if (!tuple) {
622 Py_DECREF(repr);
623 Py_DECREF(fmt);
624 return NULL;
625 }
626
627 if (self->myerrno) {
628 Py_INCREF(self->myerrno);
629 PyTuple_SET_ITEM(tuple, 0, self->myerrno);
630 }
631 else {
632 Py_INCREF(Py_None);
633 PyTuple_SET_ITEM(tuple, 0, Py_None);
634 }
635 if (self->strerror) {
636 Py_INCREF(self->strerror);
637 PyTuple_SET_ITEM(tuple, 1, self->strerror);
638 }
639 else {
640 Py_INCREF(Py_None);
641 PyTuple_SET_ITEM(tuple, 1, Py_None);
642 }
643
Richard Jones7b9558d2006-05-27 12:29:24 +0000644 PyTuple_SET_ITEM(tuple, 2, repr);
645
646 rtnval = PyString_Format(fmt, tuple);
647
648 Py_DECREF(fmt);
649 Py_DECREF(tuple);
650 }
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000651 else if (self->myerrno && self->strerror) {
652 PyObject *fmt;
653 PyObject *tuple;
Richard Jones7b9558d2006-05-27 12:29:24 +0000654
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000655 fmt = PyString_FromString("[Errno %s] %s");
656 if (!fmt)
657 return NULL;
658
659 tuple = PyTuple_New(2);
660 if (!tuple) {
661 Py_DECREF(fmt);
Richard Jones7b9558d2006-05-27 12:29:24 +0000662 return NULL;
663 }
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000664
665 if (self->myerrno) {
666 Py_INCREF(self->myerrno);
667 PyTuple_SET_ITEM(tuple, 0, self->myerrno);
668 }
669 else {
670 Py_INCREF(Py_None);
671 PyTuple_SET_ITEM(tuple, 0, Py_None);
672 }
673 if (self->strerror) {
674 Py_INCREF(self->strerror);
675 PyTuple_SET_ITEM(tuple, 1, self->strerror);
676 }
677 else {
678 Py_INCREF(Py_None);
679 PyTuple_SET_ITEM(tuple, 1, Py_None);
680 }
Richard Jones7b9558d2006-05-27 12:29:24 +0000681
682 rtnval = PyString_Format(fmt, tuple);
683
684 Py_DECREF(fmt);
685 Py_DECREF(tuple);
686 }
687 else
688 rtnval = BaseException_str((PyBaseExceptionObject *)self);
689
690 return rtnval;
691}
692
693static PyMemberDef EnvironmentError_members[] = {
694 {"message", T_OBJECT, offsetof(PyEnvironmentErrorObject, message), 0,
695 PyDoc_STR("exception message")},
696 {"errno", T_OBJECT, offsetof(PyEnvironmentErrorObject, myerrno), 0,
Richard Jonesc5b2a2e2006-05-27 16:07:28 +0000697 PyDoc_STR("exception errno")},
Richard Jones7b9558d2006-05-27 12:29:24 +0000698 {"strerror", T_OBJECT, offsetof(PyEnvironmentErrorObject, strerror), 0,
Richard Jonesc5b2a2e2006-05-27 16:07:28 +0000699 PyDoc_STR("exception strerror")},
Richard Jones7b9558d2006-05-27 12:29:24 +0000700 {"filename", T_OBJECT, offsetof(PyEnvironmentErrorObject, filename), 0,
Richard Jonesc5b2a2e2006-05-27 16:07:28 +0000701 PyDoc_STR("exception filename")},
Richard Jones7b9558d2006-05-27 12:29:24 +0000702 {NULL} /* Sentinel */
703};
704
705
706static PyObject *
707EnvironmentError_reduce(PyEnvironmentErrorObject *self)
708{
709 PyObject *args = self->args;
710 PyObject *res = NULL, *tmp;
Georg Brandl05f97bf2006-05-30 07:13:29 +0000711
Richard Jones7b9558d2006-05-27 12:29:24 +0000712 /* self->args is only the first two real arguments if there was a
713 * file name given to EnvironmentError. */
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000714 if (PyTuple_GET_SIZE(args) == 2 && self->filename) {
Richard Jones7b9558d2006-05-27 12:29:24 +0000715 args = PyTuple_New(3);
716 if (!args) return NULL;
Michael W. Hudson22a80e72006-05-28 15:51:40 +0000717
718 tmp = PyTuple_GET_ITEM(self->args, 0);
Richard Jones7b9558d2006-05-27 12:29:24 +0000719 Py_INCREF(tmp);
720 PyTuple_SET_ITEM(args, 0, tmp);
Michael W. Hudson22a80e72006-05-28 15:51:40 +0000721
722 tmp = PyTuple_GET_ITEM(self->args, 1);
Richard Jones7b9558d2006-05-27 12:29:24 +0000723 Py_INCREF(tmp);
724 PyTuple_SET_ITEM(args, 1, tmp);
725
726 Py_INCREF(self->filename);
727 PyTuple_SET_ITEM(args, 2, self->filename);
Georg Brandl05f97bf2006-05-30 07:13:29 +0000728 } else
Richard Jones7b9558d2006-05-27 12:29:24 +0000729 Py_INCREF(args);
Georg Brandl05f97bf2006-05-30 07:13:29 +0000730
731 if (self->dict)
732 res = PyTuple_Pack(3, self->ob_type, args, self->dict);
733 else
734 res = PyTuple_Pack(2, self->ob_type, args);
Richard Jones7b9558d2006-05-27 12:29:24 +0000735 Py_DECREF(args);
736 return res;
737}
738
739
740static PyMethodDef EnvironmentError_methods[] = {
741 {"__reduce__", (PyCFunction)EnvironmentError_reduce, METH_NOARGS},
742 {NULL}
743};
744
745ComplexExtendsException(PyExc_StandardError, EnvironmentError,
746 EnvironmentError, EnvironmentError_dealloc,
747 EnvironmentError_methods, EnvironmentError_members,
Michael W. Hudson22a80e72006-05-28 15:51:40 +0000748 EnvironmentError_str,
Richard Jones2d555b32006-05-27 16:15:11 +0000749 "Base class for I/O related errors.");
Richard Jones7b9558d2006-05-27 12:29:24 +0000750
751
752/*
753 * IOError extends EnvironmentError
754 */
Michael W. Hudson22a80e72006-05-28 15:51:40 +0000755MiddlingExtendsException(PyExc_EnvironmentError, IOError,
Richard Jones2d555b32006-05-27 16:15:11 +0000756 EnvironmentError, "I/O operation failed.");
Richard Jones7b9558d2006-05-27 12:29:24 +0000757
758
759/*
760 * OSError extends EnvironmentError
761 */
762MiddlingExtendsException(PyExc_EnvironmentError, OSError,
Richard Jones2d555b32006-05-27 16:15:11 +0000763 EnvironmentError, "OS system call failed.");
Richard Jones7b9558d2006-05-27 12:29:24 +0000764
765
766/*
767 * WindowsError extends OSError
768 */
769#ifdef MS_WINDOWS
770#include "errmap.h"
771
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000772static int
Richard Jones7b9558d2006-05-27 12:29:24 +0000773WindowsError_clear(PyWindowsErrorObject *self)
774{
775 Py_CLEAR(self->myerrno);
776 Py_CLEAR(self->strerror);
777 Py_CLEAR(self->filename);
778 Py_CLEAR(self->winerror);
779 return BaseException_clear((PyBaseExceptionObject *)self);
780}
781
782static void
783WindowsError_dealloc(PyWindowsErrorObject *self)
784{
Georg Brandl38f62372006-09-06 06:50:05 +0000785 _PyObject_GC_UNTRACK(self);
Richard Jones7b9558d2006-05-27 12:29:24 +0000786 WindowsError_clear(self);
787 self->ob_type->tp_free((PyObject *)self);
788}
789
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000790static int
Richard Jones7b9558d2006-05-27 12:29:24 +0000791WindowsError_traverse(PyWindowsErrorObject *self, visitproc visit, void *arg)
792{
793 Py_VISIT(self->myerrno);
794 Py_VISIT(self->strerror);
795 Py_VISIT(self->filename);
796 Py_VISIT(self->winerror);
797 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
798}
799
Richard Jones7b9558d2006-05-27 12:29:24 +0000800static int
801WindowsError_init(PyWindowsErrorObject *self, PyObject *args, PyObject *kwds)
802{
803 PyObject *o_errcode = NULL;
804 long errcode;
805 long posix_errno;
806
807 if (EnvironmentError_init((PyEnvironmentErrorObject *)self, args, kwds)
808 == -1)
809 return -1;
810
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000811 if (self->myerrno == NULL)
Richard Jones7b9558d2006-05-27 12:29:24 +0000812 return 0;
Richard Jones7b9558d2006-05-27 12:29:24 +0000813
814 /* Set errno to the POSIX errno, and winerror to the Win32
815 error code. */
816 errcode = PyInt_AsLong(self->myerrno);
817 if (errcode == -1 && PyErr_Occurred())
818 return -1;
819 posix_errno = winerror_to_errno(errcode);
820
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000821 Py_CLEAR(self->winerror);
Richard Jones7b9558d2006-05-27 12:29:24 +0000822 self->winerror = self->myerrno;
823
824 o_errcode = PyInt_FromLong(posix_errno);
825 if (!o_errcode)
826 return -1;
827
828 self->myerrno = o_errcode;
829
830 return 0;
831}
832
833
834static PyObject *
835WindowsError_str(PyWindowsErrorObject *self)
836{
Richard Jones7b9558d2006-05-27 12:29:24 +0000837 PyObject *rtnval = NULL;
838
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000839 if (self->filename) {
840 PyObject *fmt;
841 PyObject *repr;
842 PyObject *tuple;
Richard Jones7b9558d2006-05-27 12:29:24 +0000843
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000844 fmt = PyString_FromString("[Error %s] %s: %s");
845 if (!fmt)
846 return NULL;
847
848 repr = PyObject_Repr(self->filename);
849 if (!repr) {
850 Py_DECREF(fmt);
851 return NULL;
852 }
853 tuple = PyTuple_New(3);
854 if (!tuple) {
855 Py_DECREF(repr);
856 Py_DECREF(fmt);
857 return NULL;
858 }
859
Thomas Hellerdf08f0b2006-10-27 18:31:36 +0000860 if (self->winerror) {
861 Py_INCREF(self->winerror);
862 PyTuple_SET_ITEM(tuple, 0, self->winerror);
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000863 }
864 else {
865 Py_INCREF(Py_None);
866 PyTuple_SET_ITEM(tuple, 0, Py_None);
867 }
868 if (self->strerror) {
869 Py_INCREF(self->strerror);
870 PyTuple_SET_ITEM(tuple, 1, self->strerror);
871 }
872 else {
873 Py_INCREF(Py_None);
874 PyTuple_SET_ITEM(tuple, 1, Py_None);
875 }
876
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000877 PyTuple_SET_ITEM(tuple, 2, repr);
Richard Jones7b9558d2006-05-27 12:29:24 +0000878
879 rtnval = PyString_Format(fmt, tuple);
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000880
881 Py_DECREF(fmt);
Richard Jones7b9558d2006-05-27 12:29:24 +0000882 Py_DECREF(tuple);
883 }
Thomas Hellerdf08f0b2006-10-27 18:31:36 +0000884 else if (self->winerror && self->strerror) {
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000885 PyObject *fmt;
886 PyObject *tuple;
887
Richard Jones7b9558d2006-05-27 12:29:24 +0000888 fmt = PyString_FromString("[Error %s] %s");
889 if (!fmt)
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000890 return NULL;
Richard Jones7b9558d2006-05-27 12:29:24 +0000891
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000892 tuple = PyTuple_New(2);
893 if (!tuple) {
894 Py_DECREF(fmt);
895 return NULL;
896 }
897
Thomas Hellerdf08f0b2006-10-27 18:31:36 +0000898 if (self->winerror) {
899 Py_INCREF(self->winerror);
900 PyTuple_SET_ITEM(tuple, 0, self->winerror);
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000901 }
902 else {
903 Py_INCREF(Py_None);
904 PyTuple_SET_ITEM(tuple, 0, Py_None);
905 }
906 if (self->strerror) {
907 Py_INCREF(self->strerror);
908 PyTuple_SET_ITEM(tuple, 1, self->strerror);
909 }
910 else {
911 Py_INCREF(Py_None);
912 PyTuple_SET_ITEM(tuple, 1, Py_None);
913 }
Richard Jones7b9558d2006-05-27 12:29:24 +0000914
915 rtnval = PyString_Format(fmt, tuple);
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000916
917 Py_DECREF(fmt);
Richard Jones7b9558d2006-05-27 12:29:24 +0000918 Py_DECREF(tuple);
919 }
920 else
Michael W. Hudson96495ee2006-05-28 17:40:29 +0000921 rtnval = EnvironmentError_str((PyEnvironmentErrorObject *)self);
Richard Jones7b9558d2006-05-27 12:29:24 +0000922
Richard Jones7b9558d2006-05-27 12:29:24 +0000923 return rtnval;
924}
925
926static PyMemberDef WindowsError_members[] = {
927 {"message", T_OBJECT, offsetof(PyWindowsErrorObject, message), 0,
928 PyDoc_STR("exception message")},
929 {"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);
1063 self->ob_type->tp_free((PyObject *)self);
1064}
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[] = {
1159 {"message", T_OBJECT, offsetof(PySyntaxErrorObject, message), 0,
1160 PyDoc_STR("exception message")},
1161 {"msg", T_OBJECT, offsetof(PySyntaxErrorObject, msg), 0,
1162 PyDoc_STR("exception msg")},
1163 {"filename", T_OBJECT, offsetof(PySyntaxErrorObject, filename), 0,
1164 PyDoc_STR("exception filename")},
1165 {"lineno", T_OBJECT, offsetof(PySyntaxErrorObject, lineno), 0,
1166 PyDoc_STR("exception lineno")},
1167 {"offset", T_OBJECT, offsetof(PySyntaxErrorObject, offset), 0,
1168 PyDoc_STR("exception offset")},
1169 {"text", T_OBJECT, offsetof(PySyntaxErrorObject, text), 0,
1170 PyDoc_STR("exception text")},
1171 {"print_file_and_line", T_OBJECT,
1172 offsetof(PySyntaxErrorObject, print_file_and_line), 0,
1173 PyDoc_STR("exception print_file_and_line")},
1174 {NULL} /* Sentinel */
1175};
1176
1177ComplexExtendsException(PyExc_StandardError, SyntaxError, SyntaxError,
1178 SyntaxError_dealloc, 0, SyntaxError_members,
Richard Jones2d555b32006-05-27 16:15:11 +00001179 SyntaxError_str, "Invalid syntax.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001180
1181
1182/*
1183 * IndentationError extends SyntaxError
1184 */
1185MiddlingExtendsException(PyExc_SyntaxError, IndentationError, SyntaxError,
Richard Jones2d555b32006-05-27 16:15:11 +00001186 "Improper indentation.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001187
1188
1189/*
1190 * TabError extends IndentationError
1191 */
1192MiddlingExtendsException(PyExc_IndentationError, TabError, SyntaxError,
Richard Jones2d555b32006-05-27 16:15:11 +00001193 "Improper mixture of spaces and tabs.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001194
1195
1196/*
1197 * LookupError extends StandardError
1198 */
1199SimpleExtendsException(PyExc_StandardError, LookupError,
Richard Jones2d555b32006-05-27 16:15:11 +00001200 "Base class for lookup errors.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001201
1202
1203/*
1204 * IndexError extends LookupError
1205 */
1206SimpleExtendsException(PyExc_LookupError, IndexError,
Richard Jones2d555b32006-05-27 16:15:11 +00001207 "Sequence index out of range.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001208
1209
1210/*
1211 * KeyError extends LookupError
1212 */
1213static PyObject *
1214KeyError_str(PyBaseExceptionObject *self)
1215{
1216 /* If args is a tuple of exactly one item, apply repr to args[0].
1217 This is done so that e.g. the exception raised by {}[''] prints
1218 KeyError: ''
1219 rather than the confusing
1220 KeyError
1221 alone. The downside is that if KeyError is raised with an explanatory
1222 string, that string will be displayed in quotes. Too bad.
1223 If args is anything else, use the default BaseException__str__().
1224 */
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001225 if (PyTuple_GET_SIZE(self->args) == 1) {
1226 return PyObject_Repr(PyTuple_GET_ITEM(self->args, 0));
Richard Jones7b9558d2006-05-27 12:29:24 +00001227 }
1228 return BaseException_str(self);
1229}
1230
1231ComplexExtendsException(PyExc_LookupError, KeyError, BaseException,
Richard Jones2d555b32006-05-27 16:15:11 +00001232 0, 0, 0, KeyError_str, "Mapping key not found.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001233
1234
1235/*
1236 * ValueError extends StandardError
1237 */
1238SimpleExtendsException(PyExc_StandardError, ValueError,
Richard Jones2d555b32006-05-27 16:15:11 +00001239 "Inappropriate argument value (of correct type).");
Richard Jones7b9558d2006-05-27 12:29:24 +00001240
1241/*
1242 * UnicodeError extends ValueError
1243 */
1244
1245SimpleExtendsException(PyExc_ValueError, UnicodeError,
Richard Jones2d555b32006-05-27 16:15:11 +00001246 "Unicode related error.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001247
1248#ifdef Py_USING_UNICODE
1249static int
1250get_int(PyObject *attr, Py_ssize_t *value, const char *name)
1251{
1252 if (!attr) {
1253 PyErr_Format(PyExc_TypeError, "%.200s attribute not set", name);
1254 return -1;
1255 }
1256
1257 if (PyInt_Check(attr)) {
1258 *value = PyInt_AS_LONG(attr);
1259 } else if (PyLong_Check(attr)) {
1260 *value = _PyLong_AsSsize_t(attr);
1261 if (*value == -1 && PyErr_Occurred())
1262 return -1;
1263 } else {
1264 PyErr_Format(PyExc_TypeError, "%.200s attribute must be int", name);
1265 return -1;
1266 }
1267 return 0;
1268}
1269
1270static int
1271set_ssize_t(PyObject **attr, Py_ssize_t value)
1272{
1273 PyObject *obj = PyInt_FromSsize_t(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
1281static PyObject *
1282get_string(PyObject *attr, const char *name)
1283{
1284 if (!attr) {
1285 PyErr_Format(PyExc_TypeError, "%.200s attribute not set", name);
1286 return NULL;
1287 }
1288
1289 if (!PyString_Check(attr)) {
1290 PyErr_Format(PyExc_TypeError, "%.200s attribute must be str", name);
1291 return NULL;
1292 }
1293 Py_INCREF(attr);
1294 return attr;
1295}
1296
1297
1298static int
1299set_string(PyObject **attr, const char *value)
1300{
1301 PyObject *obj = PyString_FromString(value);
1302 if (!obj)
1303 return -1;
Georg Brandl43ab1002006-05-28 20:57:09 +00001304 Py_CLEAR(*attr);
Richard Jones7b9558d2006-05-27 12:29:24 +00001305 *attr = obj;
1306 return 0;
1307}
1308
1309
1310static PyObject *
1311get_unicode(PyObject *attr, const char *name)
1312{
1313 if (!attr) {
1314 PyErr_Format(PyExc_TypeError, "%.200s attribute not set", name);
1315 return NULL;
1316 }
1317
1318 if (!PyUnicode_Check(attr)) {
1319 PyErr_Format(PyExc_TypeError,
1320 "%.200s attribute must be unicode", name);
1321 return NULL;
1322 }
1323 Py_INCREF(attr);
1324 return attr;
1325}
1326
1327PyObject *
1328PyUnicodeEncodeError_GetEncoding(PyObject *exc)
1329{
1330 return get_string(((PyUnicodeErrorObject *)exc)->encoding, "encoding");
1331}
1332
1333PyObject *
1334PyUnicodeDecodeError_GetEncoding(PyObject *exc)
1335{
1336 return get_string(((PyUnicodeErrorObject *)exc)->encoding, "encoding");
1337}
1338
1339PyObject *
1340PyUnicodeEncodeError_GetObject(PyObject *exc)
1341{
1342 return get_unicode(((PyUnicodeErrorObject *)exc)->object, "object");
1343}
1344
1345PyObject *
1346PyUnicodeDecodeError_GetObject(PyObject *exc)
1347{
1348 return get_string(((PyUnicodeErrorObject *)exc)->object, "object");
1349}
1350
1351PyObject *
1352PyUnicodeTranslateError_GetObject(PyObject *exc)
1353{
1354 return get_unicode(((PyUnicodeErrorObject *)exc)->object, "object");
1355}
1356
1357int
1358PyUnicodeEncodeError_GetStart(PyObject *exc, Py_ssize_t *start)
1359{
1360 if (!get_int(((PyUnicodeErrorObject *)exc)->start, start, "start")) {
1361 Py_ssize_t size;
1362 PyObject *obj = get_unicode(((PyUnicodeErrorObject *)exc)->object,
1363 "object");
1364 if (!obj) return -1;
1365 size = PyUnicode_GET_SIZE(obj);
1366 if (*start<0)
1367 *start = 0; /*XXX check for values <0*/
1368 if (*start>=size)
1369 *start = size-1;
Georg Brandl43ab1002006-05-28 20:57:09 +00001370 Py_DECREF(obj);
Richard Jones7b9558d2006-05-27 12:29:24 +00001371 return 0;
1372 }
1373 return -1;
1374}
1375
1376
1377int
1378PyUnicodeDecodeError_GetStart(PyObject *exc, Py_ssize_t *start)
1379{
1380 if (!get_int(((PyUnicodeErrorObject *)exc)->start, start, "start")) {
1381 Py_ssize_t size;
1382 PyObject *obj = get_string(((PyUnicodeErrorObject *)exc)->object,
1383 "object");
1384 if (!obj) return -1;
1385 size = PyString_GET_SIZE(obj);
1386 if (*start<0)
1387 *start = 0;
1388 if (*start>=size)
1389 *start = size-1;
Georg Brandl43ab1002006-05-28 20:57:09 +00001390 Py_DECREF(obj);
Richard Jones7b9558d2006-05-27 12:29:24 +00001391 return 0;
1392 }
1393 return -1;
1394}
1395
1396
1397int
1398PyUnicodeTranslateError_GetStart(PyObject *exc, Py_ssize_t *start)
1399{
1400 return PyUnicodeEncodeError_GetStart(exc, start);
1401}
1402
1403
1404int
1405PyUnicodeEncodeError_SetStart(PyObject *exc, Py_ssize_t start)
1406{
1407 return set_ssize_t(&((PyUnicodeErrorObject *)exc)->start, start);
1408}
1409
1410
1411int
1412PyUnicodeDecodeError_SetStart(PyObject *exc, Py_ssize_t start)
1413{
1414 return set_ssize_t(&((PyUnicodeErrorObject *)exc)->start, start);
1415}
1416
1417
1418int
1419PyUnicodeTranslateError_SetStart(PyObject *exc, Py_ssize_t start)
1420{
1421 return set_ssize_t(&((PyUnicodeErrorObject *)exc)->start, start);
1422}
1423
1424
1425int
1426PyUnicodeEncodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
1427{
1428 if (!get_int(((PyUnicodeErrorObject *)exc)->end, end, "end")) {
1429 Py_ssize_t size;
1430 PyObject *obj = get_unicode(((PyUnicodeErrorObject *)exc)->object,
1431 "object");
1432 if (!obj) return -1;
1433 size = PyUnicode_GET_SIZE(obj);
1434 if (*end<1)
1435 *end = 1;
1436 if (*end>size)
1437 *end = size;
Georg Brandl43ab1002006-05-28 20:57:09 +00001438 Py_DECREF(obj);
Richard Jones7b9558d2006-05-27 12:29:24 +00001439 return 0;
1440 }
1441 return -1;
1442}
1443
1444
1445int
1446PyUnicodeDecodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
1447{
1448 if (!get_int(((PyUnicodeErrorObject *)exc)->end, end, "end")) {
1449 Py_ssize_t size;
1450 PyObject *obj = get_string(((PyUnicodeErrorObject *)exc)->object,
1451 "object");
1452 if (!obj) return -1;
1453 size = PyString_GET_SIZE(obj);
1454 if (*end<1)
1455 *end = 1;
1456 if (*end>size)
1457 *end = size;
Georg Brandl43ab1002006-05-28 20:57:09 +00001458 Py_DECREF(obj);
Richard Jones7b9558d2006-05-27 12:29:24 +00001459 return 0;
1460 }
1461 return -1;
1462}
1463
1464
1465int
1466PyUnicodeTranslateError_GetEnd(PyObject *exc, Py_ssize_t *start)
1467{
1468 return PyUnicodeEncodeError_GetEnd(exc, start);
1469}
1470
1471
1472int
1473PyUnicodeEncodeError_SetEnd(PyObject *exc, Py_ssize_t end)
1474{
1475 return set_ssize_t(&((PyUnicodeErrorObject *)exc)->end, end);
1476}
1477
1478
1479int
1480PyUnicodeDecodeError_SetEnd(PyObject *exc, Py_ssize_t end)
1481{
1482 return set_ssize_t(&((PyUnicodeErrorObject *)exc)->end, end);
1483}
1484
1485
1486int
1487PyUnicodeTranslateError_SetEnd(PyObject *exc, Py_ssize_t end)
1488{
1489 return set_ssize_t(&((PyUnicodeErrorObject *)exc)->end, end);
1490}
1491
1492PyObject *
1493PyUnicodeEncodeError_GetReason(PyObject *exc)
1494{
1495 return get_string(((PyUnicodeErrorObject *)exc)->reason, "reason");
1496}
1497
1498
1499PyObject *
1500PyUnicodeDecodeError_GetReason(PyObject *exc)
1501{
1502 return get_string(((PyUnicodeErrorObject *)exc)->reason, "reason");
1503}
1504
1505
1506PyObject *
1507PyUnicodeTranslateError_GetReason(PyObject *exc)
1508{
1509 return get_string(((PyUnicodeErrorObject *)exc)->reason, "reason");
1510}
1511
1512
1513int
1514PyUnicodeEncodeError_SetReason(PyObject *exc, const char *reason)
1515{
1516 return set_string(&((PyUnicodeErrorObject *)exc)->reason, reason);
1517}
1518
1519
1520int
1521PyUnicodeDecodeError_SetReason(PyObject *exc, const char *reason)
1522{
1523 return set_string(&((PyUnicodeErrorObject *)exc)->reason, reason);
1524}
1525
1526
1527int
1528PyUnicodeTranslateError_SetReason(PyObject *exc, const char *reason)
1529{
1530 return set_string(&((PyUnicodeErrorObject *)exc)->reason, reason);
1531}
1532
1533
Richard Jones7b9558d2006-05-27 12:29:24 +00001534static int
1535UnicodeError_init(PyUnicodeErrorObject *self, PyObject *args, PyObject *kwds,
1536 PyTypeObject *objecttype)
1537{
Michael W. Hudson96495ee2006-05-28 17:40:29 +00001538 Py_CLEAR(self->encoding);
1539 Py_CLEAR(self->object);
1540 Py_CLEAR(self->start);
1541 Py_CLEAR(self->end);
1542 Py_CLEAR(self->reason);
1543
Richard Jones7b9558d2006-05-27 12:29:24 +00001544 if (!PyArg_ParseTuple(args, "O!O!O!O!O!",
1545 &PyString_Type, &self->encoding,
1546 objecttype, &self->object,
1547 &PyInt_Type, &self->start,
1548 &PyInt_Type, &self->end,
1549 &PyString_Type, &self->reason)) {
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001550 self->encoding = self->object = self->start = self->end =
Richard Jones7b9558d2006-05-27 12:29:24 +00001551 self->reason = NULL;
1552 return -1;
1553 }
1554
1555 Py_INCREF(self->encoding);
1556 Py_INCREF(self->object);
1557 Py_INCREF(self->start);
1558 Py_INCREF(self->end);
1559 Py_INCREF(self->reason);
1560
1561 return 0;
1562}
1563
Michael W. Hudson96495ee2006-05-28 17:40:29 +00001564static int
Richard Jones7b9558d2006-05-27 12:29:24 +00001565UnicodeError_clear(PyUnicodeErrorObject *self)
1566{
1567 Py_CLEAR(self->encoding);
1568 Py_CLEAR(self->object);
1569 Py_CLEAR(self->start);
1570 Py_CLEAR(self->end);
1571 Py_CLEAR(self->reason);
1572 return BaseException_clear((PyBaseExceptionObject *)self);
1573}
1574
1575static void
1576UnicodeError_dealloc(PyUnicodeErrorObject *self)
1577{
Georg Brandl38f62372006-09-06 06:50:05 +00001578 _PyObject_GC_UNTRACK(self);
Richard Jones7b9558d2006-05-27 12:29:24 +00001579 UnicodeError_clear(self);
1580 self->ob_type->tp_free((PyObject *)self);
1581}
1582
Michael W. Hudson96495ee2006-05-28 17:40:29 +00001583static int
Richard Jones7b9558d2006-05-27 12:29:24 +00001584UnicodeError_traverse(PyUnicodeErrorObject *self, visitproc visit, void *arg)
1585{
1586 Py_VISIT(self->encoding);
1587 Py_VISIT(self->object);
1588 Py_VISIT(self->start);
1589 Py_VISIT(self->end);
1590 Py_VISIT(self->reason);
1591 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1592}
1593
1594static PyMemberDef UnicodeError_members[] = {
1595 {"message", T_OBJECT, offsetof(PyUnicodeErrorObject, message), 0,
1596 PyDoc_STR("exception message")},
1597 {"encoding", T_OBJECT, offsetof(PyUnicodeErrorObject, encoding), 0,
1598 PyDoc_STR("exception encoding")},
1599 {"object", T_OBJECT, offsetof(PyUnicodeErrorObject, object), 0,
1600 PyDoc_STR("exception object")},
1601 {"start", T_OBJECT, offsetof(PyUnicodeErrorObject, start), 0,
1602 PyDoc_STR("exception start")},
1603 {"end", T_OBJECT, offsetof(PyUnicodeErrorObject, end), 0,
1604 PyDoc_STR("exception end")},
1605 {"reason", T_OBJECT, offsetof(PyUnicodeErrorObject, reason), 0,
1606 PyDoc_STR("exception reason")},
1607 {NULL} /* Sentinel */
1608};
1609
1610
1611/*
1612 * UnicodeEncodeError extends UnicodeError
1613 */
Richard Jones7b9558d2006-05-27 12:29:24 +00001614
1615static int
1616UnicodeEncodeError_init(PyObject *self, PyObject *args, PyObject *kwds)
1617{
1618 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1619 return -1;
1620 return UnicodeError_init((PyUnicodeErrorObject *)self, args,
1621 kwds, &PyUnicode_Type);
1622}
1623
1624static PyObject *
1625UnicodeEncodeError_str(PyObject *self)
1626{
1627 Py_ssize_t start;
1628 Py_ssize_t end;
1629
1630 if (PyUnicodeEncodeError_GetStart(self, &start))
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001631 return NULL;
Richard Jones7b9558d2006-05-27 12:29:24 +00001632
1633 if (PyUnicodeEncodeError_GetEnd(self, &end))
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001634 return NULL;
Richard Jones7b9558d2006-05-27 12:29:24 +00001635
1636 if (end==start+1) {
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001637 int badchar = (int)PyUnicode_AS_UNICODE(((PyUnicodeErrorObject *)self)->object)[start];
1638 char badchar_str[20];
1639 if (badchar <= 0xff)
1640 PyOS_snprintf(badchar_str, sizeof(badchar_str), "x%02x", badchar);
1641 else if (badchar <= 0xffff)
1642 PyOS_snprintf(badchar_str, sizeof(badchar_str), "u%04x", badchar);
1643 else
1644 PyOS_snprintf(badchar_str, sizeof(badchar_str), "U%08x", badchar);
1645 return PyString_FromFormat(
1646 "'%.400s' codec can't encode character u'\\%s' in position %zd: %.400s",
1647 PyString_AS_STRING(((PyUnicodeErrorObject *)self)->encoding),
1648 badchar_str,
1649 start,
1650 PyString_AS_STRING(((PyUnicodeErrorObject *)self)->reason)
1651 );
Richard Jones7b9558d2006-05-27 12:29:24 +00001652 }
1653 return PyString_FromFormat(
1654 "'%.400s' codec can't encode characters in position %zd-%zd: %.400s",
1655 PyString_AS_STRING(((PyUnicodeErrorObject *)self)->encoding),
1656 start,
1657 (end-1),
1658 PyString_AS_STRING(((PyUnicodeErrorObject *)self)->reason)
1659 );
1660}
1661
1662static PyTypeObject _PyExc_UnicodeEncodeError = {
1663 PyObject_HEAD_INIT(NULL)
1664 0,
Georg Brandl38f62372006-09-06 06:50:05 +00001665 EXC_MODULE_NAME "UnicodeEncodeError",
Richard Jones7b9558d2006-05-27 12:29:24 +00001666 sizeof(PyUnicodeErrorObject), 0,
1667 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1668 (reprfunc)UnicodeEncodeError_str, 0, 0, 0,
1669 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Michael W. Hudson27596272006-05-28 21:19:03 +00001670 PyDoc_STR("Unicode encoding error."), (traverseproc)UnicodeError_traverse,
1671 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
Richard Jones7b9558d2006-05-27 12:29:24 +00001672 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Michael W. Hudson96495ee2006-05-28 17:40:29 +00001673 (initproc)UnicodeEncodeError_init, 0, BaseException_new,
Richard Jones7b9558d2006-05-27 12:29:24 +00001674};
1675PyObject *PyExc_UnicodeEncodeError = (PyObject *)&_PyExc_UnicodeEncodeError;
1676
1677PyObject *
1678PyUnicodeEncodeError_Create(
1679 const char *encoding, const Py_UNICODE *object, Py_ssize_t length,
1680 Py_ssize_t start, Py_ssize_t end, const char *reason)
1681{
1682 return PyObject_CallFunction(PyExc_UnicodeEncodeError, "su#nns",
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001683 encoding, object, length, start, end, reason);
Richard Jones7b9558d2006-05-27 12:29:24 +00001684}
1685
1686
1687/*
1688 * UnicodeDecodeError extends UnicodeError
1689 */
Richard Jones7b9558d2006-05-27 12:29:24 +00001690
1691static int
1692UnicodeDecodeError_init(PyObject *self, PyObject *args, PyObject *kwds)
1693{
1694 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1695 return -1;
1696 return UnicodeError_init((PyUnicodeErrorObject *)self, args,
1697 kwds, &PyString_Type);
1698}
1699
1700static PyObject *
1701UnicodeDecodeError_str(PyObject *self)
1702{
Georg Brandl43ab1002006-05-28 20:57:09 +00001703 Py_ssize_t start = 0;
1704 Py_ssize_t end = 0;
Richard Jones7b9558d2006-05-27 12:29:24 +00001705
1706 if (PyUnicodeDecodeError_GetStart(self, &start))
1707 return NULL;
1708
1709 if (PyUnicodeDecodeError_GetEnd(self, &end))
1710 return NULL;
1711
1712 if (end==start+1) {
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001713 /* FromFormat does not support %02x, so format that separately */
1714 char byte[4];
1715 PyOS_snprintf(byte, sizeof(byte), "%02x",
1716 ((int)PyString_AS_STRING(((PyUnicodeErrorObject *)self)->object)[start])&0xff);
1717 return PyString_FromFormat(
1718 "'%.400s' codec can't decode byte 0x%s in position %zd: %.400s",
1719 PyString_AS_STRING(((PyUnicodeErrorObject *)self)->encoding),
1720 byte,
1721 start,
1722 PyString_AS_STRING(((PyUnicodeErrorObject *)self)->reason)
1723 );
Richard Jones7b9558d2006-05-27 12:29:24 +00001724 }
1725 return PyString_FromFormat(
1726 "'%.400s' codec can't decode bytes in position %zd-%zd: %.400s",
1727 PyString_AS_STRING(((PyUnicodeErrorObject *)self)->encoding),
1728 start,
1729 (end-1),
1730 PyString_AS_STRING(((PyUnicodeErrorObject *)self)->reason)
1731 );
1732}
1733
1734static PyTypeObject _PyExc_UnicodeDecodeError = {
1735 PyObject_HEAD_INIT(NULL)
1736 0,
1737 EXC_MODULE_NAME "UnicodeDecodeError",
1738 sizeof(PyUnicodeErrorObject), 0,
1739 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1740 (reprfunc)UnicodeDecodeError_str, 0, 0, 0,
1741 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Michael W. Hudson27596272006-05-28 21:19:03 +00001742 PyDoc_STR("Unicode decoding error."), (traverseproc)UnicodeError_traverse,
1743 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
Richard Jones7b9558d2006-05-27 12:29:24 +00001744 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Michael W. Hudson96495ee2006-05-28 17:40:29 +00001745 (initproc)UnicodeDecodeError_init, 0, BaseException_new,
Richard Jones7b9558d2006-05-27 12:29:24 +00001746};
1747PyObject *PyExc_UnicodeDecodeError = (PyObject *)&_PyExc_UnicodeDecodeError;
1748
1749PyObject *
1750PyUnicodeDecodeError_Create(
1751 const char *encoding, const char *object, Py_ssize_t length,
1752 Py_ssize_t start, Py_ssize_t end, const char *reason)
1753{
1754 assert(length < INT_MAX);
1755 assert(start < INT_MAX);
1756 assert(end < INT_MAX);
1757 return PyObject_CallFunction(PyExc_UnicodeDecodeError, "ss#nns",
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001758 encoding, object, length, start, end, reason);
Richard Jones7b9558d2006-05-27 12:29:24 +00001759}
1760
1761
1762/*
1763 * UnicodeTranslateError extends UnicodeError
1764 */
Richard Jones7b9558d2006-05-27 12:29:24 +00001765
1766static int
1767UnicodeTranslateError_init(PyUnicodeErrorObject *self, PyObject *args,
1768 PyObject *kwds)
1769{
1770 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1771 return -1;
1772
1773 Py_CLEAR(self->object);
1774 Py_CLEAR(self->start);
1775 Py_CLEAR(self->end);
1776 Py_CLEAR(self->reason);
1777
1778 if (!PyArg_ParseTuple(args, "O!O!O!O!",
1779 &PyUnicode_Type, &self->object,
1780 &PyInt_Type, &self->start,
1781 &PyInt_Type, &self->end,
1782 &PyString_Type, &self->reason)) {
1783 self->object = self->start = self->end = self->reason = NULL;
1784 return -1;
1785 }
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001786
Richard Jones7b9558d2006-05-27 12:29:24 +00001787 Py_INCREF(self->object);
1788 Py_INCREF(self->start);
1789 Py_INCREF(self->end);
1790 Py_INCREF(self->reason);
1791
1792 return 0;
1793}
1794
1795
1796static PyObject *
1797UnicodeTranslateError_str(PyObject *self)
1798{
1799 Py_ssize_t start;
1800 Py_ssize_t end;
1801
1802 if (PyUnicodeTranslateError_GetStart(self, &start))
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001803 return NULL;
Richard Jones7b9558d2006-05-27 12:29:24 +00001804
1805 if (PyUnicodeTranslateError_GetEnd(self, &end))
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001806 return NULL;
Richard Jones7b9558d2006-05-27 12:29:24 +00001807
1808 if (end==start+1) {
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001809 int badchar = (int)PyUnicode_AS_UNICODE(((PyUnicodeErrorObject *)self)->object)[start];
1810 char badchar_str[20];
1811 if (badchar <= 0xff)
1812 PyOS_snprintf(badchar_str, sizeof(badchar_str), "x%02x", badchar);
1813 else if (badchar <= 0xffff)
1814 PyOS_snprintf(badchar_str, sizeof(badchar_str), "u%04x", badchar);
1815 else
1816 PyOS_snprintf(badchar_str, sizeof(badchar_str), "U%08x", badchar);
1817 return PyString_FromFormat(
Richard Jones7b9558d2006-05-27 12:29:24 +00001818 "can't translate character u'\\%s' in position %zd: %.400s",
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001819 badchar_str,
1820 start,
1821 PyString_AS_STRING(((PyUnicodeErrorObject *)self)->reason)
1822 );
Richard Jones7b9558d2006-05-27 12:29:24 +00001823 }
1824 return PyString_FromFormat(
1825 "can't translate characters in position %zd-%zd: %.400s",
1826 start,
1827 (end-1),
1828 PyString_AS_STRING(((PyUnicodeErrorObject *)self)->reason)
1829 );
1830}
1831
1832static PyTypeObject _PyExc_UnicodeTranslateError = {
1833 PyObject_HEAD_INIT(NULL)
1834 0,
1835 EXC_MODULE_NAME "UnicodeTranslateError",
1836 sizeof(PyUnicodeErrorObject), 0,
1837 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1838 (reprfunc)UnicodeTranslateError_str, 0, 0, 0,
1839 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Georg Brandl38f62372006-09-06 06:50:05 +00001840 PyDoc_STR("Unicode translation error."), (traverseproc)UnicodeError_traverse,
Richard Jones7b9558d2006-05-27 12:29:24 +00001841 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
1842 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Michael W. Hudson96495ee2006-05-28 17:40:29 +00001843 (initproc)UnicodeTranslateError_init, 0, BaseException_new,
Richard Jones7b9558d2006-05-27 12:29:24 +00001844};
1845PyObject *PyExc_UnicodeTranslateError = (PyObject *)&_PyExc_UnicodeTranslateError;
1846
1847PyObject *
1848PyUnicodeTranslateError_Create(
1849 const Py_UNICODE *object, Py_ssize_t length,
1850 Py_ssize_t start, Py_ssize_t end, const char *reason)
1851{
1852 return PyObject_CallFunction(PyExc_UnicodeTranslateError, "u#nns",
Michael W. Hudson22a80e72006-05-28 15:51:40 +00001853 object, length, start, end, reason);
Richard Jones7b9558d2006-05-27 12:29:24 +00001854}
1855#endif
1856
1857
1858/*
1859 * AssertionError extends StandardError
1860 */
1861SimpleExtendsException(PyExc_StandardError, AssertionError,
Richard Jones2d555b32006-05-27 16:15:11 +00001862 "Assertion failed.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001863
1864
1865/*
1866 * ArithmeticError extends StandardError
1867 */
1868SimpleExtendsException(PyExc_StandardError, ArithmeticError,
Richard Jones2d555b32006-05-27 16:15:11 +00001869 "Base class for arithmetic errors.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001870
1871
1872/*
1873 * FloatingPointError extends ArithmeticError
1874 */
1875SimpleExtendsException(PyExc_ArithmeticError, FloatingPointError,
Richard Jones2d555b32006-05-27 16:15:11 +00001876 "Floating point operation failed.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001877
1878
1879/*
1880 * OverflowError extends ArithmeticError
1881 */
1882SimpleExtendsException(PyExc_ArithmeticError, OverflowError,
Richard Jones2d555b32006-05-27 16:15:11 +00001883 "Result too large to be represented.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001884
1885
1886/*
1887 * ZeroDivisionError extends ArithmeticError
1888 */
1889SimpleExtendsException(PyExc_ArithmeticError, ZeroDivisionError,
Richard Jones2d555b32006-05-27 16:15:11 +00001890 "Second argument to a division or modulo operation was zero.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001891
1892
1893/*
1894 * SystemError extends StandardError
1895 */
1896SimpleExtendsException(PyExc_StandardError, SystemError,
1897 "Internal error in the Python interpreter.\n"
1898 "\n"
1899 "Please report this to the Python maintainer, along with the traceback,\n"
Richard Jones2d555b32006-05-27 16:15:11 +00001900 "the Python version, and the hardware/OS platform and version.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001901
1902
1903/*
1904 * ReferenceError extends StandardError
1905 */
1906SimpleExtendsException(PyExc_StandardError, ReferenceError,
Richard Jones2d555b32006-05-27 16:15:11 +00001907 "Weak ref proxy used after referent went away.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001908
1909
1910/*
1911 * MemoryError extends StandardError
1912 */
Richard Jones2d555b32006-05-27 16:15:11 +00001913SimpleExtendsException(PyExc_StandardError, MemoryError, "Out of memory.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001914
1915
1916/* Warning category docstrings */
1917
1918/*
1919 * Warning extends Exception
1920 */
1921SimpleExtendsException(PyExc_Exception, Warning,
Richard Jones2d555b32006-05-27 16:15:11 +00001922 "Base class for warning categories.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001923
1924
1925/*
1926 * UserWarning extends Warning
1927 */
1928SimpleExtendsException(PyExc_Warning, UserWarning,
Richard Jones2d555b32006-05-27 16:15:11 +00001929 "Base class for warnings generated by user code.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001930
1931
1932/*
1933 * DeprecationWarning extends Warning
1934 */
1935SimpleExtendsException(PyExc_Warning, DeprecationWarning,
Richard Jones2d555b32006-05-27 16:15:11 +00001936 "Base class for warnings about deprecated features.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001937
1938
1939/*
1940 * PendingDeprecationWarning extends Warning
1941 */
1942SimpleExtendsException(PyExc_Warning, PendingDeprecationWarning,
1943 "Base class for warnings about features which will be deprecated\n"
Richard Jones2d555b32006-05-27 16:15:11 +00001944 "in the future.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001945
1946
1947/*
1948 * SyntaxWarning extends Warning
1949 */
1950SimpleExtendsException(PyExc_Warning, SyntaxWarning,
Richard Jones2d555b32006-05-27 16:15:11 +00001951 "Base class for warnings about dubious syntax.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001952
1953
1954/*
1955 * RuntimeWarning extends Warning
1956 */
1957SimpleExtendsException(PyExc_Warning, RuntimeWarning,
Richard Jones2d555b32006-05-27 16:15:11 +00001958 "Base class for warnings about dubious runtime behavior.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001959
1960
1961/*
1962 * FutureWarning extends Warning
1963 */
1964SimpleExtendsException(PyExc_Warning, FutureWarning,
1965 "Base class for warnings about constructs that will change semantically\n"
Richard Jones2d555b32006-05-27 16:15:11 +00001966 "in the future.");
Richard Jones7b9558d2006-05-27 12:29:24 +00001967
1968
1969/*
1970 * ImportWarning extends Warning
1971 */
1972SimpleExtendsException(PyExc_Warning, ImportWarning,
Richard Jones2d555b32006-05-27 16:15:11 +00001973 "Base class for warnings about probable mistakes in module imports");
Richard Jones7b9558d2006-05-27 12:29:24 +00001974
1975
Marc-André Lemburg040f76b2006-08-14 10:55:19 +00001976/*
1977 * UnicodeWarning extends Warning
1978 */
1979SimpleExtendsException(PyExc_Warning, UnicodeWarning,
1980 "Base class for warnings about Unicode related problems, mostly\n"
1981 "related to conversion problems.");
1982
1983
Richard Jones7b9558d2006-05-27 12:29:24 +00001984/* Pre-computed MemoryError instance. Best to create this as early as
1985 * possible and not wait until a MemoryError is actually raised!
1986 */
1987PyObject *PyExc_MemoryErrorInst=NULL;
1988
1989/* module global functions */
1990static PyMethodDef functions[] = {
1991 /* Sentinel */
1992 {NULL, NULL}
1993};
1994
1995#define PRE_INIT(TYPE) if (PyType_Ready(&_PyExc_ ## TYPE) < 0) \
1996 Py_FatalError("exceptions bootstrapping error.");
1997
1998#define POST_INIT(TYPE) Py_INCREF(PyExc_ ## TYPE); \
1999 PyModule_AddObject(m, # TYPE, PyExc_ ## TYPE); \
2000 if (PyDict_SetItemString(bdict, # TYPE, PyExc_ ## TYPE)) \
2001 Py_FatalError("Module dictionary insertion problem.");
2002
Kristján Valur Jónsson74c3ea02006-07-03 14:59:05 +00002003#if defined _MSC_VER && _MSC_VER >= 1400 && defined(__STDC_SECURE_LIB__)
Kristján Valur Jónssonf6083172006-06-12 15:45:12 +00002004/* crt variable checking in VisualStudio .NET 2005 */
2005#include <crtdbg.h>
2006
2007static int prevCrtReportMode;
2008static _invalid_parameter_handler prevCrtHandler;
2009
2010/* Invalid parameter handler. Sets a ValueError exception */
2011static void
2012InvalidParameterHandler(
2013 const wchar_t * expression,
2014 const wchar_t * function,
2015 const wchar_t * file,
2016 unsigned int line,
2017 uintptr_t pReserved)
2018{
2019 /* Do nothing, allow execution to continue. Usually this
2020 * means that the CRT will set errno to EINVAL
2021 */
2022}
2023#endif
2024
2025
Richard Jones7b9558d2006-05-27 12:29:24 +00002026PyMODINIT_FUNC
Michael W. Hudson22a80e72006-05-28 15:51:40 +00002027_PyExc_Init(void)
Richard Jones7b9558d2006-05-27 12:29:24 +00002028{
2029 PyObject *m, *bltinmod, *bdict;
2030
2031 PRE_INIT(BaseException)
2032 PRE_INIT(Exception)
2033 PRE_INIT(StandardError)
2034 PRE_INIT(TypeError)
2035 PRE_INIT(StopIteration)
2036 PRE_INIT(GeneratorExit)
2037 PRE_INIT(SystemExit)
2038 PRE_INIT(KeyboardInterrupt)
2039 PRE_INIT(ImportError)
2040 PRE_INIT(EnvironmentError)
2041 PRE_INIT(IOError)
2042 PRE_INIT(OSError)
2043#ifdef MS_WINDOWS
2044 PRE_INIT(WindowsError)
2045#endif
2046#ifdef __VMS
2047 PRE_INIT(VMSError)
2048#endif
2049 PRE_INIT(EOFError)
2050 PRE_INIT(RuntimeError)
2051 PRE_INIT(NotImplementedError)
2052 PRE_INIT(NameError)
2053 PRE_INIT(UnboundLocalError)
2054 PRE_INIT(AttributeError)
2055 PRE_INIT(SyntaxError)
2056 PRE_INIT(IndentationError)
2057 PRE_INIT(TabError)
2058 PRE_INIT(LookupError)
2059 PRE_INIT(IndexError)
2060 PRE_INIT(KeyError)
2061 PRE_INIT(ValueError)
2062 PRE_INIT(UnicodeError)
2063#ifdef Py_USING_UNICODE
2064 PRE_INIT(UnicodeEncodeError)
2065 PRE_INIT(UnicodeDecodeError)
2066 PRE_INIT(UnicodeTranslateError)
2067#endif
2068 PRE_INIT(AssertionError)
2069 PRE_INIT(ArithmeticError)
2070 PRE_INIT(FloatingPointError)
2071 PRE_INIT(OverflowError)
2072 PRE_INIT(ZeroDivisionError)
2073 PRE_INIT(SystemError)
2074 PRE_INIT(ReferenceError)
2075 PRE_INIT(MemoryError)
2076 PRE_INIT(Warning)
2077 PRE_INIT(UserWarning)
2078 PRE_INIT(DeprecationWarning)
2079 PRE_INIT(PendingDeprecationWarning)
2080 PRE_INIT(SyntaxWarning)
2081 PRE_INIT(RuntimeWarning)
2082 PRE_INIT(FutureWarning)
2083 PRE_INIT(ImportWarning)
Marc-André Lemburg040f76b2006-08-14 10:55:19 +00002084 PRE_INIT(UnicodeWarning)
Richard Jones7b9558d2006-05-27 12:29:24 +00002085
Richard Jonesc5b2a2e2006-05-27 16:07:28 +00002086 m = Py_InitModule4("exceptions", functions, exceptions_doc,
2087 (PyObject *)NULL, PYTHON_API_VERSION);
Richard Jones7b9558d2006-05-27 12:29:24 +00002088 if (m == NULL) return;
2089
2090 bltinmod = PyImport_ImportModule("__builtin__");
2091 if (bltinmod == NULL)
2092 Py_FatalError("exceptions bootstrapping error.");
2093 bdict = PyModule_GetDict(bltinmod);
2094 if (bdict == NULL)
2095 Py_FatalError("exceptions bootstrapping error.");
2096
2097 POST_INIT(BaseException)
2098 POST_INIT(Exception)
2099 POST_INIT(StandardError)
2100 POST_INIT(TypeError)
2101 POST_INIT(StopIteration)
2102 POST_INIT(GeneratorExit)
2103 POST_INIT(SystemExit)
2104 POST_INIT(KeyboardInterrupt)
2105 POST_INIT(ImportError)
2106 POST_INIT(EnvironmentError)
2107 POST_INIT(IOError)
2108 POST_INIT(OSError)
2109#ifdef MS_WINDOWS
2110 POST_INIT(WindowsError)
2111#endif
2112#ifdef __VMS
2113 POST_INIT(VMSError)
2114#endif
2115 POST_INIT(EOFError)
2116 POST_INIT(RuntimeError)
2117 POST_INIT(NotImplementedError)
2118 POST_INIT(NameError)
2119 POST_INIT(UnboundLocalError)
2120 POST_INIT(AttributeError)
2121 POST_INIT(SyntaxError)
2122 POST_INIT(IndentationError)
2123 POST_INIT(TabError)
2124 POST_INIT(LookupError)
2125 POST_INIT(IndexError)
2126 POST_INIT(KeyError)
2127 POST_INIT(ValueError)
2128 POST_INIT(UnicodeError)
2129#ifdef Py_USING_UNICODE
2130 POST_INIT(UnicodeEncodeError)
2131 POST_INIT(UnicodeDecodeError)
2132 POST_INIT(UnicodeTranslateError)
2133#endif
2134 POST_INIT(AssertionError)
2135 POST_INIT(ArithmeticError)
2136 POST_INIT(FloatingPointError)
2137 POST_INIT(OverflowError)
2138 POST_INIT(ZeroDivisionError)
2139 POST_INIT(SystemError)
2140 POST_INIT(ReferenceError)
2141 POST_INIT(MemoryError)
2142 POST_INIT(Warning)
2143 POST_INIT(UserWarning)
2144 POST_INIT(DeprecationWarning)
2145 POST_INIT(PendingDeprecationWarning)
2146 POST_INIT(SyntaxWarning)
2147 POST_INIT(RuntimeWarning)
2148 POST_INIT(FutureWarning)
2149 POST_INIT(ImportWarning)
Marc-André Lemburg040f76b2006-08-14 10:55:19 +00002150 POST_INIT(UnicodeWarning)
Richard Jones7b9558d2006-05-27 12:29:24 +00002151
2152 PyExc_MemoryErrorInst = BaseException_new(&_PyExc_MemoryError, NULL, NULL);
2153 if (!PyExc_MemoryErrorInst)
2154 Py_FatalError("Cannot pre-allocate MemoryError instance\n");
2155
2156 Py_DECREF(bltinmod);
Kristján Valur Jónssonf6083172006-06-12 15:45:12 +00002157
Kristján Valur Jónsson74c3ea02006-07-03 14:59:05 +00002158#if defined _MSC_VER && _MSC_VER >= 1400 && defined(__STDC_SECURE_LIB__)
Kristján Valur Jónssonf6083172006-06-12 15:45:12 +00002159 /* Set CRT argument error handler */
2160 prevCrtHandler = _set_invalid_parameter_handler(InvalidParameterHandler);
2161 /* turn off assertions in debug mode */
2162 prevCrtReportMode = _CrtSetReportMode(_CRT_ASSERT, 0);
2163#endif
Richard Jones7b9558d2006-05-27 12:29:24 +00002164}
2165
2166void
2167_PyExc_Fini(void)
2168{
2169 Py_XDECREF(PyExc_MemoryErrorInst);
2170 PyExc_MemoryErrorInst = NULL;
Kristján Valur Jónsson74c3ea02006-07-03 14:59:05 +00002171#if defined _MSC_VER && _MSC_VER >= 1400 && defined(__STDC_SECURE_LIB__)
Kristján Valur Jónssonf6083172006-06-12 15:45:12 +00002172 /* reset CRT error handling */
2173 _set_invalid_parameter_handler(prevCrtHandler);
2174 _CrtSetReportMode(_CRT_ASSERT, prevCrtReportMode);
2175#endif
Richard Jones7b9558d2006-05-27 12:29:24 +00002176}