blob: b432d6bab2f312c84805be95b42445cf60325bdb [file] [log] [blame]
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001/*
2 * New exceptions.c written in Iceland by Richard Jones and Georg Brandl.
3 *
4 * Thanks go to Tim Peters and Michael Hudson for debugging.
5 */
6
Thomas Wouters477c8d52006-05-27 19:21:47 +00007#define PY_SSIZE_T_CLEAN
8#include <Python.h>
9#include "structmember.h"
10#include "osdefs.h"
11
Thomas Wouters477c8d52006-05-27 19:21:47 +000012
13/* NOTE: If the exception class hierarchy changes, don't forget to update
14 * Lib/test/exception_hierarchy.txt
15 */
16
Thomas Wouters477c8d52006-05-27 19:21:47 +000017/*
18 * BaseException
19 */
20static PyObject *
21BaseException_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
22{
23 PyBaseExceptionObject *self;
24
25 self = (PyBaseExceptionObject *)type->tp_alloc(type, 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +000026 if (!self)
27 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +000028 /* the dict is created on the fly in PyObject_GenericSetAttr */
Guido van Rossumebe3e162007-05-17 18:20:34 +000029 self->dict = NULL;
Collin Winter1966f1c2007-09-01 20:26:44 +000030 self->traceback = self->cause = self->context = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +000031
32 self->args = PyTuple_New(0);
33 if (!self->args) {
34 Py_DECREF(self);
35 return NULL;
36 }
37
Thomas Wouters477c8d52006-05-27 19:21:47 +000038 return (PyObject *)self;
39}
40
41static int
42BaseException_init(PyBaseExceptionObject *self, PyObject *args, PyObject *kwds)
43{
Christian Heimes90aa7642007-12-19 02:45:37 +000044 if (!_PyArg_NoKeywords(Py_TYPE(self)->tp_name, kwds))
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000045 return -1;
46
Thomas Wouters477c8d52006-05-27 19:21:47 +000047 Py_DECREF(self->args);
48 self->args = args;
49 Py_INCREF(self->args);
50
Thomas Wouters477c8d52006-05-27 19:21:47 +000051 return 0;
52}
53
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000054static int
Thomas Wouters477c8d52006-05-27 19:21:47 +000055BaseException_clear(PyBaseExceptionObject *self)
56{
57 Py_CLEAR(self->dict);
58 Py_CLEAR(self->args);
Collin Winter828f04a2007-08-31 00:04:24 +000059 Py_CLEAR(self->traceback);
Collin Winter1966f1c2007-09-01 20:26:44 +000060 Py_CLEAR(self->cause);
61 Py_CLEAR(self->context);
Thomas Wouters477c8d52006-05-27 19:21:47 +000062 return 0;
63}
64
65static void
66BaseException_dealloc(PyBaseExceptionObject *self)
67{
Thomas Wouters89f507f2006-12-13 04:49:30 +000068 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +000069 BaseException_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +000070 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +000071}
72
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000073static int
Thomas Wouters477c8d52006-05-27 19:21:47 +000074BaseException_traverse(PyBaseExceptionObject *self, visitproc visit, void *arg)
75{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000076 Py_VISIT(self->dict);
Thomas Wouters477c8d52006-05-27 19:21:47 +000077 Py_VISIT(self->args);
Collin Winter828f04a2007-08-31 00:04:24 +000078 Py_VISIT(self->traceback);
Collin Winter1966f1c2007-09-01 20:26:44 +000079 Py_VISIT(self->cause);
80 Py_VISIT(self->context);
Thomas Wouters477c8d52006-05-27 19:21:47 +000081 return 0;
82}
83
84static PyObject *
85BaseException_str(PyBaseExceptionObject *self)
86{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000087 switch (PyTuple_GET_SIZE(self->args)) {
Thomas Wouters477c8d52006-05-27 19:21:47 +000088 case 0:
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +000089 return PyUnicode_FromString("");
Thomas Wouters477c8d52006-05-27 19:21:47 +000090 case 1:
Thomas Heller519a0422007-11-15 20:48:54 +000091 return PyObject_Str(PyTuple_GET_ITEM(self->args, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +000092 default:
Thomas Heller519a0422007-11-15 20:48:54 +000093 return PyObject_Str(self->args);
Thomas Wouters477c8d52006-05-27 19:21:47 +000094 }
Thomas Wouters477c8d52006-05-27 19:21:47 +000095}
96
97static PyObject *
98BaseException_repr(PyBaseExceptionObject *self)
99{
Thomas Wouters477c8d52006-05-27 19:21:47 +0000100 char *name;
101 char *dot;
102
Christian Heimes90aa7642007-12-19 02:45:37 +0000103 name = (char *)Py_TYPE(self)->tp_name;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000104 dot = strrchr(name, '.');
105 if (dot != NULL) name = dot+1;
106
Walter Dörwald7569dfe2007-05-19 21:49:49 +0000107 return PyUnicode_FromFormat("%s%R", name, self->args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000108}
109
110/* Pickling support */
111static PyObject *
112BaseException_reduce(PyBaseExceptionObject *self)
113{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000114 if (self->args && self->dict)
Christian Heimes90aa7642007-12-19 02:45:37 +0000115 return PyTuple_Pack(3, Py_TYPE(self), self->args, self->dict);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000116 else
Christian Heimes90aa7642007-12-19 02:45:37 +0000117 return PyTuple_Pack(2, Py_TYPE(self), self->args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000118}
119
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000120/*
121 * Needed for backward compatibility, since exceptions used to store
122 * all their attributes in the __dict__. Code is taken from cPickle's
123 * load_build function.
124 */
125static PyObject *
126BaseException_setstate(PyObject *self, PyObject *state)
127{
128 PyObject *d_key, *d_value;
129 Py_ssize_t i = 0;
130
131 if (state != Py_None) {
132 if (!PyDict_Check(state)) {
133 PyErr_SetString(PyExc_TypeError, "state is not a dictionary");
134 return NULL;
135 }
136 while (PyDict_Next(state, &i, &d_key, &d_value)) {
137 if (PyObject_SetAttr(self, d_key, d_value) < 0)
138 return NULL;
139 }
140 }
141 Py_RETURN_NONE;
142}
Thomas Wouters477c8d52006-05-27 19:21:47 +0000143
Collin Winter828f04a2007-08-31 00:04:24 +0000144static PyObject *
145BaseException_with_traceback(PyObject *self, PyObject *tb) {
146 if (PyException_SetTraceback(self, tb))
147 return NULL;
148
149 Py_INCREF(self);
150 return self;
151}
152
Georg Brandl76941002008-05-05 21:38:47 +0000153PyDoc_STRVAR(with_traceback_doc,
154"Exception.with_traceback(tb) --\n\
155 set self.__traceback__ to tb and return self.");
156
Thomas Wouters477c8d52006-05-27 19:21:47 +0000157
158static PyMethodDef BaseException_methods[] = {
159 {"__reduce__", (PyCFunction)BaseException_reduce, METH_NOARGS },
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000160 {"__setstate__", (PyCFunction)BaseException_setstate, METH_O },
Georg Brandl76941002008-05-05 21:38:47 +0000161 {"with_traceback", (PyCFunction)BaseException_with_traceback, METH_O,
162 with_traceback_doc},
Thomas Wouters477c8d52006-05-27 19:21:47 +0000163 {NULL, NULL, 0, NULL},
164};
165
166
Thomas Wouters477c8d52006-05-27 19:21:47 +0000167static PyObject *
168BaseException_get_dict(PyBaseExceptionObject *self)
169{
170 if (self->dict == NULL) {
171 self->dict = PyDict_New();
172 if (!self->dict)
173 return NULL;
174 }
175 Py_INCREF(self->dict);
176 return self->dict;
177}
178
179static int
180BaseException_set_dict(PyBaseExceptionObject *self, PyObject *val)
181{
182 if (val == NULL) {
183 PyErr_SetString(PyExc_TypeError, "__dict__ may not be deleted");
184 return -1;
185 }
186 if (!PyDict_Check(val)) {
187 PyErr_SetString(PyExc_TypeError, "__dict__ must be a dictionary");
188 return -1;
189 }
190 Py_CLEAR(self->dict);
191 Py_INCREF(val);
192 self->dict = val;
193 return 0;
194}
195
196static PyObject *
197BaseException_get_args(PyBaseExceptionObject *self)
198{
199 if (self->args == NULL) {
200 Py_INCREF(Py_None);
201 return Py_None;
202 }
203 Py_INCREF(self->args);
204 return self->args;
205}
206
207static int
208BaseException_set_args(PyBaseExceptionObject *self, PyObject *val)
209{
210 PyObject *seq;
211 if (val == NULL) {
212 PyErr_SetString(PyExc_TypeError, "args may not be deleted");
213 return -1;
214 }
215 seq = PySequence_Tuple(val);
216 if (!seq) return -1;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000217 Py_CLEAR(self->args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000218 self->args = seq;
219 return 0;
220}
221
Collin Winter828f04a2007-08-31 00:04:24 +0000222static PyObject *
223BaseException_get_tb(PyBaseExceptionObject *self)
224{
225 if (self->traceback == NULL) {
226 Py_INCREF(Py_None);
227 return Py_None;
228 }
229 Py_INCREF(self->traceback);
230 return self->traceback;
231}
232
233static int
234BaseException_set_tb(PyBaseExceptionObject *self, PyObject *tb)
235{
236 if (tb == NULL) {
237 PyErr_SetString(PyExc_TypeError, "__traceback__ may not be deleted");
238 return -1;
239 }
240 else if (!(tb == Py_None || PyTraceBack_Check(tb))) {
241 PyErr_SetString(PyExc_TypeError,
242 "__traceback__ must be a traceback or None");
243 return -1;
244 }
245
246 Py_XINCREF(tb);
247 Py_XDECREF(self->traceback);
248 self->traceback = tb;
249 return 0;
250}
251
Georg Brandlab6f2f62009-03-31 04:16:10 +0000252static PyObject *
253BaseException_get_context(PyObject *self) {
254 PyObject *res = PyException_GetContext(self);
255 if (res) return res; /* new reference already returned above */
256 Py_RETURN_NONE;
257}
258
259static int
260BaseException_set_context(PyObject *self, PyObject *arg) {
261 if (arg == NULL) {
262 PyErr_SetString(PyExc_TypeError, "__context__ may not be deleted");
263 return -1;
264 } else if (arg == Py_None) {
265 arg = NULL;
266 } else if (!PyExceptionInstance_Check(arg)) {
267 PyErr_SetString(PyExc_TypeError, "exception context must be None "
268 "or derive from BaseException");
269 return -1;
270 } else {
271 /* PyException_SetContext steals this reference */
272 Py_INCREF(arg);
273 }
274 PyException_SetContext(self, arg);
275 return 0;
276}
277
278static PyObject *
279BaseException_get_cause(PyObject *self) {
280 PyObject *res = PyException_GetCause(self);
281 if (res) return res; /* new reference already returned above */
282 Py_RETURN_NONE;
283}
284
285static int
286BaseException_set_cause(PyObject *self, PyObject *arg) {
287 if (arg == NULL) {
288 PyErr_SetString(PyExc_TypeError, "__cause__ may not be deleted");
289 return -1;
290 } else if (arg == Py_None) {
291 arg = NULL;
292 } else if (!PyExceptionInstance_Check(arg)) {
293 PyErr_SetString(PyExc_TypeError, "exception cause must be None "
294 "or derive from BaseException");
295 return -1;
296 } else {
297 /* PyException_SetCause steals this reference */
298 Py_INCREF(arg);
299 }
300 PyException_SetCause(self, arg);
301 return 0;
302}
303
Guido van Rossum360e4b82007-05-14 22:51:27 +0000304
Thomas Wouters477c8d52006-05-27 19:21:47 +0000305static PyGetSetDef BaseException_getset[] = {
306 {"__dict__", (getter)BaseException_get_dict, (setter)BaseException_set_dict},
307 {"args", (getter)BaseException_get_args, (setter)BaseException_set_args},
Collin Winter828f04a2007-08-31 00:04:24 +0000308 {"__traceback__", (getter)BaseException_get_tb, (setter)BaseException_set_tb},
Georg Brandlab6f2f62009-03-31 04:16:10 +0000309 {"__context__", (getter)BaseException_get_context,
310 (setter)BaseException_set_context, PyDoc_STR("exception context")},
311 {"__cause__", (getter)BaseException_get_cause,
312 (setter)BaseException_set_cause, PyDoc_STR("exception cause")},
Thomas Wouters477c8d52006-05-27 19:21:47 +0000313 {NULL},
314};
315
316
Collin Winter828f04a2007-08-31 00:04:24 +0000317PyObject *
318PyException_GetTraceback(PyObject *self) {
319 PyBaseExceptionObject *base_self = (PyBaseExceptionObject *)self;
320 Py_XINCREF(base_self->traceback);
321 return base_self->traceback;
322}
323
324
325int
326PyException_SetTraceback(PyObject *self, PyObject *tb) {
327 return BaseException_set_tb((PyBaseExceptionObject *)self, tb);
328}
329
330PyObject *
331PyException_GetCause(PyObject *self) {
332 PyObject *cause = ((PyBaseExceptionObject *)self)->cause;
333 Py_XINCREF(cause);
334 return cause;
335}
336
337/* Steals a reference to cause */
338void
339PyException_SetCause(PyObject *self, PyObject *cause) {
340 PyObject *old_cause = ((PyBaseExceptionObject *)self)->cause;
341 ((PyBaseExceptionObject *)self)->cause = cause;
342 Py_XDECREF(old_cause);
343}
344
345PyObject *
346PyException_GetContext(PyObject *self) {
347 PyObject *context = ((PyBaseExceptionObject *)self)->context;
348 Py_XINCREF(context);
349 return context;
350}
351
352/* Steals a reference to context */
353void
354PyException_SetContext(PyObject *self, PyObject *context) {
355 PyObject *old_context = ((PyBaseExceptionObject *)self)->context;
356 ((PyBaseExceptionObject *)self)->context = context;
357 Py_XDECREF(old_context);
358}
359
360
Thomas Wouters477c8d52006-05-27 19:21:47 +0000361static PyTypeObject _PyExc_BaseException = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000362 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +0000363 "BaseException", /*tp_name*/
Thomas Wouters477c8d52006-05-27 19:21:47 +0000364 sizeof(PyBaseExceptionObject), /*tp_basicsize*/
365 0, /*tp_itemsize*/
366 (destructor)BaseException_dealloc, /*tp_dealloc*/
367 0, /*tp_print*/
368 0, /*tp_getattr*/
369 0, /*tp_setattr*/
Mark Dickinsone94c6792009-02-02 20:36:42 +0000370 0, /* tp_reserved; */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000371 (reprfunc)BaseException_repr, /*tp_repr*/
372 0, /*tp_as_number*/
Brett Cannonba7bf492007-02-27 00:15:55 +0000373 0, /*tp_as_sequence*/
Thomas Wouters477c8d52006-05-27 19:21:47 +0000374 0, /*tp_as_mapping*/
375 0, /*tp_hash */
376 0, /*tp_call*/
377 (reprfunc)BaseException_str, /*tp_str*/
378 PyObject_GenericGetAttr, /*tp_getattro*/
379 PyObject_GenericSetAttr, /*tp_setattro*/
380 0, /*tp_as_buffer*/
Thomas Wouters27d517b2007-02-25 20:39:11 +0000381 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC |
382 Py_TPFLAGS_BASE_EXC_SUBCLASS, /*tp_flags*/
Thomas Wouters477c8d52006-05-27 19:21:47 +0000383 PyDoc_STR("Common base class for all exceptions"), /* tp_doc */
384 (traverseproc)BaseException_traverse, /* tp_traverse */
385 (inquiry)BaseException_clear, /* tp_clear */
386 0, /* tp_richcompare */
387 0, /* tp_weaklistoffset */
388 0, /* tp_iter */
389 0, /* tp_iternext */
390 BaseException_methods, /* tp_methods */
Georg Brandlab6f2f62009-03-31 04:16:10 +0000391 0, /* tp_members */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000392 BaseException_getset, /* tp_getset */
393 0, /* tp_base */
394 0, /* tp_dict */
395 0, /* tp_descr_get */
396 0, /* tp_descr_set */
397 offsetof(PyBaseExceptionObject, dict), /* tp_dictoffset */
398 (initproc)BaseException_init, /* tp_init */
399 0, /* tp_alloc */
400 BaseException_new, /* tp_new */
401};
402/* the CPython API expects exceptions to be (PyObject *) - both a hold-over
403from the previous implmentation and also allowing Python objects to be used
404in the API */
405PyObject *PyExc_BaseException = (PyObject *)&_PyExc_BaseException;
406
407/* note these macros omit the last semicolon so the macro invocation may
408 * include it and not look strange.
409 */
410#define SimpleExtendsException(EXCBASE, EXCNAME, EXCDOC) \
411static PyTypeObject _PyExc_ ## EXCNAME = { \
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000412 PyVarObject_HEAD_INIT(NULL, 0) \
Neal Norwitz2633c692007-02-26 22:22:47 +0000413 # EXCNAME, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000414 sizeof(PyBaseExceptionObject), \
415 0, (destructor)BaseException_dealloc, 0, 0, 0, 0, 0, 0, 0, \
416 0, 0, 0, 0, 0, 0, 0, \
417 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
418 PyDoc_STR(EXCDOC), (traverseproc)BaseException_traverse, \
419 (inquiry)BaseException_clear, 0, 0, 0, 0, 0, 0, 0, &_ ## EXCBASE, \
420 0, 0, 0, offsetof(PyBaseExceptionObject, dict), \
421 (initproc)BaseException_init, 0, BaseException_new,\
422}; \
423PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
424
425#define MiddlingExtendsException(EXCBASE, EXCNAME, EXCSTORE, EXCDOC) \
426static PyTypeObject _PyExc_ ## EXCNAME = { \
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000427 PyVarObject_HEAD_INIT(NULL, 0) \
Neal Norwitz2633c692007-02-26 22:22:47 +0000428 # EXCNAME, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000429 sizeof(Py ## EXCSTORE ## Object), \
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000430 0, (destructor)EXCSTORE ## _dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000431 0, 0, 0, 0, 0, \
432 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000433 PyDoc_STR(EXCDOC), (traverseproc)EXCSTORE ## _traverse, \
434 (inquiry)EXCSTORE ## _clear, 0, 0, 0, 0, 0, 0, 0, &_ ## EXCBASE, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000435 0, 0, 0, offsetof(Py ## EXCSTORE ## Object, dict), \
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000436 (initproc)EXCSTORE ## _init, 0, BaseException_new,\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000437}; \
438PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
439
440#define ComplexExtendsException(EXCBASE, EXCNAME, EXCSTORE, EXCDEALLOC, EXCMETHODS, EXCMEMBERS, EXCSTR, EXCDOC) \
441static PyTypeObject _PyExc_ ## EXCNAME = { \
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000442 PyVarObject_HEAD_INIT(NULL, 0) \
Neal Norwitz2633c692007-02-26 22:22:47 +0000443 # EXCNAME, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000444 sizeof(Py ## EXCSTORE ## Object), 0, \
445 (destructor)EXCSTORE ## _dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
446 (reprfunc)EXCSTR, 0, 0, 0, \
447 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
448 PyDoc_STR(EXCDOC), (traverseproc)EXCSTORE ## _traverse, \
449 (inquiry)EXCSTORE ## _clear, 0, 0, 0, 0, EXCMETHODS, \
450 EXCMEMBERS, 0, &_ ## EXCBASE, \
451 0, 0, 0, offsetof(Py ## EXCSTORE ## Object, dict), \
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000452 (initproc)EXCSTORE ## _init, 0, BaseException_new,\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000453}; \
454PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
455
456
457/*
458 * Exception extends BaseException
459 */
460SimpleExtendsException(PyExc_BaseException, Exception,
461 "Common base class for all non-exit exceptions.");
462
463
464/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000465 * TypeError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +0000466 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000467SimpleExtendsException(PyExc_Exception, TypeError,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000468 "Inappropriate argument type.");
469
470
471/*
472 * StopIteration extends Exception
473 */
474SimpleExtendsException(PyExc_Exception, StopIteration,
Georg Brandla18af4e2007-04-21 15:47:16 +0000475 "Signal the end from iterator.__next__().");
Thomas Wouters477c8d52006-05-27 19:21:47 +0000476
477
478/*
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000479 * GeneratorExit extends BaseException
Thomas Wouters477c8d52006-05-27 19:21:47 +0000480 */
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000481SimpleExtendsException(PyExc_BaseException, GeneratorExit,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000482 "Request that a generator exit.");
483
484
485/*
486 * SystemExit extends BaseException
487 */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000488
489static int
490SystemExit_init(PySystemExitObject *self, PyObject *args, PyObject *kwds)
491{
492 Py_ssize_t size = PyTuple_GET_SIZE(args);
493
494 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
495 return -1;
496
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000497 if (size == 0)
498 return 0;
499 Py_CLEAR(self->code);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000500 if (size == 1)
501 self->code = PyTuple_GET_ITEM(args, 0);
502 else if (size > 1)
503 self->code = args;
504 Py_INCREF(self->code);
505 return 0;
506}
507
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000508static int
Thomas Wouters477c8d52006-05-27 19:21:47 +0000509SystemExit_clear(PySystemExitObject *self)
510{
511 Py_CLEAR(self->code);
512 return BaseException_clear((PyBaseExceptionObject *)self);
513}
514
515static void
516SystemExit_dealloc(PySystemExitObject *self)
517{
Thomas Wouters89f507f2006-12-13 04:49:30 +0000518 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000519 SystemExit_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +0000520 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000521}
522
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000523static int
Thomas Wouters477c8d52006-05-27 19:21:47 +0000524SystemExit_traverse(PySystemExitObject *self, visitproc visit, void *arg)
525{
526 Py_VISIT(self->code);
527 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
528}
529
530static PyMemberDef SystemExit_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +0000531 {"code", T_OBJECT, offsetof(PySystemExitObject, code), 0,
532 PyDoc_STR("exception code")},
533 {NULL} /* Sentinel */
534};
535
536ComplexExtendsException(PyExc_BaseException, SystemExit, SystemExit,
537 SystemExit_dealloc, 0, SystemExit_members, 0,
538 "Request to exit from the interpreter.");
539
540/*
541 * KeyboardInterrupt extends BaseException
542 */
543SimpleExtendsException(PyExc_BaseException, KeyboardInterrupt,
544 "Program interrupted by user.");
545
546
547/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000548 * ImportError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +0000549 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000550SimpleExtendsException(PyExc_Exception, ImportError,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000551 "Import can't find module, or can't find name in module.");
552
553
554/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000555 * EnvironmentError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +0000556 */
557
Thomas Wouters477c8d52006-05-27 19:21:47 +0000558/* Where a function has a single filename, such as open() or some
559 * of the os module functions, PyErr_SetFromErrnoWithFilename() is
560 * called, giving a third argument which is the filename. But, so
561 * that old code using in-place unpacking doesn't break, e.g.:
562 *
563 * except IOError, (errno, strerror):
564 *
565 * we hack args so that it only contains two items. This also
566 * means we need our own __str__() which prints out the filename
567 * when it was supplied.
568 */
569static int
570EnvironmentError_init(PyEnvironmentErrorObject *self, PyObject *args,
571 PyObject *kwds)
572{
573 PyObject *myerrno = NULL, *strerror = NULL, *filename = NULL;
574 PyObject *subslice = NULL;
575
576 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
577 return -1;
578
Thomas Wouters89f507f2006-12-13 04:49:30 +0000579 if (PyTuple_GET_SIZE(args) <= 1 || PyTuple_GET_SIZE(args) > 3) {
Thomas Wouters477c8d52006-05-27 19:21:47 +0000580 return 0;
581 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000582
583 if (!PyArg_UnpackTuple(args, "EnvironmentError", 2, 3,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000584 &myerrno, &strerror, &filename)) {
585 return -1;
586 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000587 Py_CLEAR(self->myerrno); /* replacing */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000588 self->myerrno = myerrno;
589 Py_INCREF(self->myerrno);
590
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000591 Py_CLEAR(self->strerror); /* replacing */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000592 self->strerror = strerror;
593 Py_INCREF(self->strerror);
594
595 /* self->filename will remain Py_None otherwise */
596 if (filename != NULL) {
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000597 Py_CLEAR(self->filename); /* replacing */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000598 self->filename = filename;
599 Py_INCREF(self->filename);
600
601 subslice = PyTuple_GetSlice(args, 0, 2);
602 if (!subslice)
603 return -1;
604
605 Py_DECREF(self->args); /* replacing args */
606 self->args = subslice;
607 }
608 return 0;
609}
610
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000611static int
Thomas Wouters477c8d52006-05-27 19:21:47 +0000612EnvironmentError_clear(PyEnvironmentErrorObject *self)
613{
614 Py_CLEAR(self->myerrno);
615 Py_CLEAR(self->strerror);
616 Py_CLEAR(self->filename);
617 return BaseException_clear((PyBaseExceptionObject *)self);
618}
619
620static void
621EnvironmentError_dealloc(PyEnvironmentErrorObject *self)
622{
Thomas Wouters89f507f2006-12-13 04:49:30 +0000623 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000624 EnvironmentError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +0000625 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000626}
627
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000628static int
Thomas Wouters477c8d52006-05-27 19:21:47 +0000629EnvironmentError_traverse(PyEnvironmentErrorObject *self, visitproc visit,
630 void *arg)
631{
632 Py_VISIT(self->myerrno);
633 Py_VISIT(self->strerror);
634 Py_VISIT(self->filename);
635 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
636}
637
638static PyObject *
639EnvironmentError_str(PyEnvironmentErrorObject *self)
640{
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +0000641 if (self->filename)
642 return PyUnicode_FromFormat("[Errno %S] %S: %R",
643 self->myerrno ? self->myerrno: Py_None,
644 self->strerror ? self->strerror: Py_None,
645 self->filename);
646 else if (self->myerrno && self->strerror)
647 return PyUnicode_FromFormat("[Errno %S] %S",
648 self->myerrno ? self->myerrno: Py_None,
649 self->strerror ? self->strerror: Py_None);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000650 else
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +0000651 return BaseException_str((PyBaseExceptionObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000652}
653
654static PyMemberDef EnvironmentError_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +0000655 {"errno", T_OBJECT, offsetof(PyEnvironmentErrorObject, myerrno), 0,
656 PyDoc_STR("exception errno")},
657 {"strerror", T_OBJECT, offsetof(PyEnvironmentErrorObject, strerror), 0,
658 PyDoc_STR("exception strerror")},
659 {"filename", T_OBJECT, offsetof(PyEnvironmentErrorObject, filename), 0,
660 PyDoc_STR("exception filename")},
661 {NULL} /* Sentinel */
662};
663
664
665static PyObject *
666EnvironmentError_reduce(PyEnvironmentErrorObject *self)
667{
668 PyObject *args = self->args;
669 PyObject *res = NULL, *tmp;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000670
Thomas Wouters477c8d52006-05-27 19:21:47 +0000671 /* self->args is only the first two real arguments if there was a
672 * file name given to EnvironmentError. */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000673 if (PyTuple_GET_SIZE(args) == 2 && self->filename) {
Thomas Wouters477c8d52006-05-27 19:21:47 +0000674 args = PyTuple_New(3);
675 if (!args) return NULL;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000676
677 tmp = PyTuple_GET_ITEM(self->args, 0);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000678 Py_INCREF(tmp);
679 PyTuple_SET_ITEM(args, 0, tmp);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000680
681 tmp = PyTuple_GET_ITEM(self->args, 1);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000682 Py_INCREF(tmp);
683 PyTuple_SET_ITEM(args, 1, tmp);
684
685 Py_INCREF(self->filename);
686 PyTuple_SET_ITEM(args, 2, self->filename);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000687 } else
Thomas Wouters477c8d52006-05-27 19:21:47 +0000688 Py_INCREF(args);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000689
690 if (self->dict)
Christian Heimes90aa7642007-12-19 02:45:37 +0000691 res = PyTuple_Pack(3, Py_TYPE(self), args, self->dict);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000692 else
Christian Heimes90aa7642007-12-19 02:45:37 +0000693 res = PyTuple_Pack(2, Py_TYPE(self), args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000694 Py_DECREF(args);
695 return res;
696}
697
698
699static PyMethodDef EnvironmentError_methods[] = {
700 {"__reduce__", (PyCFunction)EnvironmentError_reduce, METH_NOARGS},
701 {NULL}
702};
703
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000704ComplexExtendsException(PyExc_Exception, EnvironmentError,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000705 EnvironmentError, EnvironmentError_dealloc,
706 EnvironmentError_methods, EnvironmentError_members,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000707 EnvironmentError_str,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000708 "Base class for I/O related errors.");
709
710
711/*
712 * IOError extends EnvironmentError
713 */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000714MiddlingExtendsException(PyExc_EnvironmentError, IOError,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000715 EnvironmentError, "I/O operation failed.");
716
717
718/*
719 * OSError extends EnvironmentError
720 */
721MiddlingExtendsException(PyExc_EnvironmentError, OSError,
722 EnvironmentError, "OS system call failed.");
723
724
725/*
726 * WindowsError extends OSError
727 */
728#ifdef MS_WINDOWS
729#include "errmap.h"
730
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000731static int
Thomas Wouters477c8d52006-05-27 19:21:47 +0000732WindowsError_clear(PyWindowsErrorObject *self)
733{
734 Py_CLEAR(self->myerrno);
735 Py_CLEAR(self->strerror);
736 Py_CLEAR(self->filename);
737 Py_CLEAR(self->winerror);
738 return BaseException_clear((PyBaseExceptionObject *)self);
739}
740
741static void
742WindowsError_dealloc(PyWindowsErrorObject *self)
743{
Thomas Wouters89f507f2006-12-13 04:49:30 +0000744 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000745 WindowsError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +0000746 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000747}
748
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000749static int
Thomas Wouters477c8d52006-05-27 19:21:47 +0000750WindowsError_traverse(PyWindowsErrorObject *self, visitproc visit, void *arg)
751{
752 Py_VISIT(self->myerrno);
753 Py_VISIT(self->strerror);
754 Py_VISIT(self->filename);
755 Py_VISIT(self->winerror);
756 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
757}
758
Thomas Wouters477c8d52006-05-27 19:21:47 +0000759static int
760WindowsError_init(PyWindowsErrorObject *self, PyObject *args, PyObject *kwds)
761{
762 PyObject *o_errcode = NULL;
763 long errcode;
764 long posix_errno;
765
766 if (EnvironmentError_init((PyEnvironmentErrorObject *)self, args, kwds)
767 == -1)
768 return -1;
769
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000770 if (self->myerrno == NULL)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000771 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000772
773 /* Set errno to the POSIX errno, and winerror to the Win32
774 error code. */
Christian Heimes217cfd12007-12-02 14:31:20 +0000775 errcode = PyLong_AsLong(self->myerrno);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000776 if (errcode == -1 && PyErr_Occurred())
777 return -1;
778 posix_errno = winerror_to_errno(errcode);
779
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000780 Py_CLEAR(self->winerror);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000781 self->winerror = self->myerrno;
782
Christian Heimes217cfd12007-12-02 14:31:20 +0000783 o_errcode = PyLong_FromLong(posix_errno);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000784 if (!o_errcode)
785 return -1;
786
787 self->myerrno = o_errcode;
788
789 return 0;
790}
791
792
793static PyObject *
794WindowsError_str(PyWindowsErrorObject *self)
795{
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +0000796 if (self->filename)
797 return PyUnicode_FromFormat("[Error %S] %S: %R",
798 self->winerror ? self->winerror: Py_None,
799 self->strerror ? self->strerror: Py_None,
800 self->filename);
801 else if (self->winerror && self->strerror)
802 return PyUnicode_FromFormat("[Error %S] %S",
803 self->winerror ? self->winerror: Py_None,
804 self->strerror ? self->strerror: Py_None);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000805 else
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +0000806 return EnvironmentError_str((PyEnvironmentErrorObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000807}
808
809static PyMemberDef WindowsError_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +0000810 {"errno", T_OBJECT, offsetof(PyWindowsErrorObject, myerrno), 0,
811 PyDoc_STR("POSIX exception code")},
812 {"strerror", T_OBJECT, offsetof(PyWindowsErrorObject, strerror), 0,
813 PyDoc_STR("exception strerror")},
814 {"filename", T_OBJECT, offsetof(PyWindowsErrorObject, filename), 0,
815 PyDoc_STR("exception filename")},
816 {"winerror", T_OBJECT, offsetof(PyWindowsErrorObject, winerror), 0,
817 PyDoc_STR("Win32 exception code")},
818 {NULL} /* Sentinel */
819};
820
821ComplexExtendsException(PyExc_OSError, WindowsError, WindowsError,
822 WindowsError_dealloc, 0, WindowsError_members,
823 WindowsError_str, "MS-Windows OS system call failed.");
824
825#endif /* MS_WINDOWS */
826
827
828/*
829 * VMSError extends OSError (I think)
830 */
831#ifdef __VMS
832MiddlingExtendsException(PyExc_OSError, VMSError, EnvironmentError,
833 "OpenVMS OS system call failed.");
834#endif
835
836
837/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000838 * EOFError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +0000839 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000840SimpleExtendsException(PyExc_Exception, EOFError,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000841 "Read beyond end of file.");
842
843
844/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000845 * RuntimeError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +0000846 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000847SimpleExtendsException(PyExc_Exception, RuntimeError,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000848 "Unspecified run-time error.");
849
850
851/*
852 * NotImplementedError extends RuntimeError
853 */
854SimpleExtendsException(PyExc_RuntimeError, NotImplementedError,
855 "Method or function hasn't been implemented yet.");
856
857/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000858 * NameError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +0000859 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000860SimpleExtendsException(PyExc_Exception, NameError,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000861 "Name not found globally.");
862
863/*
864 * UnboundLocalError extends NameError
865 */
866SimpleExtendsException(PyExc_NameError, UnboundLocalError,
867 "Local name referenced but not bound to a value.");
868
869/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000870 * AttributeError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +0000871 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000872SimpleExtendsException(PyExc_Exception, AttributeError,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000873 "Attribute not found.");
874
875
876/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000877 * SyntaxError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +0000878 */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000879
880static int
881SyntaxError_init(PySyntaxErrorObject *self, PyObject *args, PyObject *kwds)
882{
883 PyObject *info = NULL;
884 Py_ssize_t lenargs = PyTuple_GET_SIZE(args);
885
886 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
887 return -1;
888
889 if (lenargs >= 1) {
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000890 Py_CLEAR(self->msg);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000891 self->msg = PyTuple_GET_ITEM(args, 0);
892 Py_INCREF(self->msg);
893 }
894 if (lenargs == 2) {
895 info = PyTuple_GET_ITEM(args, 1);
896 info = PySequence_Tuple(info);
897 if (!info) return -1;
898
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000899 if (PyTuple_GET_SIZE(info) != 4) {
900 /* not a very good error message, but it's what Python 2.4 gives */
901 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
902 Py_DECREF(info);
903 return -1;
904 }
905
906 Py_CLEAR(self->filename);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000907 self->filename = PyTuple_GET_ITEM(info, 0);
908 Py_INCREF(self->filename);
909
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000910 Py_CLEAR(self->lineno);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000911 self->lineno = PyTuple_GET_ITEM(info, 1);
912 Py_INCREF(self->lineno);
913
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000914 Py_CLEAR(self->offset);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000915 self->offset = PyTuple_GET_ITEM(info, 2);
916 Py_INCREF(self->offset);
917
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000918 Py_CLEAR(self->text);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000919 self->text = PyTuple_GET_ITEM(info, 3);
920 Py_INCREF(self->text);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000921
922 Py_DECREF(info);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000923 }
924 return 0;
925}
926
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000927static int
Thomas Wouters477c8d52006-05-27 19:21:47 +0000928SyntaxError_clear(PySyntaxErrorObject *self)
929{
930 Py_CLEAR(self->msg);
931 Py_CLEAR(self->filename);
932 Py_CLEAR(self->lineno);
933 Py_CLEAR(self->offset);
934 Py_CLEAR(self->text);
935 Py_CLEAR(self->print_file_and_line);
936 return BaseException_clear((PyBaseExceptionObject *)self);
937}
938
939static void
940SyntaxError_dealloc(PySyntaxErrorObject *self)
941{
Thomas Wouters89f507f2006-12-13 04:49:30 +0000942 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000943 SyntaxError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +0000944 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000945}
946
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000947static int
Thomas Wouters477c8d52006-05-27 19:21:47 +0000948SyntaxError_traverse(PySyntaxErrorObject *self, visitproc visit, void *arg)
949{
950 Py_VISIT(self->msg);
951 Py_VISIT(self->filename);
952 Py_VISIT(self->lineno);
953 Py_VISIT(self->offset);
954 Py_VISIT(self->text);
955 Py_VISIT(self->print_file_and_line);
956 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
957}
958
959/* This is called "my_basename" instead of just "basename" to avoid name
960 conflicts with glibc; basename is already prototyped if _GNU_SOURCE is
961 defined, and Python does define that. */
962static char *
963my_basename(char *name)
964{
965 char *cp = name;
966 char *result = name;
967
968 if (name == NULL)
969 return "???";
970 while (*cp != '\0') {
971 if (*cp == SEP)
972 result = cp + 1;
973 ++cp;
974 }
975 return result;
976}
977
978
979static PyObject *
980SyntaxError_str(PySyntaxErrorObject *self)
981{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000982 int have_lineno = 0;
Martin v. Löwis10a60b32007-07-18 02:28:27 +0000983 char *filename = 0;
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +0000984 /* Below, we always ignore overflow errors, just printing -1.
985 Still, we cannot allow an OverflowError to be raised, so
986 we need to call PyLong_AsLongAndOverflow. */
987 int overflow;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000988
989 /* XXX -- do all the additional formatting with filename and
990 lineno here */
991
Neal Norwitzed2b7392007-08-26 04:51:10 +0000992 if (self->filename && PyUnicode_Check(self->filename)) {
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +0000993 filename = _PyUnicode_AsString(self->filename);
Martin v. Löwis10a60b32007-07-18 02:28:27 +0000994 }
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +0000995 have_lineno = (self->lineno != NULL) && PyLong_CheckExact(self->lineno);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000996
Martin v. Löwis10a60b32007-07-18 02:28:27 +0000997 if (!filename && !have_lineno)
Thomas Heller519a0422007-11-15 20:48:54 +0000998 return PyObject_Str(self->msg ? self->msg : Py_None);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000999
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001000 if (filename && have_lineno)
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001001 return PyUnicode_FromFormat("%S (%s, line %ld)",
1002 self->msg ? self->msg : Py_None,
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001003 my_basename(filename),
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001004 PyLong_AsLongAndOverflow(self->lineno, &overflow));
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001005 else if (filename)
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001006 return PyUnicode_FromFormat("%S (%s)",
1007 self->msg ? self->msg : Py_None,
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001008 my_basename(filename));
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001009 else /* only have_lineno */
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001010 return PyUnicode_FromFormat("%S (line %ld)",
1011 self->msg ? self->msg : Py_None,
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001012 PyLong_AsLongAndOverflow(self->lineno, &overflow));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001013}
1014
1015static PyMemberDef SyntaxError_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +00001016 {"msg", T_OBJECT, offsetof(PySyntaxErrorObject, msg), 0,
1017 PyDoc_STR("exception msg")},
1018 {"filename", T_OBJECT, offsetof(PySyntaxErrorObject, filename), 0,
1019 PyDoc_STR("exception filename")},
1020 {"lineno", T_OBJECT, offsetof(PySyntaxErrorObject, lineno), 0,
1021 PyDoc_STR("exception lineno")},
1022 {"offset", T_OBJECT, offsetof(PySyntaxErrorObject, offset), 0,
1023 PyDoc_STR("exception offset")},
1024 {"text", T_OBJECT, offsetof(PySyntaxErrorObject, text), 0,
1025 PyDoc_STR("exception text")},
1026 {"print_file_and_line", T_OBJECT,
1027 offsetof(PySyntaxErrorObject, print_file_and_line), 0,
1028 PyDoc_STR("exception print_file_and_line")},
1029 {NULL} /* Sentinel */
1030};
1031
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001032ComplexExtendsException(PyExc_Exception, SyntaxError, SyntaxError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001033 SyntaxError_dealloc, 0, SyntaxError_members,
1034 SyntaxError_str, "Invalid syntax.");
1035
1036
1037/*
1038 * IndentationError extends SyntaxError
1039 */
1040MiddlingExtendsException(PyExc_SyntaxError, IndentationError, SyntaxError,
1041 "Improper indentation.");
1042
1043
1044/*
1045 * TabError extends IndentationError
1046 */
1047MiddlingExtendsException(PyExc_IndentationError, TabError, SyntaxError,
1048 "Improper mixture of spaces and tabs.");
1049
1050
1051/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001052 * LookupError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001053 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001054SimpleExtendsException(PyExc_Exception, LookupError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001055 "Base class for lookup errors.");
1056
1057
1058/*
1059 * IndexError extends LookupError
1060 */
1061SimpleExtendsException(PyExc_LookupError, IndexError,
1062 "Sequence index out of range.");
1063
1064
1065/*
1066 * KeyError extends LookupError
1067 */
1068static PyObject *
1069KeyError_str(PyBaseExceptionObject *self)
1070{
1071 /* If args is a tuple of exactly one item, apply repr to args[0].
1072 This is done so that e.g. the exception raised by {}[''] prints
1073 KeyError: ''
1074 rather than the confusing
1075 KeyError
1076 alone. The downside is that if KeyError is raised with an explanatory
1077 string, that string will be displayed in quotes. Too bad.
1078 If args is anything else, use the default BaseException__str__().
1079 */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001080 if (PyTuple_GET_SIZE(self->args) == 1) {
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001081 return PyObject_Repr(PyTuple_GET_ITEM(self->args, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001082 }
1083 return BaseException_str(self);
1084}
1085
1086ComplexExtendsException(PyExc_LookupError, KeyError, BaseException,
1087 0, 0, 0, KeyError_str, "Mapping key not found.");
1088
1089
1090/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001091 * ValueError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001092 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001093SimpleExtendsException(PyExc_Exception, ValueError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001094 "Inappropriate argument value (of correct type).");
1095
1096/*
1097 * UnicodeError extends ValueError
1098 */
1099
1100SimpleExtendsException(PyExc_ValueError, UnicodeError,
1101 "Unicode related error.");
1102
Thomas Wouters477c8d52006-05-27 19:21:47 +00001103static PyObject *
Guido van Rossum98297ee2007-11-06 21:34:58 +00001104get_string(PyObject *attr, const char *name)
Walter Dörwald612344f2007-05-04 19:28:21 +00001105{
1106 if (!attr) {
1107 PyErr_Format(PyExc_TypeError, "%.200s attribute not set", name);
1108 return NULL;
1109 }
1110
Christian Heimes72b710a2008-05-26 13:28:38 +00001111 if (!PyBytes_Check(attr)) {
Walter Dörwald612344f2007-05-04 19:28:21 +00001112 PyErr_Format(PyExc_TypeError, "%.200s attribute must be bytes", name);
1113 return NULL;
1114 }
1115 Py_INCREF(attr);
1116 return attr;
1117}
1118
1119static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00001120get_unicode(PyObject *attr, const char *name)
1121{
1122 if (!attr) {
1123 PyErr_Format(PyExc_TypeError, "%.200s attribute not set", name);
1124 return NULL;
1125 }
1126
1127 if (!PyUnicode_Check(attr)) {
1128 PyErr_Format(PyExc_TypeError,
1129 "%.200s attribute must be unicode", name);
1130 return NULL;
1131 }
1132 Py_INCREF(attr);
1133 return attr;
1134}
1135
Walter Dörwaldd2034312007-05-18 16:29:38 +00001136static int
1137set_unicodefromstring(PyObject **attr, const char *value)
1138{
1139 PyObject *obj = PyUnicode_FromString(value);
1140 if (!obj)
1141 return -1;
1142 Py_CLEAR(*attr);
1143 *attr = obj;
1144 return 0;
1145}
1146
Thomas Wouters477c8d52006-05-27 19:21:47 +00001147PyObject *
1148PyUnicodeEncodeError_GetEncoding(PyObject *exc)
1149{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001150 return get_unicode(((PyUnicodeErrorObject *)exc)->encoding, "encoding");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001151}
1152
1153PyObject *
1154PyUnicodeDecodeError_GetEncoding(PyObject *exc)
1155{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001156 return get_unicode(((PyUnicodeErrorObject *)exc)->encoding, "encoding");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001157}
1158
1159PyObject *
1160PyUnicodeEncodeError_GetObject(PyObject *exc)
1161{
1162 return get_unicode(((PyUnicodeErrorObject *)exc)->object, "object");
1163}
1164
1165PyObject *
1166PyUnicodeDecodeError_GetObject(PyObject *exc)
1167{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001168 return get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001169}
1170
1171PyObject *
1172PyUnicodeTranslateError_GetObject(PyObject *exc)
1173{
1174 return get_unicode(((PyUnicodeErrorObject *)exc)->object, "object");
1175}
1176
1177int
1178PyUnicodeEncodeError_GetStart(PyObject *exc, Py_ssize_t *start)
1179{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001180 Py_ssize_t size;
1181 PyObject *obj = get_unicode(((PyUnicodeErrorObject *)exc)->object,
1182 "object");
1183 if (!obj)
1184 return -1;
1185 *start = ((PyUnicodeErrorObject *)exc)->start;
1186 size = PyUnicode_GET_SIZE(obj);
1187 if (*start<0)
1188 *start = 0; /*XXX check for values <0*/
1189 if (*start>=size)
1190 *start = size-1;
1191 Py_DECREF(obj);
1192 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001193}
1194
1195
1196int
1197PyUnicodeDecodeError_GetStart(PyObject *exc, Py_ssize_t *start)
1198{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001199 Py_ssize_t size;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001200 PyObject *obj = get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001201 if (!obj)
1202 return -1;
Christian Heimes72b710a2008-05-26 13:28:38 +00001203 size = PyBytes_GET_SIZE(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001204 *start = ((PyUnicodeErrorObject *)exc)->start;
1205 if (*start<0)
1206 *start = 0;
1207 if (*start>=size)
1208 *start = size-1;
1209 Py_DECREF(obj);
1210 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001211}
1212
1213
1214int
1215PyUnicodeTranslateError_GetStart(PyObject *exc, Py_ssize_t *start)
1216{
1217 return PyUnicodeEncodeError_GetStart(exc, start);
1218}
1219
1220
1221int
1222PyUnicodeEncodeError_SetStart(PyObject *exc, Py_ssize_t start)
1223{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001224 ((PyUnicodeErrorObject *)exc)->start = start;
1225 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001226}
1227
1228
1229int
1230PyUnicodeDecodeError_SetStart(PyObject *exc, Py_ssize_t start)
1231{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001232 ((PyUnicodeErrorObject *)exc)->start = start;
1233 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001234}
1235
1236
1237int
1238PyUnicodeTranslateError_SetStart(PyObject *exc, Py_ssize_t start)
1239{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001240 ((PyUnicodeErrorObject *)exc)->start = start;
1241 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001242}
1243
1244
1245int
1246PyUnicodeEncodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
1247{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001248 Py_ssize_t size;
1249 PyObject *obj = get_unicode(((PyUnicodeErrorObject *)exc)->object,
1250 "object");
1251 if (!obj)
1252 return -1;
1253 *end = ((PyUnicodeErrorObject *)exc)->end;
1254 size = PyUnicode_GET_SIZE(obj);
1255 if (*end<1)
1256 *end = 1;
1257 if (*end>size)
1258 *end = size;
1259 Py_DECREF(obj);
1260 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001261}
1262
1263
1264int
1265PyUnicodeDecodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
1266{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001267 Py_ssize_t size;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001268 PyObject *obj = get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001269 if (!obj)
1270 return -1;
Christian Heimes72b710a2008-05-26 13:28:38 +00001271 size = PyBytes_GET_SIZE(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001272 *end = ((PyUnicodeErrorObject *)exc)->end;
1273 if (*end<1)
1274 *end = 1;
1275 if (*end>size)
1276 *end = size;
1277 Py_DECREF(obj);
1278 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001279}
1280
1281
1282int
1283PyUnicodeTranslateError_GetEnd(PyObject *exc, Py_ssize_t *start)
1284{
1285 return PyUnicodeEncodeError_GetEnd(exc, start);
1286}
1287
1288
1289int
1290PyUnicodeEncodeError_SetEnd(PyObject *exc, Py_ssize_t end)
1291{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001292 ((PyUnicodeErrorObject *)exc)->end = end;
1293 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001294}
1295
1296
1297int
1298PyUnicodeDecodeError_SetEnd(PyObject *exc, Py_ssize_t end)
1299{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001300 ((PyUnicodeErrorObject *)exc)->end = end;
1301 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001302}
1303
1304
1305int
1306PyUnicodeTranslateError_SetEnd(PyObject *exc, Py_ssize_t end)
1307{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001308 ((PyUnicodeErrorObject *)exc)->end = end;
1309 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001310}
1311
1312PyObject *
1313PyUnicodeEncodeError_GetReason(PyObject *exc)
1314{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001315 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001316}
1317
1318
1319PyObject *
1320PyUnicodeDecodeError_GetReason(PyObject *exc)
1321{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001322 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001323}
1324
1325
1326PyObject *
1327PyUnicodeTranslateError_GetReason(PyObject *exc)
1328{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001329 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001330}
1331
1332
1333int
1334PyUnicodeEncodeError_SetReason(PyObject *exc, const char *reason)
1335{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001336 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1337 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001338}
1339
1340
1341int
1342PyUnicodeDecodeError_SetReason(PyObject *exc, const char *reason)
1343{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001344 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1345 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001346}
1347
1348
1349int
1350PyUnicodeTranslateError_SetReason(PyObject *exc, const char *reason)
1351{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001352 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1353 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001354}
1355
1356
Thomas Wouters477c8d52006-05-27 19:21:47 +00001357static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001358UnicodeError_clear(PyUnicodeErrorObject *self)
1359{
1360 Py_CLEAR(self->encoding);
1361 Py_CLEAR(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001362 Py_CLEAR(self->reason);
1363 return BaseException_clear((PyBaseExceptionObject *)self);
1364}
1365
1366static void
1367UnicodeError_dealloc(PyUnicodeErrorObject *self)
1368{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001369 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001370 UnicodeError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +00001371 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001372}
1373
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001374static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001375UnicodeError_traverse(PyUnicodeErrorObject *self, visitproc visit, void *arg)
1376{
1377 Py_VISIT(self->encoding);
1378 Py_VISIT(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001379 Py_VISIT(self->reason);
1380 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1381}
1382
1383static PyMemberDef UnicodeError_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +00001384 {"encoding", T_OBJECT, offsetof(PyUnicodeErrorObject, encoding), 0,
1385 PyDoc_STR("exception encoding")},
1386 {"object", T_OBJECT, offsetof(PyUnicodeErrorObject, object), 0,
1387 PyDoc_STR("exception object")},
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001388 {"start", T_PYSSIZET, offsetof(PyUnicodeErrorObject, start), 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001389 PyDoc_STR("exception start")},
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001390 {"end", T_PYSSIZET, offsetof(PyUnicodeErrorObject, end), 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001391 PyDoc_STR("exception end")},
1392 {"reason", T_OBJECT, offsetof(PyUnicodeErrorObject, reason), 0,
1393 PyDoc_STR("exception reason")},
1394 {NULL} /* Sentinel */
1395};
1396
1397
1398/*
1399 * UnicodeEncodeError extends UnicodeError
1400 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001401
1402static int
1403UnicodeEncodeError_init(PyObject *self, PyObject *args, PyObject *kwds)
1404{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001405 PyUnicodeErrorObject *err;
1406
Thomas Wouters477c8d52006-05-27 19:21:47 +00001407 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1408 return -1;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001409
1410 err = (PyUnicodeErrorObject *)self;
1411
1412 Py_CLEAR(err->encoding);
1413 Py_CLEAR(err->object);
1414 Py_CLEAR(err->reason);
1415
1416 if (!PyArg_ParseTuple(args, "O!O!nnO!",
1417 &PyUnicode_Type, &err->encoding,
1418 &PyUnicode_Type, &err->object,
1419 &err->start,
1420 &err->end,
1421 &PyUnicode_Type, &err->reason)) {
1422 err->encoding = err->object = err->reason = NULL;
1423 return -1;
1424 }
1425
1426 Py_INCREF(err->encoding);
1427 Py_INCREF(err->object);
1428 Py_INCREF(err->reason);
1429
1430 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001431}
1432
1433static PyObject *
1434UnicodeEncodeError_str(PyObject *self)
1435{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001436 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00001437 PyObject *result = NULL;
1438 PyObject *reason_str = NULL;
1439 PyObject *encoding_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001440
Eric Smith0facd772010-02-24 15:42:29 +00001441 /* Get reason and encoding as strings, which they might not be if
1442 they've been modified after we were contructed. */
1443 reason_str = PyObject_Str(uself->reason);
1444 if (reason_str == NULL)
1445 goto done;
1446 encoding_str = PyObject_Str(uself->encoding);
1447 if (encoding_str == NULL)
1448 goto done;
1449
1450 if (uself->start < PyUnicode_GET_SIZE(uself->object) && uself->end == uself->start+1) {
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001451 int badchar = (int)PyUnicode_AS_UNICODE(uself->object)[uself->start];
Walter Dörwald787b03b2007-06-05 13:29:29 +00001452 const char *fmt;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001453 if (badchar <= 0xff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00001454 fmt = "'%U' codec can't encode character '\\x%02x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001455 else if (badchar <= 0xffff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00001456 fmt = "'%U' codec can't encode character '\\u%04x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001457 else
Walter Dörwald32a4c712007-06-20 09:25:34 +00001458 fmt = "'%U' codec can't encode character '\\U%08x' in position %zd: %U";
Eric Smith0facd772010-02-24 15:42:29 +00001459 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00001460 fmt,
Eric Smith0facd772010-02-24 15:42:29 +00001461 encoding_str,
Walter Dörwald787b03b2007-06-05 13:29:29 +00001462 badchar,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001463 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00001464 reason_str);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001465 }
Eric Smith0facd772010-02-24 15:42:29 +00001466 else {
1467 result = PyUnicode_FromFormat(
1468 "'%U' codec can't encode characters in position %zd-%zd: %U",
1469 encoding_str,
1470 uself->start,
1471 uself->end-1,
1472 reason_str);
1473 }
1474done:
1475 Py_XDECREF(reason_str);
1476 Py_XDECREF(encoding_str);
1477 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001478}
1479
1480static PyTypeObject _PyExc_UnicodeEncodeError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001481 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00001482 "UnicodeEncodeError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00001483 sizeof(PyUnicodeErrorObject), 0,
1484 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1485 (reprfunc)UnicodeEncodeError_str, 0, 0, 0,
1486 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001487 PyDoc_STR("Unicode encoding error."), (traverseproc)UnicodeError_traverse,
1488 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001489 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001490 (initproc)UnicodeEncodeError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001491};
1492PyObject *PyExc_UnicodeEncodeError = (PyObject *)&_PyExc_UnicodeEncodeError;
1493
1494PyObject *
1495PyUnicodeEncodeError_Create(
1496 const char *encoding, const Py_UNICODE *object, Py_ssize_t length,
1497 Py_ssize_t start, Py_ssize_t end, const char *reason)
1498{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001499 return PyObject_CallFunction(PyExc_UnicodeEncodeError, "Uu#nnU",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001500 encoding, object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001501}
1502
1503
1504/*
1505 * UnicodeDecodeError extends UnicodeError
1506 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001507
1508static int
1509UnicodeDecodeError_init(PyObject *self, PyObject *args, PyObject *kwds)
1510{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001511 PyUnicodeErrorObject *ude;
1512 const char *data;
1513 Py_ssize_t size;
1514
Thomas Wouters477c8d52006-05-27 19:21:47 +00001515 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1516 return -1;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001517
1518 ude = (PyUnicodeErrorObject *)self;
1519
1520 Py_CLEAR(ude->encoding);
1521 Py_CLEAR(ude->object);
1522 Py_CLEAR(ude->reason);
1523
1524 if (!PyArg_ParseTuple(args, "O!OnnO!",
1525 &PyUnicode_Type, &ude->encoding,
1526 &ude->object,
1527 &ude->start,
1528 &ude->end,
1529 &PyUnicode_Type, &ude->reason)) {
1530 ude->encoding = ude->object = ude->reason = NULL;
1531 return -1;
1532 }
1533
Christian Heimes72b710a2008-05-26 13:28:38 +00001534 if (!PyBytes_Check(ude->object)) {
Guido van Rossum98297ee2007-11-06 21:34:58 +00001535 if (PyObject_AsReadBuffer(ude->object, (const void **)&data, &size)) {
1536 ude->encoding = ude->object = ude->reason = NULL;
1537 return -1;
1538 }
Christian Heimes72b710a2008-05-26 13:28:38 +00001539 ude->object = PyBytes_FromStringAndSize(data, size);
Guido van Rossum98297ee2007-11-06 21:34:58 +00001540 }
1541 else {
1542 Py_INCREF(ude->object);
1543 }
1544
1545 Py_INCREF(ude->encoding);
1546 Py_INCREF(ude->reason);
1547
1548 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001549}
1550
1551static PyObject *
1552UnicodeDecodeError_str(PyObject *self)
1553{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001554 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00001555 PyObject *result = NULL;
1556 PyObject *reason_str = NULL;
1557 PyObject *encoding_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001558
Eric Smith0facd772010-02-24 15:42:29 +00001559 /* Get reason and encoding as strings, which they might not be if
1560 they've been modified after we were contructed. */
1561 reason_str = PyObject_Str(uself->reason);
1562 if (reason_str == NULL)
1563 goto done;
1564 encoding_str = PyObject_Str(uself->encoding);
1565 if (encoding_str == NULL)
1566 goto done;
1567
1568 if (uself->start < PyBytes_GET_SIZE(uself->object) && uself->end == uself->start+1) {
Christian Heimes72b710a2008-05-26 13:28:38 +00001569 int byte = (int)(PyBytes_AS_STRING(((PyUnicodeErrorObject *)self)->object)[uself->start]&0xff);
Eric Smith0facd772010-02-24 15:42:29 +00001570 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00001571 "'%U' codec can't decode byte 0x%02x in position %zd: %U",
Eric Smith0facd772010-02-24 15:42:29 +00001572 encoding_str,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001573 byte,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001574 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00001575 reason_str);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001576 }
Eric Smith0facd772010-02-24 15:42:29 +00001577 else {
1578 result = PyUnicode_FromFormat(
1579 "'%U' codec can't decode bytes in position %zd-%zd: %U",
1580 encoding_str,
1581 uself->start,
1582 uself->end-1,
1583 reason_str
1584 );
1585 }
1586done:
1587 Py_XDECREF(reason_str);
1588 Py_XDECREF(encoding_str);
1589 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001590}
1591
1592static PyTypeObject _PyExc_UnicodeDecodeError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001593 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00001594 "UnicodeDecodeError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00001595 sizeof(PyUnicodeErrorObject), 0,
1596 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1597 (reprfunc)UnicodeDecodeError_str, 0, 0, 0,
1598 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001599 PyDoc_STR("Unicode decoding error."), (traverseproc)UnicodeError_traverse,
1600 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001601 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001602 (initproc)UnicodeDecodeError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001603};
1604PyObject *PyExc_UnicodeDecodeError = (PyObject *)&_PyExc_UnicodeDecodeError;
1605
1606PyObject *
1607PyUnicodeDecodeError_Create(
1608 const char *encoding, const char *object, Py_ssize_t length,
1609 Py_ssize_t start, Py_ssize_t end, const char *reason)
1610{
1611 assert(length < INT_MAX);
1612 assert(start < INT_MAX);
1613 assert(end < INT_MAX);
Walter Dörwaldd2034312007-05-18 16:29:38 +00001614 return PyObject_CallFunction(PyExc_UnicodeDecodeError, "Uy#nnU",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001615 encoding, object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001616}
1617
1618
1619/*
1620 * UnicodeTranslateError extends UnicodeError
1621 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001622
1623static int
1624UnicodeTranslateError_init(PyUnicodeErrorObject *self, PyObject *args,
1625 PyObject *kwds)
1626{
1627 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1628 return -1;
1629
1630 Py_CLEAR(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001631 Py_CLEAR(self->reason);
1632
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001633 if (!PyArg_ParseTuple(args, "O!nnO!",
Thomas Wouters477c8d52006-05-27 19:21:47 +00001634 &PyUnicode_Type, &self->object,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001635 &self->start,
1636 &self->end,
Walter Dörwaldd2034312007-05-18 16:29:38 +00001637 &PyUnicode_Type, &self->reason)) {
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001638 self->object = self->reason = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001639 return -1;
1640 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001641
Thomas Wouters477c8d52006-05-27 19:21:47 +00001642 Py_INCREF(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001643 Py_INCREF(self->reason);
1644
1645 return 0;
1646}
1647
1648
1649static PyObject *
1650UnicodeTranslateError_str(PyObject *self)
1651{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001652 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00001653 PyObject *result = NULL;
1654 PyObject *reason_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001655
Eric Smith0facd772010-02-24 15:42:29 +00001656 /* Get reason as a string, which it might not be if it's been
1657 modified after we were contructed. */
1658 reason_str = PyObject_Str(uself->reason);
1659 if (reason_str == NULL)
1660 goto done;
1661
1662 if (uself->start < PyUnicode_GET_SIZE(uself->object) && uself->end == uself->start+1) {
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001663 int badchar = (int)PyUnicode_AS_UNICODE(uself->object)[uself->start];
Walter Dörwald787b03b2007-06-05 13:29:29 +00001664 const char *fmt;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001665 if (badchar <= 0xff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00001666 fmt = "can't translate character '\\x%02x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001667 else if (badchar <= 0xffff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00001668 fmt = "can't translate character '\\u%04x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001669 else
Walter Dörwald32a4c712007-06-20 09:25:34 +00001670 fmt = "can't translate character '\\U%08x' in position %zd: %U";
Benjamin Petersonc5f4e1e2010-02-25 01:22:28 +00001671 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00001672 fmt,
1673 badchar,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001674 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00001675 reason_str
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001676 );
Eric Smith0facd772010-02-24 15:42:29 +00001677 } else {
1678 result = PyUnicode_FromFormat(
1679 "can't translate characters in position %zd-%zd: %U",
1680 uself->start,
1681 uself->end-1,
1682 reason_str
1683 );
Thomas Wouters477c8d52006-05-27 19:21:47 +00001684 }
Eric Smith0facd772010-02-24 15:42:29 +00001685done:
1686 Py_XDECREF(reason_str);
1687 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001688}
1689
1690static PyTypeObject _PyExc_UnicodeTranslateError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001691 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00001692 "UnicodeTranslateError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00001693 sizeof(PyUnicodeErrorObject), 0,
1694 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1695 (reprfunc)UnicodeTranslateError_str, 0, 0, 0,
1696 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters89f507f2006-12-13 04:49:30 +00001697 PyDoc_STR("Unicode translation error."), (traverseproc)UnicodeError_traverse,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001698 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
1699 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001700 (initproc)UnicodeTranslateError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001701};
1702PyObject *PyExc_UnicodeTranslateError = (PyObject *)&_PyExc_UnicodeTranslateError;
1703
1704PyObject *
1705PyUnicodeTranslateError_Create(
1706 const Py_UNICODE *object, Py_ssize_t length,
1707 Py_ssize_t start, Py_ssize_t end, const char *reason)
1708{
1709 return PyObject_CallFunction(PyExc_UnicodeTranslateError, "u#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001710 object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001711}
Thomas Wouters477c8d52006-05-27 19:21:47 +00001712
1713
1714/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001715 * AssertionError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001716 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001717SimpleExtendsException(PyExc_Exception, AssertionError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001718 "Assertion failed.");
1719
1720
1721/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001722 * ArithmeticError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001723 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001724SimpleExtendsException(PyExc_Exception, ArithmeticError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001725 "Base class for arithmetic errors.");
1726
1727
1728/*
1729 * FloatingPointError extends ArithmeticError
1730 */
1731SimpleExtendsException(PyExc_ArithmeticError, FloatingPointError,
1732 "Floating point operation failed.");
1733
1734
1735/*
1736 * OverflowError extends ArithmeticError
1737 */
1738SimpleExtendsException(PyExc_ArithmeticError, OverflowError,
1739 "Result too large to be represented.");
1740
1741
1742/*
1743 * ZeroDivisionError extends ArithmeticError
1744 */
1745SimpleExtendsException(PyExc_ArithmeticError, ZeroDivisionError,
1746 "Second argument to a division or modulo operation was zero.");
1747
1748
1749/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001750 * SystemError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001751 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001752SimpleExtendsException(PyExc_Exception, SystemError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001753 "Internal error in the Python interpreter.\n"
1754 "\n"
1755 "Please report this to the Python maintainer, along with the traceback,\n"
1756 "the Python version, and the hardware/OS platform and version.");
1757
1758
1759/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001760 * ReferenceError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001761 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001762SimpleExtendsException(PyExc_Exception, ReferenceError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001763 "Weak ref proxy used after referent went away.");
1764
1765
1766/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001767 * MemoryError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001768 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001769SimpleExtendsException(PyExc_Exception, MemoryError, "Out of memory.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001770
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001771/*
1772 * BufferError extends Exception
1773 */
1774SimpleExtendsException(PyExc_Exception, BufferError, "Buffer error.");
1775
Thomas Wouters477c8d52006-05-27 19:21:47 +00001776
1777/* Warning category docstrings */
1778
1779/*
1780 * Warning extends Exception
1781 */
1782SimpleExtendsException(PyExc_Exception, Warning,
1783 "Base class for warning categories.");
1784
1785
1786/*
1787 * UserWarning extends Warning
1788 */
1789SimpleExtendsException(PyExc_Warning, UserWarning,
1790 "Base class for warnings generated by user code.");
1791
1792
1793/*
1794 * DeprecationWarning extends Warning
1795 */
1796SimpleExtendsException(PyExc_Warning, DeprecationWarning,
1797 "Base class for warnings about deprecated features.");
1798
1799
1800/*
1801 * PendingDeprecationWarning extends Warning
1802 */
1803SimpleExtendsException(PyExc_Warning, PendingDeprecationWarning,
1804 "Base class for warnings about features which will be deprecated\n"
1805 "in the future.");
1806
1807
1808/*
1809 * SyntaxWarning extends Warning
1810 */
1811SimpleExtendsException(PyExc_Warning, SyntaxWarning,
1812 "Base class for warnings about dubious syntax.");
1813
1814
1815/*
1816 * RuntimeWarning extends Warning
1817 */
1818SimpleExtendsException(PyExc_Warning, RuntimeWarning,
1819 "Base class for warnings about dubious runtime behavior.");
1820
1821
1822/*
1823 * FutureWarning extends Warning
1824 */
1825SimpleExtendsException(PyExc_Warning, FutureWarning,
1826 "Base class for warnings about constructs that will change semantically\n"
1827 "in the future.");
1828
1829
1830/*
1831 * ImportWarning extends Warning
1832 */
1833SimpleExtendsException(PyExc_Warning, ImportWarning,
1834 "Base class for warnings about probable mistakes in module imports");
1835
1836
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001837/*
1838 * UnicodeWarning extends Warning
1839 */
1840SimpleExtendsException(PyExc_Warning, UnicodeWarning,
1841 "Base class for warnings about Unicode related problems, mostly\n"
1842 "related to conversion problems.");
1843
Guido van Rossum98297ee2007-11-06 21:34:58 +00001844/*
1845 * BytesWarning extends Warning
1846 */
1847SimpleExtendsException(PyExc_Warning, BytesWarning,
1848 "Base class for warnings about bytes and buffer related problems, mostly\n"
1849 "related to conversion from str or comparing to str.");
1850
1851
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001852
Thomas Wouters477c8d52006-05-27 19:21:47 +00001853/* Pre-computed MemoryError instance. Best to create this as early as
1854 * possible and not wait until a MemoryError is actually raised!
1855 */
1856PyObject *PyExc_MemoryErrorInst=NULL;
1857
Thomas Wouters89d996e2007-09-08 17:39:28 +00001858/* Pre-computed RuntimeError instance for when recursion depth is reached.
1859 Meant to be used when normalizing the exception for exceeding the recursion
1860 depth will cause its own infinite recursion.
1861*/
1862PyObject *PyExc_RecursionErrorInst = NULL;
1863
Thomas Wouters477c8d52006-05-27 19:21:47 +00001864#define PRE_INIT(TYPE) if (PyType_Ready(&_PyExc_ ## TYPE) < 0) \
1865 Py_FatalError("exceptions bootstrapping error.");
1866
1867#define POST_INIT(TYPE) Py_INCREF(PyExc_ ## TYPE); \
Thomas Wouters477c8d52006-05-27 19:21:47 +00001868 if (PyDict_SetItemString(bdict, # TYPE, PyExc_ ## TYPE)) \
1869 Py_FatalError("Module dictionary insertion problem.");
1870
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001871
Martin v. Löwis1a214512008-06-11 05:26:20 +00001872void
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001873_PyExc_Init(void)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001874{
Neal Norwitz2633c692007-02-26 22:22:47 +00001875 PyObject *bltinmod, *bdict;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001876
1877 PRE_INIT(BaseException)
1878 PRE_INIT(Exception)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001879 PRE_INIT(TypeError)
1880 PRE_INIT(StopIteration)
1881 PRE_INIT(GeneratorExit)
1882 PRE_INIT(SystemExit)
1883 PRE_INIT(KeyboardInterrupt)
1884 PRE_INIT(ImportError)
1885 PRE_INIT(EnvironmentError)
1886 PRE_INIT(IOError)
1887 PRE_INIT(OSError)
1888#ifdef MS_WINDOWS
1889 PRE_INIT(WindowsError)
1890#endif
1891#ifdef __VMS
1892 PRE_INIT(VMSError)
1893#endif
1894 PRE_INIT(EOFError)
1895 PRE_INIT(RuntimeError)
1896 PRE_INIT(NotImplementedError)
1897 PRE_INIT(NameError)
1898 PRE_INIT(UnboundLocalError)
1899 PRE_INIT(AttributeError)
1900 PRE_INIT(SyntaxError)
1901 PRE_INIT(IndentationError)
1902 PRE_INIT(TabError)
1903 PRE_INIT(LookupError)
1904 PRE_INIT(IndexError)
1905 PRE_INIT(KeyError)
1906 PRE_INIT(ValueError)
1907 PRE_INIT(UnicodeError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001908 PRE_INIT(UnicodeEncodeError)
1909 PRE_INIT(UnicodeDecodeError)
1910 PRE_INIT(UnicodeTranslateError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001911 PRE_INIT(AssertionError)
1912 PRE_INIT(ArithmeticError)
1913 PRE_INIT(FloatingPointError)
1914 PRE_INIT(OverflowError)
1915 PRE_INIT(ZeroDivisionError)
1916 PRE_INIT(SystemError)
1917 PRE_INIT(ReferenceError)
Neal Norwitzfaa54a32007-08-19 04:23:20 +00001918 PRE_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001919 PRE_INIT(MemoryError)
Benjamin Peterson2b968d62008-07-05 23:38:30 +00001920 PRE_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001921 PRE_INIT(Warning)
1922 PRE_INIT(UserWarning)
1923 PRE_INIT(DeprecationWarning)
1924 PRE_INIT(PendingDeprecationWarning)
1925 PRE_INIT(SyntaxWarning)
1926 PRE_INIT(RuntimeWarning)
1927 PRE_INIT(FutureWarning)
1928 PRE_INIT(ImportWarning)
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001929 PRE_INIT(UnicodeWarning)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001930 PRE_INIT(BytesWarning)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001931
Georg Brandl1a3284e2007-12-02 09:40:06 +00001932 bltinmod = PyImport_ImportModule("builtins");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001933 if (bltinmod == NULL)
1934 Py_FatalError("exceptions bootstrapping error.");
1935 bdict = PyModule_GetDict(bltinmod);
1936 if (bdict == NULL)
1937 Py_FatalError("exceptions bootstrapping error.");
1938
1939 POST_INIT(BaseException)
1940 POST_INIT(Exception)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001941 POST_INIT(TypeError)
1942 POST_INIT(StopIteration)
1943 POST_INIT(GeneratorExit)
1944 POST_INIT(SystemExit)
1945 POST_INIT(KeyboardInterrupt)
1946 POST_INIT(ImportError)
1947 POST_INIT(EnvironmentError)
1948 POST_INIT(IOError)
1949 POST_INIT(OSError)
1950#ifdef MS_WINDOWS
1951 POST_INIT(WindowsError)
1952#endif
1953#ifdef __VMS
1954 POST_INIT(VMSError)
1955#endif
1956 POST_INIT(EOFError)
1957 POST_INIT(RuntimeError)
1958 POST_INIT(NotImplementedError)
1959 POST_INIT(NameError)
1960 POST_INIT(UnboundLocalError)
1961 POST_INIT(AttributeError)
1962 POST_INIT(SyntaxError)
1963 POST_INIT(IndentationError)
1964 POST_INIT(TabError)
1965 POST_INIT(LookupError)
1966 POST_INIT(IndexError)
1967 POST_INIT(KeyError)
1968 POST_INIT(ValueError)
1969 POST_INIT(UnicodeError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001970 POST_INIT(UnicodeEncodeError)
1971 POST_INIT(UnicodeDecodeError)
1972 POST_INIT(UnicodeTranslateError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001973 POST_INIT(AssertionError)
1974 POST_INIT(ArithmeticError)
1975 POST_INIT(FloatingPointError)
1976 POST_INIT(OverflowError)
1977 POST_INIT(ZeroDivisionError)
1978 POST_INIT(SystemError)
1979 POST_INIT(ReferenceError)
Neal Norwitzfaa54a32007-08-19 04:23:20 +00001980 POST_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001981 POST_INIT(MemoryError)
Benjamin Peterson2b968d62008-07-05 23:38:30 +00001982 POST_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001983 POST_INIT(Warning)
1984 POST_INIT(UserWarning)
1985 POST_INIT(DeprecationWarning)
1986 POST_INIT(PendingDeprecationWarning)
1987 POST_INIT(SyntaxWarning)
1988 POST_INIT(RuntimeWarning)
1989 POST_INIT(FutureWarning)
1990 POST_INIT(ImportWarning)
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001991 POST_INIT(UnicodeWarning)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001992 POST_INIT(BytesWarning)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001993
1994 PyExc_MemoryErrorInst = BaseException_new(&_PyExc_MemoryError, NULL, NULL);
1995 if (!PyExc_MemoryErrorInst)
Benjamin Petersonb58dda72009-01-18 22:27:04 +00001996 Py_FatalError("Cannot pre-allocate MemoryError instance");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001997
Thomas Wouters89d996e2007-09-08 17:39:28 +00001998 PyExc_RecursionErrorInst = BaseException_new(&_PyExc_RuntimeError, NULL, NULL);
1999 if (!PyExc_RecursionErrorInst)
2000 Py_FatalError("Cannot pre-allocate RuntimeError instance for "
2001 "recursion errors");
2002 else {
2003 PyBaseExceptionObject *err_inst =
2004 (PyBaseExceptionObject *)PyExc_RecursionErrorInst;
2005 PyObject *args_tuple;
2006 PyObject *exc_message;
Neal Norwitzbed67842007-10-27 04:00:45 +00002007 exc_message = PyUnicode_FromString("maximum recursion depth exceeded");
Thomas Wouters89d996e2007-09-08 17:39:28 +00002008 if (!exc_message)
2009 Py_FatalError("cannot allocate argument for RuntimeError "
2010 "pre-allocation");
2011 args_tuple = PyTuple_Pack(1, exc_message);
2012 if (!args_tuple)
2013 Py_FatalError("cannot allocate tuple for RuntimeError "
2014 "pre-allocation");
2015 Py_DECREF(exc_message);
2016 if (BaseException_init(err_inst, args_tuple, NULL))
2017 Py_FatalError("init of pre-allocated RuntimeError failed");
2018 Py_DECREF(args_tuple);
2019 }
2020
Thomas Wouters477c8d52006-05-27 19:21:47 +00002021 Py_DECREF(bltinmod);
2022}
2023
2024void
2025_PyExc_Fini(void)
2026{
Benjamin Peterson78565b22009-06-28 19:19:51 +00002027 Py_CLEAR(PyExc_MemoryErrorInst);
2028 Py_CLEAR(PyExc_RecursionErrorInst);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002029}