source: python/vendor/Python-2.6.5/Objects/exceptions.c

Last change on this file was 2, checked in by Yuri Dario, 15 years ago

Initial import for vendor code.

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