blob: 6271372efb3c1cc0d4226859f12affca7afc909e [file] [log] [blame]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001#define PY_SSIZE_T_CLEAN
2#include <Python.h>
3#include "structmember.h"
4#include "osdefs.h"
5
6#define MAKE_IT_NONE(x) (x) = Py_None; Py_INCREF(Py_None);
7#define EXC_MODULE_NAME "exceptions."
8
9/* NOTE: If the exception class hierarchy changes, don't forget to update
10 * Lib/test/exception_hierarchy.txt
11 */
12
13PyDoc_STRVAR(exceptions_doc, "Python's standard exception class hierarchy.\n\
14\n\
15Exceptions found here are defined both in the exceptions module and the\n\
16built-in namespace. It is recommended that user-defined exceptions\n\
17inherit from Exception. See the documentation for the exception\n\
18inheritance hierarchy.\n\
19");
20
21/*
22 * BaseException
23 */
24static PyObject *
25BaseException_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
26{
27 PyBaseExceptionObject *self;
28
29 self = (PyBaseExceptionObject *)type->tp_alloc(type, 0);
30 /* the dict is created on the fly in PyObject_GenericSetAttr */
31 self->message = self->dict = NULL;
32
33 self->args = PyTuple_New(0);
34 if (!self->args) {
35 Py_DECREF(self);
36 return NULL;
37 }
38
39 self->message = PyString_FromString("");
40 if (!self->message) {
41 Py_DECREF(self);
42 return NULL;
43 }
44
45 return (PyObject *)self;
46}
47
48static int
49BaseException_init(PyBaseExceptionObject *self, PyObject *args, PyObject *kwds)
50{
51 Py_DECREF(self->args);
52 self->args = args;
53 Py_INCREF(self->args);
54
55 if (PyTuple_GET_SIZE(self->args) == 1) {
56 Py_DECREF(self->message);
57 self->message = PyTuple_GET_ITEM(self->args, 0);
58 Py_INCREF(self->message);
59 }
60 return 0;
61}
62
63int
64BaseException_clear(PyBaseExceptionObject *self)
65{
66 Py_CLEAR(self->dict);
67 Py_CLEAR(self->args);
68 Py_CLEAR(self->message);
69 return 0;
70}
71
72static void
73BaseException_dealloc(PyBaseExceptionObject *self)
74{
75 BaseException_clear(self);
76 self->ob_type->tp_free((PyObject *)self);
77}
78
79int
80BaseException_traverse(PyBaseExceptionObject *self, visitproc visit, void *arg)
81{
82 if (self->dict)
83 Py_VISIT(self->dict);
84 Py_VISIT(self->args);
85 Py_VISIT(self->message);
86 return 0;
87}
88
89static PyObject *
90BaseException_str(PyBaseExceptionObject *self)
91{
92 PyObject *out;
93
94 switch (PySequence_Length(self->args)) {
95 case 0:
96 out = PyString_FromString("");
97 break;
98 case 1:
99 {
100 PyObject *tmp = PySequence_GetItem(self->args, 0);
101 if (tmp) {
102 out = PyObject_Str(tmp);
103 Py_DECREF(tmp);
104 }
105 else
106 out = NULL;
107 break;
108 }
109 case -1:
110 PyErr_Clear();
111 /* Fall through */
112 default:
113 out = PyObject_Str(self->args);
114 break;
115 }
116
117 return out;
118}
119
120static PyObject *
121BaseException_repr(PyBaseExceptionObject *self)
122{
123 Py_ssize_t args_len;
124 PyObject *repr_suffix;
125 PyObject *repr;
126 char *name;
127 char *dot;
128
129 args_len = PySequence_Length(self->args);
130 if (args_len < 0) {
131 return NULL;
132 }
133
134 if (args_len == 0) {
135 repr_suffix = PyString_FromString("()");
136 if (!repr_suffix)
137 return NULL;
138 }
139 else {
140 PyObject *args_repr = PyObject_Repr(self->args);
141 if (!args_repr)
142 return NULL;
143 repr_suffix = args_repr;
144 }
145
146 name = (char *)self->ob_type->tp_name;
147 dot = strrchr(name, '.');
148 if (dot != NULL) name = dot+1;
149
150 repr = PyString_FromString(name);
151 if (!repr) {
152 Py_DECREF(repr_suffix);
153 return NULL;
154 }
155
156 PyString_ConcatAndDel(&repr, repr_suffix);
157 return repr;
158}
159
160/* Pickling support */
161static PyObject *
162BaseException_reduce(PyBaseExceptionObject *self)
163{
164 return PyTuple_Pack(3, self->ob_type, self->args, self->dict);
165}
166
167
168#ifdef Py_USING_UNICODE
169/* while this method generates fairly uninspired output, it a least
170 * guarantees that we can display exceptions that have unicode attributes
171 */
172static PyObject *
173BaseException_unicode(PyBaseExceptionObject *self)
174{
175 if (PySequence_Length(self->args) == 0)
176 return PyUnicode_FromUnicode(NULL, 0);
177 if (PySequence_Length(self->args) == 1) {
178 PyObject *temp = PySequence_GetItem(self->args, 0);
179 PyObject *unicode_obj;
180 if (!temp) {
181 return NULL;
182 }
183 unicode_obj = PyObject_Unicode(temp);
184 Py_DECREF(temp);
185 return unicode_obj;
186 }
187 return PyObject_Unicode(self->args);
188}
189#endif /* Py_USING_UNICODE */
190
191static PyMethodDef BaseException_methods[] = {
192 {"__reduce__", (PyCFunction)BaseException_reduce, METH_NOARGS },
193#ifdef Py_USING_UNICODE
194 {"__unicode__", (PyCFunction)BaseException_unicode, METH_NOARGS },
195#endif
196 {NULL, NULL, 0, NULL},
197};
198
199
200
201static PyObject *
202BaseException_getitem(PyBaseExceptionObject *self, Py_ssize_t index)
203{
204 return PySequence_GetItem(self->args, index);
205}
206
207static PySequenceMethods BaseException_as_sequence = {
208 0, /* sq_length; */
209 0, /* sq_concat; */
210 0, /* sq_repeat; */
211 (ssizeargfunc)BaseException_getitem, /* sq_item; */
212 0, /* sq_slice; */
213 0, /* sq_ass_item; */
214 0, /* sq_ass_slice; */
215 0, /* sq_contains; */
216 0, /* sq_inplace_concat; */
217 0 /* sq_inplace_repeat; */
218};
219
220static PyMemberDef BaseException_members[] = {
221 {"message", T_OBJECT, offsetof(PyBaseExceptionObject, message), 0,
222 PyDoc_STR("exception message")},
223 {NULL} /* Sentinel */
224};
225
226
227static 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;
277 self->args = seq;
278 return 0;
279}
280
281static PyGetSetDef BaseException_getset[] = {
282 {"__dict__", (getter)BaseException_get_dict, (setter)BaseException_set_dict},
283 {"args", (getter)BaseException_get_args, (setter)BaseException_set_args},
284 {NULL},
285};
286
287
288static PyTypeObject _PyExc_BaseException = {
289 PyObject_HEAD_INIT(NULL)
290 0, /*ob_size*/
291 EXC_MODULE_NAME "BaseException", /*tp_name*/
292 sizeof(PyBaseExceptionObject), /*tp_basicsize*/
293 0, /*tp_itemsize*/
294 (destructor)BaseException_dealloc, /*tp_dealloc*/
295 0, /*tp_print*/
296 0, /*tp_getattr*/
297 0, /*tp_setattr*/
298 0, /* tp_compare; */
299 (reprfunc)BaseException_repr, /*tp_repr*/
300 0, /*tp_as_number*/
301 &BaseException_as_sequence, /*tp_as_sequence*/
302 0, /*tp_as_mapping*/
303 0, /*tp_hash */
304 0, /*tp_call*/
305 (reprfunc)BaseException_str, /*tp_str*/
306 PyObject_GenericGetAttr, /*tp_getattro*/
307 PyObject_GenericSetAttr, /*tp_setattro*/
308 0, /*tp_as_buffer*/
309 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, /*tp_flags*/
310 PyDoc_STR("Common base class for all exceptions"), /* tp_doc */
311 (traverseproc)BaseException_traverse, /* tp_traverse */
312 (inquiry)BaseException_clear, /* tp_clear */
313 0, /* tp_richcompare */
314 0, /* tp_weaklistoffset */
315 0, /* tp_iter */
316 0, /* tp_iternext */
317 BaseException_methods, /* tp_methods */
318 BaseException_members, /* tp_members */
319 BaseException_getset, /* tp_getset */
320 0, /* tp_base */
321 0, /* tp_dict */
322 0, /* tp_descr_get */
323 0, /* tp_descr_set */
324 offsetof(PyBaseExceptionObject, dict), /* tp_dictoffset */
325 (initproc)BaseException_init, /* tp_init */
326 0, /* tp_alloc */
327 BaseException_new, /* tp_new */
328};
329/* the CPython API expects exceptions to be (PyObject *) - both a hold-over
330from the previous implmentation and also allowing Python objects to be used
331in the API */
332PyObject *PyExc_BaseException = (PyObject *)&_PyExc_BaseException;
333
334/* note these macros omit the last semicolon so the macro invocation may
335 * include it and not look strange.
336 */
337#define SimpleExtendsException(EXCBASE, EXCNAME, EXCDOC) \
338static PyTypeObject _PyExc_ ## EXCNAME = { \
339 PyObject_HEAD_INIT(NULL) \
340 0, \
341 EXC_MODULE_NAME # EXCNAME, \
342 sizeof(PyBaseExceptionObject), \
343 0, (destructor)BaseException_dealloc, 0, 0, 0, 0, 0, 0, 0, \
344 0, 0, 0, 0, 0, 0, 0, \
345 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
346 PyDoc_STR(EXCDOC), (traverseproc)BaseException_traverse, \
347 (inquiry)BaseException_clear, 0, 0, 0, 0, 0, 0, 0, &_ ## EXCBASE, \
348 0, 0, 0, offsetof(PyBaseExceptionObject, dict), \
349 (initproc)BaseException_init, 0, BaseException_new,\
350}; \
351PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
352
353#define MiddlingExtendsException(EXCBASE, EXCNAME, EXCSTORE, EXCDOC) \
354static PyTypeObject _PyExc_ ## EXCNAME = { \
355 PyObject_HEAD_INIT(NULL) \
356 0, \
357 EXC_MODULE_NAME # EXCNAME, \
358 sizeof(Py ## EXCSTORE ## Object), \
359 0, (destructor)BaseException_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
360 0, 0, 0, 0, 0, \
361 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
362 PyDoc_STR(EXCDOC), (traverseproc)BaseException_traverse, \
363 (inquiry)BaseException_clear, 0, 0, 0, 0, 0, 0, 0, &_ ## EXCBASE, \
364 0, 0, 0, offsetof(Py ## EXCSTORE ## Object, dict), \
365 (initproc)EXCSTORE ## _init, 0, EXCSTORE ## _new,\
366}; \
367PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
368
369#define ComplexExtendsException(EXCBASE, EXCNAME, EXCSTORE, EXCDEALLOC, EXCMETHODS, EXCMEMBERS, EXCSTR, EXCDOC) \
370static PyTypeObject _PyExc_ ## EXCNAME = { \
371 PyObject_HEAD_INIT(NULL) \
372 0, \
373 EXC_MODULE_NAME # EXCNAME, \
374 sizeof(Py ## EXCSTORE ## Object), 0, \
375 (destructor)EXCSTORE ## _dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
376 (reprfunc)EXCSTR, 0, 0, 0, \
377 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
378 PyDoc_STR(EXCDOC), (traverseproc)EXCSTORE ## _traverse, \
379 (inquiry)EXCSTORE ## _clear, 0, 0, 0, 0, EXCMETHODS, \
380 EXCMEMBERS, 0, &_ ## EXCBASE, \
381 0, 0, 0, offsetof(Py ## EXCSTORE ## Object, dict), \
382 (initproc)EXCSTORE ## _init, 0, EXCSTORE ## _new,\
383}; \
384PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
385
386
387/*
388 * Exception extends BaseException
389 */
390SimpleExtendsException(PyExc_BaseException, Exception,
391 "Common base class for all non-exit exceptions.");
392
393
394/*
395 * StandardError extends Exception
396 */
397SimpleExtendsException(PyExc_Exception, StandardError,
398 "Base class for all standard Python exceptions that do not represent\n"
399 "interpreter exiting.");
400
401
402/*
403 * TypeError extends StandardError
404 */
405SimpleExtendsException(PyExc_StandardError, TypeError,
406 "Inappropriate argument type.");
407
408
409/*
410 * StopIteration extends Exception
411 */
412SimpleExtendsException(PyExc_Exception, StopIteration,
413 "Signal the end from iterator.next().");
414
415
416/*
417 * GeneratorExit extends Exception
418 */
419SimpleExtendsException(PyExc_Exception, GeneratorExit,
420 "Request that a generator exit.");
421
422
423/*
424 * SystemExit extends BaseException
425 */
426static PyObject *
427SystemExit_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
428{
429 PySystemExitObject *self;
430
431 self = (PySystemExitObject *)BaseException_new(type, args, kwds);
432 if (!self)
433 return NULL;
434
435 MAKE_IT_NONE(self->code);
436
437 return (PyObject *)self;
438}
439
440static int
441SystemExit_init(PySystemExitObject *self, PyObject *args, PyObject *kwds)
442{
443 Py_ssize_t size = PyTuple_GET_SIZE(args);
444
445 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
446 return -1;
447
448 Py_DECREF(self->code);
449 if (size == 1)
450 self->code = PyTuple_GET_ITEM(args, 0);
451 else if (size > 1)
452 self->code = args;
453 Py_INCREF(self->code);
454 return 0;
455}
456
457int
458SystemExit_clear(PySystemExitObject *self)
459{
460 Py_CLEAR(self->code);
461 return BaseException_clear((PyBaseExceptionObject *)self);
462}
463
464static void
465SystemExit_dealloc(PySystemExitObject *self)
466{
467 SystemExit_clear(self);
468 self->ob_type->tp_free((PyObject *)self);
469}
470
471int
472SystemExit_traverse(PySystemExitObject *self, visitproc visit, void *arg)
473{
474 Py_VISIT(self->code);
475 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
476}
477
478static PyMemberDef SystemExit_members[] = {
479 {"message", T_OBJECT, offsetof(PySystemExitObject, message), 0,
480 PyDoc_STR("exception message")},
481 {"code", T_OBJECT, offsetof(PySystemExitObject, code), 0,
482 PyDoc_STR("exception code")},
483 {NULL} /* Sentinel */
484};
485
486ComplexExtendsException(PyExc_BaseException, SystemExit, SystemExit,
487 SystemExit_dealloc, 0, SystemExit_members, 0,
488 "Request to exit from the interpreter.");
489
490/*
491 * KeyboardInterrupt extends BaseException
492 */
493SimpleExtendsException(PyExc_BaseException, KeyboardInterrupt,
494 "Program interrupted by user.");
495
496
497/*
498 * ImportError extends StandardError
499 */
500SimpleExtendsException(PyExc_StandardError, ImportError,
501 "Import can't find module, or can't find name in module.");
502
503
504/*
505 * EnvironmentError extends StandardError
506 */
507
508static PyObject *
509EnvironmentError_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
510{
511 PyEnvironmentErrorObject *self = NULL;
512
513 self = (PyEnvironmentErrorObject *)BaseException_new(type, args, kwds);
514 if (!self)
515 return NULL;
516
517 self->myerrno = Py_None;
518 Py_INCREF(Py_None);
519 self->strerror = Py_None;
520 Py_INCREF(Py_None);
521 self->filename = Py_None;
522 Py_INCREF(Py_None);
523
524 return (PyObject *)self;
525}
526
527/* Where a function has a single filename, such as open() or some
528 * of the os module functions, PyErr_SetFromErrnoWithFilename() is
529 * called, giving a third argument which is the filename. But, so
530 * that old code using in-place unpacking doesn't break, e.g.:
531 *
532 * except IOError, (errno, strerror):
533 *
534 * we hack args so that it only contains two items. This also
535 * means we need our own __str__() which prints out the filename
536 * when it was supplied.
537 */
538static int
539EnvironmentError_init(PyEnvironmentErrorObject *self, PyObject *args,
540 PyObject *kwds)
541{
542 PyObject *myerrno = NULL, *strerror = NULL, *filename = NULL;
543 PyObject *subslice = NULL;
544
545 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
546 return -1;
547
548 if (PyTuple_GET_SIZE(args) <= 1) {
549 return 0;
550 }
551
552 if (!PyArg_UnpackTuple(args, "EnvironmentError", 2, 3,
553 &myerrno, &strerror, &filename)) {
554 return -1;
555 }
556 Py_DECREF(self->myerrno); /* replacing */
557 self->myerrno = myerrno;
558 Py_INCREF(self->myerrno);
559
560 Py_DECREF(self->strerror); /* replacing */
561 self->strerror = strerror;
562 Py_INCREF(self->strerror);
563
564 /* self->filename will remain Py_None otherwise */
565 if (filename != NULL) {
566 Py_DECREF(self->filename); /* replacing */
567 self->filename = filename;
568 Py_INCREF(self->filename);
569
570 subslice = PyTuple_GetSlice(args, 0, 2);
571 if (!subslice)
572 return -1;
573
574 Py_DECREF(self->args); /* replacing args */
575 self->args = subslice;
576 }
577 return 0;
578}
579
580int
581EnvironmentError_clear(PyEnvironmentErrorObject *self)
582{
583 Py_CLEAR(self->myerrno);
584 Py_CLEAR(self->strerror);
585 Py_CLEAR(self->filename);
586 return BaseException_clear((PyBaseExceptionObject *)self);
587}
588
589static void
590EnvironmentError_dealloc(PyEnvironmentErrorObject *self)
591{
592 EnvironmentError_clear(self);
593 self->ob_type->tp_free((PyObject *)self);
594}
595
596int
597EnvironmentError_traverse(PyEnvironmentErrorObject *self, visitproc visit,
598 void *arg)
599{
600 Py_VISIT(self->myerrno);
601 Py_VISIT(self->strerror);
602 Py_VISIT(self->filename);
603 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
604}
605
606static PyObject *
607EnvironmentError_str(PyEnvironmentErrorObject *self)
608{
609 PyObject *rtnval = NULL;
610
611 if (self->filename != Py_None) {
612 PyObject *fmt = PyString_FromString("[Errno %s] %s: %s");
613 PyObject *repr = PyObject_Repr(self->filename);
614 PyObject *tuple = PyTuple_New(3);
615
616 if (!fmt || !repr || !tuple) {
617 Py_XDECREF(fmt);
618 Py_XDECREF(repr);
619 Py_XDECREF(tuple);
620 return NULL;
621 }
622 Py_INCREF(self->myerrno);
623 PyTuple_SET_ITEM(tuple, 0, self->myerrno);
624 Py_INCREF(self->strerror);
625 PyTuple_SET_ITEM(tuple, 1, self->strerror);
626 Py_INCREF(repr);
627 PyTuple_SET_ITEM(tuple, 2, repr);
628
629 rtnval = PyString_Format(fmt, tuple);
630
631 Py_DECREF(fmt);
632 Py_DECREF(tuple);
633 }
634 else if (PyObject_IsTrue(self->myerrno) &&
635 PyObject_IsTrue(self->strerror)) {
636 PyObject *fmt = PyString_FromString("[Errno %s] %s");
637 PyObject *tuple = PyTuple_New(2);
638
639 if (!fmt || !tuple) {
640 Py_XDECREF(fmt);
641 Py_XDECREF(tuple);
642 return NULL;
643 }
644 Py_INCREF(self->myerrno);
645 PyTuple_SET_ITEM(tuple, 0, self->myerrno);
646 Py_INCREF(self->strerror);
647 PyTuple_SET_ITEM(tuple, 1, self->strerror);
648
649 rtnval = PyString_Format(fmt, tuple);
650
651 Py_DECREF(fmt);
652 Py_DECREF(tuple);
653 }
654 else
655 rtnval = BaseException_str((PyBaseExceptionObject *)self);
656
657 return rtnval;
658}
659
660static PyMemberDef EnvironmentError_members[] = {
661 {"message", T_OBJECT, offsetof(PyEnvironmentErrorObject, message), 0,
662 PyDoc_STR("exception message")},
663 {"errno", T_OBJECT, offsetof(PyEnvironmentErrorObject, myerrno), 0,
664 PyDoc_STR("exception errno")},
665 {"strerror", T_OBJECT, offsetof(PyEnvironmentErrorObject, strerror), 0,
666 PyDoc_STR("exception strerror")},
667 {"filename", T_OBJECT, offsetof(PyEnvironmentErrorObject, filename), 0,
668 PyDoc_STR("exception filename")},
669 {NULL} /* Sentinel */
670};
671
672
673static PyObject *
674EnvironmentError_reduce(PyEnvironmentErrorObject *self)
675{
676 PyObject *args = self->args;
677 PyObject *res = NULL, *tmp;
678 /* self->args is only the first two real arguments if there was a
679 * file name given to EnvironmentError. */
680 if (PyTuple_Check(args) &&
681 PyTuple_GET_SIZE(args) == 2 &&
682 self->filename != Py_None) {
683
684 args = PyTuple_New(3);
685 if (!args) return NULL;
686
687 tmp = PyTuple_GetItem(self->args, 0);
688 if (!tmp) goto finish;
689 Py_INCREF(tmp);
690 PyTuple_SET_ITEM(args, 0, tmp);
691
692 tmp = PyTuple_GetItem(self->args, 1);
693 if (!tmp) goto finish;
694 Py_INCREF(tmp);
695 PyTuple_SET_ITEM(args, 1, tmp);
696
697 Py_INCREF(self->filename);
698 PyTuple_SET_ITEM(args, 2, self->filename);
699 } else {
700 Py_INCREF(args);
701 }
702 res = PyTuple_Pack(3, self->ob_type, args, self->dict);
703 finish:
704 Py_DECREF(args);
705 return res;
706}
707
708
709static PyMethodDef EnvironmentError_methods[] = {
710 {"__reduce__", (PyCFunction)EnvironmentError_reduce, METH_NOARGS},
711 {NULL}
712};
713
714ComplexExtendsException(PyExc_StandardError, EnvironmentError,
715 EnvironmentError, EnvironmentError_dealloc,
716 EnvironmentError_methods, EnvironmentError_members,
717 EnvironmentError_str,
718 "Base class for I/O related errors.");
719
720
721/*
722 * IOError extends EnvironmentError
723 */
724MiddlingExtendsException(PyExc_EnvironmentError, IOError,
725 EnvironmentError, "I/O operation failed.");
726
727
728/*
729 * OSError extends EnvironmentError
730 */
731MiddlingExtendsException(PyExc_EnvironmentError, OSError,
732 EnvironmentError, "OS system call failed.");
733
734
735/*
736 * WindowsError extends OSError
737 */
738#ifdef MS_WINDOWS
739#include "errmap.h"
740
741int
742WindowsError_clear(PyWindowsErrorObject *self)
743{
744 Py_CLEAR(self->myerrno);
745 Py_CLEAR(self->strerror);
746 Py_CLEAR(self->filename);
747 Py_CLEAR(self->winerror);
748 return BaseException_clear((PyBaseExceptionObject *)self);
749}
750
751static void
752WindowsError_dealloc(PyWindowsErrorObject *self)
753{
754 WindowsError_clear(self);
755 self->ob_type->tp_free((PyObject *)self);
756}
757
758int
759WindowsError_traverse(PyWindowsErrorObject *self, visitproc visit, void *arg)
760{
761 Py_VISIT(self->myerrno);
762 Py_VISIT(self->strerror);
763 Py_VISIT(self->filename);
764 Py_VISIT(self->winerror);
765 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
766}
767
768static PyObject *
769WindowsError_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
770{
771 PyObject *o_errcode = NULL;
772 long errcode;
773 PyWindowsErrorObject *self;
774 long posix_errno;
775
776 self = (PyWindowsErrorObject *)EnvironmentError_new(type, args, kwds);
777 if (!self)
778 return NULL;
779
780 if (self->myerrno == Py_None) {
781 self->winerror = self->myerrno;
782 Py_INCREF(self->winerror);
783 return (PyObject *)self;
784 }
785
786 /* Set errno to the POSIX errno, and winerror to the Win32
787 error code. */
788 errcode = PyInt_AsLong(self->myerrno);
789 if (errcode == -1 && PyErr_Occurred()) {
790 if (PyErr_ExceptionMatches(PyExc_TypeError))
791 /* give a clearer error message */
792 PyErr_SetString(PyExc_TypeError, "errno has to be an integer");
793 goto failed;
794 }
795 posix_errno = winerror_to_errno(errcode);
796
797 self->winerror = self->myerrno;
798
799 o_errcode = PyInt_FromLong(posix_errno);
800 if (!o_errcode)
801 goto failed;
802
803 self->myerrno = o_errcode;
804
805 return (PyObject *)self;
806failed:
807 /* Could not set errno. */
808 Py_DECREF(self);
809 return NULL;
810}
811
812static int
813WindowsError_init(PyWindowsErrorObject *self, PyObject *args, PyObject *kwds)
814{
815 PyObject *o_errcode = NULL;
816 long errcode;
817 long posix_errno;
818
819 if (EnvironmentError_init((PyEnvironmentErrorObject *)self, args, kwds)
820 == -1)
821 return -1;
822
823 if (self->myerrno == Py_None) {
824 Py_DECREF(self->winerror);
825 self->winerror = self->myerrno;
826 Py_INCREF(self->winerror);
827 return 0;
828 }
829
830 /* Set errno to the POSIX errno, and winerror to the Win32
831 error code. */
832 errcode = PyInt_AsLong(self->myerrno);
833 if (errcode == -1 && PyErr_Occurred())
834 return -1;
835 posix_errno = winerror_to_errno(errcode);
836
837 Py_DECREF(self->winerror);
838 self->winerror = self->myerrno;
839
840 o_errcode = PyInt_FromLong(posix_errno);
841 if (!o_errcode)
842 return -1;
843
844 self->myerrno = o_errcode;
845
846 return 0;
847}
848
849
850static PyObject *
851WindowsError_str(PyWindowsErrorObject *self)
852{
853 PyObject *repr = NULL;
854 PyObject *fmt = NULL;
855 PyObject *tuple = NULL;
856 PyObject *rtnval = NULL;
857
858 if (self->filename != Py_None) {
859 fmt = PyString_FromString("[Error %s] %s: %s");
860 repr = PyObject_Repr(self->filename);
861 if (!fmt || !repr)
862 goto finally;
863
864 tuple = PyTuple_Pack(3, self->myerrno, self->strerror, repr);
865 if (!tuple)
866 goto finally;
867
868 rtnval = PyString_Format(fmt, tuple);
869 Py_DECREF(tuple);
870 }
871 else if (PyObject_IsTrue(self->myerrno) &&
872 PyObject_IsTrue(self->strerror)) {
873 fmt = PyString_FromString("[Error %s] %s");
874 if (!fmt)
875 goto finally;
876
877 tuple = PyTuple_Pack(2, self->myerrno, self->strerror);
878 if (!tuple)
879 goto finally;
880
881 rtnval = PyString_Format(fmt, tuple);
882 Py_DECREF(tuple);
883 }
884 else
885 rtnval = EnvironmentError_str((PyEnvironmentErrorObject *)self);
886
887 finally:
888 Py_XDECREF(repr);
889 Py_XDECREF(fmt);
890 Py_XDECREF(tuple);
891 return rtnval;
892}
893
894static PyMemberDef WindowsError_members[] = {
895 {"message", T_OBJECT, offsetof(PyWindowsErrorObject, message), 0,
896 PyDoc_STR("exception message")},
897 {"errno", T_OBJECT, offsetof(PyWindowsErrorObject, myerrno), 0,
898 PyDoc_STR("POSIX exception code")},
899 {"strerror", T_OBJECT, offsetof(PyWindowsErrorObject, strerror), 0,
900 PyDoc_STR("exception strerror")},
901 {"filename", T_OBJECT, offsetof(PyWindowsErrorObject, filename), 0,
902 PyDoc_STR("exception filename")},
903 {"winerror", T_OBJECT, offsetof(PyWindowsErrorObject, winerror), 0,
904 PyDoc_STR("Win32 exception code")},
905 {NULL} /* Sentinel */
906};
907
908ComplexExtendsException(PyExc_OSError, WindowsError, WindowsError,
909 WindowsError_dealloc, 0, WindowsError_members,
910 WindowsError_str, "MS-Windows OS system call failed.");
911
912#endif /* MS_WINDOWS */
913
914
915/*
916 * VMSError extends OSError (I think)
917 */
918#ifdef __VMS
919MiddlingExtendsException(PyExc_OSError, VMSError, EnvironmentError,
920 "OpenVMS OS system call failed.");
921#endif
922
923
924/*
925 * EOFError extends StandardError
926 */
927SimpleExtendsException(PyExc_StandardError, EOFError,
928 "Read beyond end of file.");
929
930
931/*
932 * RuntimeError extends StandardError
933 */
934SimpleExtendsException(PyExc_StandardError, RuntimeError,
935 "Unspecified run-time error.");
936
937
938/*
939 * NotImplementedError extends RuntimeError
940 */
941SimpleExtendsException(PyExc_RuntimeError, NotImplementedError,
942 "Method or function hasn't been implemented yet.");
943
944/*
945 * NameError extends StandardError
946 */
947SimpleExtendsException(PyExc_StandardError, NameError,
948 "Name not found globally.");
949
950/*
951 * UnboundLocalError extends NameError
952 */
953SimpleExtendsException(PyExc_NameError, UnboundLocalError,
954 "Local name referenced but not bound to a value.");
955
956/*
957 * AttributeError extends StandardError
958 */
959SimpleExtendsException(PyExc_StandardError, AttributeError,
960 "Attribute not found.");
961
962
963/*
964 * SyntaxError extends StandardError
965 */
966static PyObject *
967SyntaxError_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
968{
969 PySyntaxErrorObject *self = NULL;
970
971 self = (PySyntaxErrorObject *)BaseException_new(type, args, kwds);
972 if (!self)
973 return NULL;
974
975 MAKE_IT_NONE(self->msg)
976 MAKE_IT_NONE(self->filename)
977 MAKE_IT_NONE(self->lineno)
978 MAKE_IT_NONE(self->offset)
979 MAKE_IT_NONE(self->text)
980
981 /* this is always None - yes, I know it doesn't seem to be used
982 anywhere, but it was in the previous implementation */
983 MAKE_IT_NONE(self->print_file_and_line)
984
985 return (PyObject *)self;
986}
987
988static int
989SyntaxError_init(PySyntaxErrorObject *self, PyObject *args, PyObject *kwds)
990{
991 PyObject *info = NULL;
992 Py_ssize_t lenargs = PyTuple_GET_SIZE(args);
993
994 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
995 return -1;
996
997 if (lenargs >= 1) {
998 Py_DECREF(self->msg);
999 self->msg = PyTuple_GET_ITEM(args, 0);
1000 Py_INCREF(self->msg);
1001 }
1002 if (lenargs == 2) {
1003 info = PyTuple_GET_ITEM(args, 1);
1004 info = PySequence_Tuple(info);
1005 if (!info) return -1;
1006
1007 Py_DECREF(self->filename);
1008 self->filename = PyTuple_GET_ITEM(info, 0);
1009 Py_INCREF(self->filename);
1010
1011 Py_DECREF(self->lineno);
1012 self->lineno = PyTuple_GET_ITEM(info, 1);
1013 Py_INCREF(self->lineno);
1014
1015 Py_DECREF(self->offset);
1016 self->offset = PyTuple_GET_ITEM(info, 2);
1017 Py_INCREF(self->offset);
1018
1019 Py_DECREF(self->text);
1020 self->text = PyTuple_GET_ITEM(info, 3);
1021 Py_INCREF(self->text);
1022 }
1023 return 0;
1024}
1025
1026int
1027SyntaxError_clear(PySyntaxErrorObject *self)
1028{
1029 Py_CLEAR(self->msg);
1030 Py_CLEAR(self->filename);
1031 Py_CLEAR(self->lineno);
1032 Py_CLEAR(self->offset);
1033 Py_CLEAR(self->text);
1034 Py_CLEAR(self->print_file_and_line);
1035 return BaseException_clear((PyBaseExceptionObject *)self);
1036}
1037
1038static void
1039SyntaxError_dealloc(PySyntaxErrorObject *self)
1040{
1041 SyntaxError_clear(self);
1042 self->ob_type->tp_free((PyObject *)self);
1043}
1044
1045int
1046SyntaxError_traverse(PySyntaxErrorObject *self, visitproc visit, void *arg)
1047{
1048 Py_VISIT(self->msg);
1049 Py_VISIT(self->filename);
1050 Py_VISIT(self->lineno);
1051 Py_VISIT(self->offset);
1052 Py_VISIT(self->text);
1053 Py_VISIT(self->print_file_and_line);
1054 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1055}
1056
1057/* This is called "my_basename" instead of just "basename" to avoid name
1058 conflicts with glibc; basename is already prototyped if _GNU_SOURCE is
1059 defined, and Python does define that. */
1060static char *
1061my_basename(char *name)
1062{
1063 char *cp = name;
1064 char *result = name;
1065
1066 if (name == NULL)
1067 return "???";
1068 while (*cp != '\0') {
1069 if (*cp == SEP)
1070 result = cp + 1;
1071 ++cp;
1072 }
1073 return result;
1074}
1075
1076
1077static PyObject *
1078SyntaxError_str(PySyntaxErrorObject *self)
1079{
1080 PyObject *str;
1081 PyObject *result;
1082
1083 str = PyObject_Str(self->msg);
1084 result = str;
1085
1086 /* XXX -- do all the additional formatting with filename and
1087 lineno here */
1088
1089 if (str != NULL && PyString_Check(str)) {
1090 int have_filename = 0;
1091 int have_lineno = 0;
1092 char *buffer = NULL;
1093
1094 have_filename = (self->filename != NULL) &&
1095 PyString_Check(self->filename);
1096 have_lineno = (self->lineno != NULL) && PyInt_Check(self->lineno);
1097
1098 if (have_filename || have_lineno) {
1099 Py_ssize_t bufsize = PyString_GET_SIZE(str) + 64;
1100 if (have_filename)
1101 bufsize += PyString_GET_SIZE(self->filename);
1102
1103 buffer = (char *)PyMem_MALLOC(bufsize);
1104 if (buffer != NULL) {
1105 if (have_filename && have_lineno)
1106 PyOS_snprintf(buffer, bufsize, "%s (%s, line %ld)",
1107 PyString_AS_STRING(str),
1108 my_basename(PyString_AS_STRING(self->filename)),
1109 PyInt_AsLong(self->lineno));
1110 else if (have_filename)
1111 PyOS_snprintf(buffer, bufsize, "%s (%s)",
1112 PyString_AS_STRING(str),
1113 my_basename(PyString_AS_STRING(self->filename)));
1114 else if (have_lineno)
1115 PyOS_snprintf(buffer, bufsize, "%s (line %ld)",
1116 PyString_AS_STRING(str),
1117 PyInt_AsLong(self->lineno));
1118
1119 result = PyString_FromString(buffer);
1120 PyMem_FREE(buffer);
1121
1122 if (result == NULL)
1123 result = str;
1124 else
1125 Py_DECREF(str);
1126 }
1127 }
1128 }
1129 return result;
1130}
1131
1132static PyMemberDef SyntaxError_members[] = {
1133 {"message", T_OBJECT, offsetof(PySyntaxErrorObject, message), 0,
1134 PyDoc_STR("exception message")},
1135 {"msg", T_OBJECT, offsetof(PySyntaxErrorObject, msg), 0,
1136 PyDoc_STR("exception msg")},
1137 {"filename", T_OBJECT, offsetof(PySyntaxErrorObject, filename), 0,
1138 PyDoc_STR("exception filename")},
1139 {"lineno", T_OBJECT, offsetof(PySyntaxErrorObject, lineno), 0,
1140 PyDoc_STR("exception lineno")},
1141 {"offset", T_OBJECT, offsetof(PySyntaxErrorObject, offset), 0,
1142 PyDoc_STR("exception offset")},
1143 {"text", T_OBJECT, offsetof(PySyntaxErrorObject, text), 0,
1144 PyDoc_STR("exception text")},
1145 {"print_file_and_line", T_OBJECT,
1146 offsetof(PySyntaxErrorObject, print_file_and_line), 0,
1147 PyDoc_STR("exception print_file_and_line")},
1148 {NULL} /* Sentinel */
1149};
1150
1151ComplexExtendsException(PyExc_StandardError, SyntaxError, SyntaxError,
1152 SyntaxError_dealloc, 0, SyntaxError_members,
1153 SyntaxError_str, "Invalid syntax.");
1154
1155
1156/*
1157 * IndentationError extends SyntaxError
1158 */
1159MiddlingExtendsException(PyExc_SyntaxError, IndentationError, SyntaxError,
1160 "Improper indentation.");
1161
1162
1163/*
1164 * TabError extends IndentationError
1165 */
1166MiddlingExtendsException(PyExc_IndentationError, TabError, SyntaxError,
1167 "Improper mixture of spaces and tabs.");
1168
1169
1170/*
1171 * LookupError extends StandardError
1172 */
1173SimpleExtendsException(PyExc_StandardError, LookupError,
1174 "Base class for lookup errors.");
1175
1176
1177/*
1178 * IndexError extends LookupError
1179 */
1180SimpleExtendsException(PyExc_LookupError, IndexError,
1181 "Sequence index out of range.");
1182
1183
1184/*
1185 * KeyError extends LookupError
1186 */
1187static PyObject *
1188KeyError_str(PyBaseExceptionObject *self)
1189{
1190 /* If args is a tuple of exactly one item, apply repr to args[0].
1191 This is done so that e.g. the exception raised by {}[''] prints
1192 KeyError: ''
1193 rather than the confusing
1194 KeyError
1195 alone. The downside is that if KeyError is raised with an explanatory
1196 string, that string will be displayed in quotes. Too bad.
1197 If args is anything else, use the default BaseException__str__().
1198 */
1199 if (PyTuple_Check(self->args) && PyTuple_GET_SIZE(self->args) == 1) {
1200 PyObject *key = PyTuple_GET_ITEM(self->args, 0);
1201 return PyObject_Repr(key);
1202 }
1203 return BaseException_str(self);
1204}
1205
1206ComplexExtendsException(PyExc_LookupError, KeyError, BaseException,
1207 0, 0, 0, KeyError_str, "Mapping key not found.");
1208
1209
1210/*
1211 * ValueError extends StandardError
1212 */
1213SimpleExtendsException(PyExc_StandardError, ValueError,
1214 "Inappropriate argument value (of correct type).");
1215
1216/*
1217 * UnicodeError extends ValueError
1218 */
1219
1220SimpleExtendsException(PyExc_ValueError, UnicodeError,
1221 "Unicode related error.");
1222
1223#ifdef Py_USING_UNICODE
1224static int
1225get_int(PyObject *attr, Py_ssize_t *value, const char *name)
1226{
1227 if (!attr) {
1228 PyErr_Format(PyExc_TypeError, "%.200s attribute not set", name);
1229 return -1;
1230 }
1231
1232 if (PyInt_Check(attr)) {
1233 *value = PyInt_AS_LONG(attr);
1234 } else if (PyLong_Check(attr)) {
1235 *value = _PyLong_AsSsize_t(attr);
1236 if (*value == -1 && PyErr_Occurred())
1237 return -1;
1238 } else {
1239 PyErr_Format(PyExc_TypeError, "%.200s attribute must be int", name);
1240 return -1;
1241 }
1242 return 0;
1243}
1244
1245static int
1246set_ssize_t(PyObject **attr, Py_ssize_t value)
1247{
1248 PyObject *obj = PyInt_FromSsize_t(value);
1249 if (!obj)
1250 return -1;
1251 Py_XDECREF(*attr);
1252 *attr = obj;
1253 return 0;
1254}
1255
1256static PyObject *
1257get_string(PyObject *attr, const char *name)
1258{
1259 if (!attr) {
1260 PyErr_Format(PyExc_TypeError, "%.200s attribute not set", name);
1261 return NULL;
1262 }
1263
1264 if (!PyString_Check(attr)) {
1265 PyErr_Format(PyExc_TypeError, "%.200s attribute must be str", name);
1266 return NULL;
1267 }
1268 Py_INCREF(attr);
1269 return attr;
1270}
1271
1272
1273static int
1274set_string(PyObject **attr, const char *value)
1275{
1276 PyObject *obj = PyString_FromString(value);
1277 if (!obj)
1278 return -1;
1279 Py_XDECREF(*attr);
1280 *attr = obj;
1281 return 0;
1282}
1283
1284
1285static PyObject *
1286get_unicode(PyObject *attr, const char *name)
1287{
1288 if (!attr) {
1289 PyErr_Format(PyExc_TypeError, "%.200s attribute not set", name);
1290 return NULL;
1291 }
1292
1293 if (!PyUnicode_Check(attr)) {
1294 PyErr_Format(PyExc_TypeError,
1295 "%.200s attribute must be unicode", name);
1296 return NULL;
1297 }
1298 Py_INCREF(attr);
1299 return attr;
1300}
1301
1302PyObject *
1303PyUnicodeEncodeError_GetEncoding(PyObject *exc)
1304{
1305 return get_string(((PyUnicodeErrorObject *)exc)->encoding, "encoding");
1306}
1307
1308PyObject *
1309PyUnicodeDecodeError_GetEncoding(PyObject *exc)
1310{
1311 return get_string(((PyUnicodeErrorObject *)exc)->encoding, "encoding");
1312}
1313
1314PyObject *
1315PyUnicodeEncodeError_GetObject(PyObject *exc)
1316{
1317 return get_unicode(((PyUnicodeErrorObject *)exc)->object, "object");
1318}
1319
1320PyObject *
1321PyUnicodeDecodeError_GetObject(PyObject *exc)
1322{
1323 return get_string(((PyUnicodeErrorObject *)exc)->object, "object");
1324}
1325
1326PyObject *
1327PyUnicodeTranslateError_GetObject(PyObject *exc)
1328{
1329 return get_unicode(((PyUnicodeErrorObject *)exc)->object, "object");
1330}
1331
1332int
1333PyUnicodeEncodeError_GetStart(PyObject *exc, Py_ssize_t *start)
1334{
1335 if (!get_int(((PyUnicodeErrorObject *)exc)->start, start, "start")) {
1336 Py_ssize_t size;
1337 PyObject *obj = get_unicode(((PyUnicodeErrorObject *)exc)->object,
1338 "object");
1339 if (!obj) return -1;
1340 size = PyUnicode_GET_SIZE(obj);
1341 if (*start<0)
1342 *start = 0; /*XXX check for values <0*/
1343 if (*start>=size)
1344 *start = size-1;
1345 return 0;
1346 }
1347 return -1;
1348}
1349
1350
1351int
1352PyUnicodeDecodeError_GetStart(PyObject *exc, Py_ssize_t *start)
1353{
1354 if (!get_int(((PyUnicodeErrorObject *)exc)->start, start, "start")) {
1355 Py_ssize_t size;
1356 PyObject *obj = get_string(((PyUnicodeErrorObject *)exc)->object,
1357 "object");
1358 if (!obj) return -1;
1359 size = PyString_GET_SIZE(obj);
1360 if (*start<0)
1361 *start = 0;
1362 if (*start>=size)
1363 *start = size-1;
1364 return 0;
1365 }
1366 return -1;
1367}
1368
1369
1370int
1371PyUnicodeTranslateError_GetStart(PyObject *exc, Py_ssize_t *start)
1372{
1373 return PyUnicodeEncodeError_GetStart(exc, start);
1374}
1375
1376
1377int
1378PyUnicodeEncodeError_SetStart(PyObject *exc, Py_ssize_t start)
1379{
1380 return set_ssize_t(&((PyUnicodeErrorObject *)exc)->start, start);
1381}
1382
1383
1384int
1385PyUnicodeDecodeError_SetStart(PyObject *exc, Py_ssize_t start)
1386{
1387 return set_ssize_t(&((PyUnicodeErrorObject *)exc)->start, start);
1388}
1389
1390
1391int
1392PyUnicodeTranslateError_SetStart(PyObject *exc, Py_ssize_t start)
1393{
1394 return set_ssize_t(&((PyUnicodeErrorObject *)exc)->start, start);
1395}
1396
1397
1398int
1399PyUnicodeEncodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
1400{
1401 if (!get_int(((PyUnicodeErrorObject *)exc)->end, end, "end")) {
1402 Py_ssize_t size;
1403 PyObject *obj = get_unicode(((PyUnicodeErrorObject *)exc)->object,
1404 "object");
1405 if (!obj) return -1;
1406 size = PyUnicode_GET_SIZE(obj);
1407 if (*end<1)
1408 *end = 1;
1409 if (*end>size)
1410 *end = size;
1411 return 0;
1412 }
1413 return -1;
1414}
1415
1416
1417int
1418PyUnicodeDecodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
1419{
1420 if (!get_int(((PyUnicodeErrorObject *)exc)->end, end, "end")) {
1421 Py_ssize_t size;
1422 PyObject *obj = get_string(((PyUnicodeErrorObject *)exc)->object,
1423 "object");
1424 if (!obj) return -1;
1425 size = PyString_GET_SIZE(obj);
1426 if (*end<1)
1427 *end = 1;
1428 if (*end>size)
1429 *end = size;
1430 return 0;
1431 }
1432 return -1;
1433}
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{
1446 return set_ssize_t(&((PyUnicodeErrorObject *)exc)->end, end);
1447}
1448
1449
1450int
1451PyUnicodeDecodeError_SetEnd(PyObject *exc, Py_ssize_t end)
1452{
1453 return set_ssize_t(&((PyUnicodeErrorObject *)exc)->end, end);
1454}
1455
1456
1457int
1458PyUnicodeTranslateError_SetEnd(PyObject *exc, Py_ssize_t end)
1459{
1460 return set_ssize_t(&((PyUnicodeErrorObject *)exc)->end, end);
1461}
1462
1463PyObject *
1464PyUnicodeEncodeError_GetReason(PyObject *exc)
1465{
1466 return get_string(((PyUnicodeErrorObject *)exc)->reason, "reason");
1467}
1468
1469
1470PyObject *
1471PyUnicodeDecodeError_GetReason(PyObject *exc)
1472{
1473 return get_string(((PyUnicodeErrorObject *)exc)->reason, "reason");
1474}
1475
1476
1477PyObject *
1478PyUnicodeTranslateError_GetReason(PyObject *exc)
1479{
1480 return get_string(((PyUnicodeErrorObject *)exc)->reason, "reason");
1481}
1482
1483
1484int
1485PyUnicodeEncodeError_SetReason(PyObject *exc, const char *reason)
1486{
1487 return set_string(&((PyUnicodeErrorObject *)exc)->reason, reason);
1488}
1489
1490
1491int
1492PyUnicodeDecodeError_SetReason(PyObject *exc, const char *reason)
1493{
1494 return set_string(&((PyUnicodeErrorObject *)exc)->reason, reason);
1495}
1496
1497
1498int
1499PyUnicodeTranslateError_SetReason(PyObject *exc, const char *reason)
1500{
1501 return set_string(&((PyUnicodeErrorObject *)exc)->reason, reason);
1502}
1503
1504
1505static PyObject *
1506UnicodeError_new(PyTypeObject *type, PyObject *args, PyObject *kwds,
1507 PyTypeObject *objecttype)
1508{
1509 PyUnicodeErrorObject *self;
1510
1511 self = (PyUnicodeErrorObject *)BaseException_new(type, args, kwds);
1512 if (!self)
1513 return NULL;
1514
1515 MAKE_IT_NONE(self->encoding);
1516 MAKE_IT_NONE(self->object);
1517 MAKE_IT_NONE(self->start);
1518 MAKE_IT_NONE(self->end);
1519 MAKE_IT_NONE(self->reason);
1520
1521 return (PyObject *)self;
1522}
1523
1524static int
1525UnicodeError_init(PyUnicodeErrorObject *self, PyObject *args, PyObject *kwds,
1526 PyTypeObject *objecttype)
1527{
1528 if (!PyArg_ParseTuple(args, "O!O!O!O!O!",
1529 &PyString_Type, &self->encoding,
1530 objecttype, &self->object,
1531 &PyInt_Type, &self->start,
1532 &PyInt_Type, &self->end,
1533 &PyString_Type, &self->reason)) {
1534 self->encoding = self->object = self->start = self->end =
1535 self->reason = NULL;
1536 return -1;
1537 }
1538
1539 Py_INCREF(self->encoding);
1540 Py_INCREF(self->object);
1541 Py_INCREF(self->start);
1542 Py_INCREF(self->end);
1543 Py_INCREF(self->reason);
1544
1545 return 0;
1546}
1547
1548int
1549UnicodeError_clear(PyUnicodeErrorObject *self)
1550{
1551 Py_CLEAR(self->encoding);
1552 Py_CLEAR(self->object);
1553 Py_CLEAR(self->start);
1554 Py_CLEAR(self->end);
1555 Py_CLEAR(self->reason);
1556 return BaseException_clear((PyBaseExceptionObject *)self);
1557}
1558
1559static void
1560UnicodeError_dealloc(PyUnicodeErrorObject *self)
1561{
1562 UnicodeError_clear(self);
1563 self->ob_type->tp_free((PyObject *)self);
1564}
1565
1566int
1567UnicodeError_traverse(PyUnicodeErrorObject *self, visitproc visit, void *arg)
1568{
1569 Py_VISIT(self->encoding);
1570 Py_VISIT(self->object);
1571 Py_VISIT(self->start);
1572 Py_VISIT(self->end);
1573 Py_VISIT(self->reason);
1574 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1575}
1576
1577static PyMemberDef UnicodeError_members[] = {
1578 {"message", T_OBJECT, offsetof(PyUnicodeErrorObject, message), 0,
1579 PyDoc_STR("exception message")},
1580 {"encoding", T_OBJECT, offsetof(PyUnicodeErrorObject, encoding), 0,
1581 PyDoc_STR("exception encoding")},
1582 {"object", T_OBJECT, offsetof(PyUnicodeErrorObject, object), 0,
1583 PyDoc_STR("exception object")},
1584 {"start", T_OBJECT, offsetof(PyUnicodeErrorObject, start), 0,
1585 PyDoc_STR("exception start")},
1586 {"end", T_OBJECT, offsetof(PyUnicodeErrorObject, end), 0,
1587 PyDoc_STR("exception end")},
1588 {"reason", T_OBJECT, offsetof(PyUnicodeErrorObject, reason), 0,
1589 PyDoc_STR("exception reason")},
1590 {NULL} /* Sentinel */
1591};
1592
1593
1594/*
1595 * UnicodeEncodeError extends UnicodeError
1596 */
1597static PyObject *
1598UnicodeEncodeError_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1599{
1600 return UnicodeError_new(type, args, kwds, &PyUnicode_Type);
1601}
1602
1603static int
1604UnicodeEncodeError_init(PyObject *self, PyObject *args, PyObject *kwds)
1605{
1606 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1607 return -1;
1608 return UnicodeError_init((PyUnicodeErrorObject *)self, args,
1609 kwds, &PyUnicode_Type);
1610}
1611
1612static PyObject *
1613UnicodeEncodeError_str(PyObject *self)
1614{
1615 Py_ssize_t start;
1616 Py_ssize_t end;
1617
1618 if (PyUnicodeEncodeError_GetStart(self, &start))
1619 return NULL;
1620
1621 if (PyUnicodeEncodeError_GetEnd(self, &end))
1622 return NULL;
1623
1624 if (end==start+1) {
1625 int badchar = (int)PyUnicode_AS_UNICODE(((PyUnicodeErrorObject *)self)->object)[start];
1626 char badchar_str[20];
1627 if (badchar <= 0xff)
1628 PyOS_snprintf(badchar_str, sizeof(badchar_str), "x%02x", badchar);
1629 else if (badchar <= 0xffff)
1630 PyOS_snprintf(badchar_str, sizeof(badchar_str), "u%04x", badchar);
1631 else
1632 PyOS_snprintf(badchar_str, sizeof(badchar_str), "U%08x", badchar);
1633 return PyString_FromFormat(
1634 "'%.400s' codec can't encode character u'\\%s' in position %zd: %.400s",
1635 PyString_AS_STRING(((PyUnicodeErrorObject *)self)->encoding),
1636 badchar_str,
1637 start,
1638 PyString_AS_STRING(((PyUnicodeErrorObject *)self)->reason)
1639 );
1640 }
1641 return PyString_FromFormat(
1642 "'%.400s' codec can't encode characters in position %zd-%zd: %.400s",
1643 PyString_AS_STRING(((PyUnicodeErrorObject *)self)->encoding),
1644 start,
1645 (end-1),
1646 PyString_AS_STRING(((PyUnicodeErrorObject *)self)->reason)
1647 );
1648}
1649
1650static PyTypeObject _PyExc_UnicodeEncodeError = {
1651 PyObject_HEAD_INIT(NULL)
1652 0,
1653 "UnicodeEncodeError",
1654 sizeof(PyUnicodeErrorObject), 0,
1655 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1656 (reprfunc)UnicodeEncodeError_str, 0, 0, 0,
1657 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
1658 PyDoc_STR("Unicode encoding error."), (traverseproc)BaseException_traverse,
1659 (inquiry)BaseException_clear, 0, 0, 0, 0, 0, UnicodeError_members,
1660 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
1661 (initproc)UnicodeEncodeError_init, 0, UnicodeEncodeError_new,
1662};
1663PyObject *PyExc_UnicodeEncodeError = (PyObject *)&_PyExc_UnicodeEncodeError;
1664
1665PyObject *
1666PyUnicodeEncodeError_Create(
1667 const char *encoding, const Py_UNICODE *object, Py_ssize_t length,
1668 Py_ssize_t start, Py_ssize_t end, const char *reason)
1669{
1670 return PyObject_CallFunction(PyExc_UnicodeEncodeError, "su#nns",
1671 encoding, object, length, start, end, reason);
1672}
1673
1674
1675/*
1676 * UnicodeDecodeError extends UnicodeError
1677 */
1678static PyObject *
1679UnicodeDecodeError_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1680{
1681 return UnicodeError_new(type, args, kwds, &PyString_Type);
1682}
1683
1684static int
1685UnicodeDecodeError_init(PyObject *self, PyObject *args, PyObject *kwds)
1686{
1687 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1688 return -1;
1689 return UnicodeError_init((PyUnicodeErrorObject *)self, args,
1690 kwds, &PyString_Type);
1691}
1692
1693static PyObject *
1694UnicodeDecodeError_str(PyObject *self)
1695{
1696 Py_ssize_t start;
1697 Py_ssize_t end;
1698
1699 if (PyUnicodeDecodeError_GetStart(self, &start))
1700 return NULL;
1701
1702 if (PyUnicodeDecodeError_GetEnd(self, &end))
1703 return NULL;
1704
1705 if (end==start+1) {
1706 /* FromFormat does not support %02x, so format that separately */
1707 char byte[4];
1708 PyOS_snprintf(byte, sizeof(byte), "%02x",
1709 ((int)PyString_AS_STRING(((PyUnicodeErrorObject *)self)->object)[start])&0xff);
1710 return PyString_FromFormat(
1711 "'%.400s' codec can't decode byte 0x%s in position %zd: %.400s",
1712 PyString_AS_STRING(((PyUnicodeErrorObject *)self)->encoding),
1713 byte,
1714 start,
1715 PyString_AS_STRING(((PyUnicodeErrorObject *)self)->reason)
1716 );
1717 }
1718 return PyString_FromFormat(
1719 "'%.400s' codec can't decode bytes in position %zd-%zd: %.400s",
1720 PyString_AS_STRING(((PyUnicodeErrorObject *)self)->encoding),
1721 start,
1722 (end-1),
1723 PyString_AS_STRING(((PyUnicodeErrorObject *)self)->reason)
1724 );
1725}
1726
1727static PyTypeObject _PyExc_UnicodeDecodeError = {
1728 PyObject_HEAD_INIT(NULL)
1729 0,
1730 EXC_MODULE_NAME "UnicodeDecodeError",
1731 sizeof(PyUnicodeErrorObject), 0,
1732 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1733 (reprfunc)UnicodeDecodeError_str, 0, 0, 0,
1734 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
1735 PyDoc_STR("Unicode decoding error."), (traverseproc)BaseException_traverse,
1736 (inquiry)BaseException_clear, 0, 0, 0, 0, 0, UnicodeError_members,
1737 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
1738 (initproc)UnicodeDecodeError_init, 0, UnicodeDecodeError_new,
1739};
1740PyObject *PyExc_UnicodeDecodeError = (PyObject *)&_PyExc_UnicodeDecodeError;
1741
1742PyObject *
1743PyUnicodeDecodeError_Create(
1744 const char *encoding, const char *object, Py_ssize_t length,
1745 Py_ssize_t start, Py_ssize_t end, const char *reason)
1746{
1747 assert(length < INT_MAX);
1748 assert(start < INT_MAX);
1749 assert(end < INT_MAX);
1750 return PyObject_CallFunction(PyExc_UnicodeDecodeError, "ss#nns",
1751 encoding, object, length, start, end, reason);
1752}
1753
1754
1755/*
1756 * UnicodeTranslateError extends UnicodeError
1757 */
1758static PyObject *
1759UnicodeTranslateError_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1760{
1761 PyUnicodeErrorObject *self = NULL;
1762
1763 self = (PyUnicodeErrorObject *)BaseException_new(type, args, kwds);
1764 if (!self)
1765 return NULL;
1766
1767 MAKE_IT_NONE(self->encoding);
1768 MAKE_IT_NONE(self->object);
1769 MAKE_IT_NONE(self->start);
1770 MAKE_IT_NONE(self->end);
1771 MAKE_IT_NONE(self->reason);
1772
1773 return (PyObject *)self;
1774}
1775
1776static int
1777UnicodeTranslateError_init(PyUnicodeErrorObject *self, PyObject *args,
1778 PyObject *kwds)
1779{
1780 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1781 return -1;
1782
1783 Py_CLEAR(self->object);
1784 Py_CLEAR(self->start);
1785 Py_CLEAR(self->end);
1786 Py_CLEAR(self->reason);
1787
1788 if (!PyArg_ParseTuple(args, "O!O!O!O!",
1789 &PyUnicode_Type, &self->object,
1790 &PyInt_Type, &self->start,
1791 &PyInt_Type, &self->end,
1792 &PyString_Type, &self->reason)) {
1793 self->object = self->start = self->end = self->reason = NULL;
1794 return -1;
1795 }
1796
1797 Py_INCREF(self->object);
1798 Py_INCREF(self->start);
1799 Py_INCREF(self->end);
1800 Py_INCREF(self->reason);
1801
1802 return 0;
1803}
1804
1805
1806static PyObject *
1807UnicodeTranslateError_str(PyObject *self)
1808{
1809 Py_ssize_t start;
1810 Py_ssize_t end;
1811
1812 if (PyUnicodeTranslateError_GetStart(self, &start))
1813 return NULL;
1814
1815 if (PyUnicodeTranslateError_GetEnd(self, &end))
1816 return NULL;
1817
1818 if (end==start+1) {
1819 int badchar = (int)PyUnicode_AS_UNICODE(((PyUnicodeErrorObject *)self)->object)[start];
1820 char badchar_str[20];
1821 if (badchar <= 0xff)
1822 PyOS_snprintf(badchar_str, sizeof(badchar_str), "x%02x", badchar);
1823 else if (badchar <= 0xffff)
1824 PyOS_snprintf(badchar_str, sizeof(badchar_str), "u%04x", badchar);
1825 else
1826 PyOS_snprintf(badchar_str, sizeof(badchar_str), "U%08x", badchar);
1827 return PyString_FromFormat(
1828 "can't translate character u'\\%s' in position %zd: %.400s",
1829 badchar_str,
1830 start,
1831 PyString_AS_STRING(((PyUnicodeErrorObject *)self)->reason)
1832 );
1833 }
1834 return PyString_FromFormat(
1835 "can't translate characters in position %zd-%zd: %.400s",
1836 start,
1837 (end-1),
1838 PyString_AS_STRING(((PyUnicodeErrorObject *)self)->reason)
1839 );
1840}
1841
1842static PyTypeObject _PyExc_UnicodeTranslateError = {
1843 PyObject_HEAD_INIT(NULL)
1844 0,
1845 EXC_MODULE_NAME "UnicodeTranslateError",
1846 sizeof(PyUnicodeErrorObject), 0,
1847 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1848 (reprfunc)UnicodeTranslateError_str, 0, 0, 0,
1849 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
1850 PyDoc_STR("Unicode decoding error."), (traverseproc)UnicodeError_traverse,
1851 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
1852 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
1853 (initproc)UnicodeTranslateError_init, 0, UnicodeTranslateError_new,
1854};
1855PyObject *PyExc_UnicodeTranslateError = (PyObject *)&_PyExc_UnicodeTranslateError;
1856
1857PyObject *
1858PyUnicodeTranslateError_Create(
1859 const Py_UNICODE *object, Py_ssize_t length,
1860 Py_ssize_t start, Py_ssize_t end, const char *reason)
1861{
1862 return PyObject_CallFunction(PyExc_UnicodeTranslateError, "u#nns",
1863 object, length, start, end, reason);
1864}
1865#endif
1866
1867
1868/*
1869 * AssertionError extends StandardError
1870 */
1871SimpleExtendsException(PyExc_StandardError, AssertionError,
1872 "Assertion failed.");
1873
1874
1875/*
1876 * ArithmeticError extends StandardError
1877 */
1878SimpleExtendsException(PyExc_StandardError, ArithmeticError,
1879 "Base class for arithmetic errors.");
1880
1881
1882/*
1883 * FloatingPointError extends ArithmeticError
1884 */
1885SimpleExtendsException(PyExc_ArithmeticError, FloatingPointError,
1886 "Floating point operation failed.");
1887
1888
1889/*
1890 * OverflowError extends ArithmeticError
1891 */
1892SimpleExtendsException(PyExc_ArithmeticError, OverflowError,
1893 "Result too large to be represented.");
1894
1895
1896/*
1897 * ZeroDivisionError extends ArithmeticError
1898 */
1899SimpleExtendsException(PyExc_ArithmeticError, ZeroDivisionError,
1900 "Second argument to a division or modulo operation was zero.");
1901
1902
1903/*
1904 * SystemError extends StandardError
1905 */
1906SimpleExtendsException(PyExc_StandardError, SystemError,
1907 "Internal error in the Python interpreter.\n"
1908 "\n"
1909 "Please report this to the Python maintainer, along with the traceback,\n"
1910 "the Python version, and the hardware/OS platform and version.");
1911
1912
1913/*
1914 * ReferenceError extends StandardError
1915 */
1916SimpleExtendsException(PyExc_StandardError, ReferenceError,
1917 "Weak ref proxy used after referent went away.");
1918
1919
1920/*
1921 * MemoryError extends StandardError
1922 */
1923SimpleExtendsException(PyExc_StandardError, MemoryError, "Out of memory.");
1924
1925
1926/* Warning category docstrings */
1927
1928/*
1929 * Warning extends Exception
1930 */
1931SimpleExtendsException(PyExc_Exception, Warning,
1932 "Base class for warning categories.");
1933
1934
1935/*
1936 * UserWarning extends Warning
1937 */
1938SimpleExtendsException(PyExc_Warning, UserWarning,
1939 "Base class for warnings generated by user code.");
1940
1941
1942/*
1943 * DeprecationWarning extends Warning
1944 */
1945SimpleExtendsException(PyExc_Warning, DeprecationWarning,
1946 "Base class for warnings about deprecated features.");
1947
1948
1949/*
1950 * PendingDeprecationWarning extends Warning
1951 */
1952SimpleExtendsException(PyExc_Warning, PendingDeprecationWarning,
1953 "Base class for warnings about features which will be deprecated\n"
1954 "in the future.");
1955
1956
1957/*
1958 * SyntaxWarning extends Warning
1959 */
1960SimpleExtendsException(PyExc_Warning, SyntaxWarning,
1961 "Base class for warnings about dubious syntax.");
1962
1963
1964/*
1965 * RuntimeWarning extends Warning
1966 */
1967SimpleExtendsException(PyExc_Warning, RuntimeWarning,
1968 "Base class for warnings about dubious runtime behavior.");
1969
1970
1971/*
1972 * FutureWarning extends Warning
1973 */
1974SimpleExtendsException(PyExc_Warning, FutureWarning,
1975 "Base class for warnings about constructs that will change semantically\n"
1976 "in the future.");
1977
1978
1979/*
1980 * ImportWarning extends Warning
1981 */
1982SimpleExtendsException(PyExc_Warning, ImportWarning,
1983 "Base class for warnings about probable mistakes in module imports");
1984
1985
1986/* Pre-computed MemoryError instance. Best to create this as early as
1987 * possible and not wait until a MemoryError is actually raised!
1988 */
1989PyObject *PyExc_MemoryErrorInst=NULL;
1990
1991/* module global functions */
1992static PyMethodDef functions[] = {
1993 /* Sentinel */
1994 {NULL, NULL}
1995};
1996
1997#define PRE_INIT(TYPE) if (PyType_Ready(&_PyExc_ ## TYPE) < 0) \
1998 Py_FatalError("exceptions bootstrapping error.");
1999
2000#define POST_INIT(TYPE) Py_INCREF(PyExc_ ## TYPE); \
2001 PyModule_AddObject(m, # TYPE, PyExc_ ## TYPE); \
2002 if (PyDict_SetItemString(bdict, # TYPE, PyExc_ ## TYPE)) \
2003 Py_FatalError("Module dictionary insertion problem.");
2004
2005PyMODINIT_FUNC
2006_PyExc_Init(void)
2007{
2008 PyObject *m, *bltinmod, *bdict;
2009
2010 PRE_INIT(BaseException)
2011 PRE_INIT(Exception)
2012 PRE_INIT(StandardError)
2013 PRE_INIT(TypeError)
2014 PRE_INIT(StopIteration)
2015 PRE_INIT(GeneratorExit)
2016 PRE_INIT(SystemExit)
2017 PRE_INIT(KeyboardInterrupt)
2018 PRE_INIT(ImportError)
2019 PRE_INIT(EnvironmentError)
2020 PRE_INIT(IOError)
2021 PRE_INIT(OSError)
2022#ifdef MS_WINDOWS
2023 PRE_INIT(WindowsError)
2024#endif
2025#ifdef __VMS
2026 PRE_INIT(VMSError)
2027#endif
2028 PRE_INIT(EOFError)
2029 PRE_INIT(RuntimeError)
2030 PRE_INIT(NotImplementedError)
2031 PRE_INIT(NameError)
2032 PRE_INIT(UnboundLocalError)
2033 PRE_INIT(AttributeError)
2034 PRE_INIT(SyntaxError)
2035 PRE_INIT(IndentationError)
2036 PRE_INIT(TabError)
2037 PRE_INIT(LookupError)
2038 PRE_INIT(IndexError)
2039 PRE_INIT(KeyError)
2040 PRE_INIT(ValueError)
2041 PRE_INIT(UnicodeError)
2042#ifdef Py_USING_UNICODE
2043 PRE_INIT(UnicodeEncodeError)
2044 PRE_INIT(UnicodeDecodeError)
2045 PRE_INIT(UnicodeTranslateError)
2046#endif
2047 PRE_INIT(AssertionError)
2048 PRE_INIT(ArithmeticError)
2049 PRE_INIT(FloatingPointError)
2050 PRE_INIT(OverflowError)
2051 PRE_INIT(ZeroDivisionError)
2052 PRE_INIT(SystemError)
2053 PRE_INIT(ReferenceError)
2054 PRE_INIT(MemoryError)
2055 PRE_INIT(Warning)
2056 PRE_INIT(UserWarning)
2057 PRE_INIT(DeprecationWarning)
2058 PRE_INIT(PendingDeprecationWarning)
2059 PRE_INIT(SyntaxWarning)
2060 PRE_INIT(RuntimeWarning)
2061 PRE_INIT(FutureWarning)
2062 PRE_INIT(ImportWarning)
2063
2064 m = Py_InitModule4("exceptions", functions, exceptions_doc,
2065 (PyObject *)NULL, PYTHON_API_VERSION);
2066 if (m == NULL) return;
2067
2068 bltinmod = PyImport_ImportModule("__builtin__");
2069 if (bltinmod == NULL)
2070 Py_FatalError("exceptions bootstrapping error.");
2071 bdict = PyModule_GetDict(bltinmod);
2072 if (bdict == NULL)
2073 Py_FatalError("exceptions bootstrapping error.");
2074
2075 POST_INIT(BaseException)
2076 POST_INIT(Exception)
2077 POST_INIT(StandardError)
2078 POST_INIT(TypeError)
2079 POST_INIT(StopIteration)
2080 POST_INIT(GeneratorExit)
2081 POST_INIT(SystemExit)
2082 POST_INIT(KeyboardInterrupt)
2083 POST_INIT(ImportError)
2084 POST_INIT(EnvironmentError)
2085 POST_INIT(IOError)
2086 POST_INIT(OSError)
2087#ifdef MS_WINDOWS
2088 POST_INIT(WindowsError)
2089#endif
2090#ifdef __VMS
2091 POST_INIT(VMSError)
2092#endif
2093 POST_INIT(EOFError)
2094 POST_INIT(RuntimeError)
2095 POST_INIT(NotImplementedError)
2096 POST_INIT(NameError)
2097 POST_INIT(UnboundLocalError)
2098 POST_INIT(AttributeError)
2099 POST_INIT(SyntaxError)
2100 POST_INIT(IndentationError)
2101 POST_INIT(TabError)
2102 POST_INIT(LookupError)
2103 POST_INIT(IndexError)
2104 POST_INIT(KeyError)
2105 POST_INIT(ValueError)
2106 POST_INIT(UnicodeError)
2107#ifdef Py_USING_UNICODE
2108 POST_INIT(UnicodeEncodeError)
2109 POST_INIT(UnicodeDecodeError)
2110 POST_INIT(UnicodeTranslateError)
2111#endif
2112 POST_INIT(AssertionError)
2113 POST_INIT(ArithmeticError)
2114 POST_INIT(FloatingPointError)
2115 POST_INIT(OverflowError)
2116 POST_INIT(ZeroDivisionError)
2117 POST_INIT(SystemError)
2118 POST_INIT(ReferenceError)
2119 POST_INIT(MemoryError)
2120 POST_INIT(Warning)
2121 POST_INIT(UserWarning)
2122 POST_INIT(DeprecationWarning)
2123 POST_INIT(PendingDeprecationWarning)
2124 POST_INIT(SyntaxWarning)
2125 POST_INIT(RuntimeWarning)
2126 POST_INIT(FutureWarning)
2127 POST_INIT(ImportWarning)
2128
2129 PyExc_MemoryErrorInst = BaseException_new(&_PyExc_MemoryError, NULL, NULL);
2130 if (!PyExc_MemoryErrorInst)
2131 Py_FatalError("Cannot pre-allocate MemoryError instance\n");
2132
2133 Py_DECREF(bltinmod);
2134}
2135
2136void
2137_PyExc_Fini(void)
2138{
2139 Py_XDECREF(PyExc_MemoryErrorInst);
2140 PyExc_MemoryErrorInst = NULL;
2141}