blob: 60b340b9a3217aee950c41c054523fbd2f57e330 [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);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000273 }
Georg Brandlab6f2f62009-03-31 04:16:10 +0000274 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);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000299 }
Georg Brandlab6f2f62009-03-31 04:16:10 +0000300 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 |
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000382 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);
Victor Stinner92236e52011-05-26 14:25:54 +0200502 else /* size > 1 */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000503 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. */
Victor Stinner6237daf2010-04-28 17:26:19 +0000962static PyObject*
963my_basename(PyObject *name)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000964{
Victor Stinner6237daf2010-04-28 17:26:19 +0000965 Py_ssize_t i, size, offset;
Victor Stinner31392e72011-10-05 20:14:23 +0200966 int kind;
967 void *data;
968
969 if (PyUnicode_READY(name))
970 return NULL;
971 kind = PyUnicode_KIND(name);
972 data = PyUnicode_DATA(name);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200973 size = PyUnicode_GET_LENGTH(name);
Victor Stinner6237daf2010-04-28 17:26:19 +0000974 offset = 0;
975 for(i=0; i < size; i++) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200976 if (PyUnicode_READ(kind, data, i) == SEP)
Victor Stinner6237daf2010-04-28 17:26:19 +0000977 offset = i + 1;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000978 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200979 if (offset != 0)
980 return PyUnicode_Substring(name, offset, size);
981 else {
Victor Stinner6237daf2010-04-28 17:26:19 +0000982 Py_INCREF(name);
983 return name;
984 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000985}
986
987
988static PyObject *
989SyntaxError_str(PySyntaxErrorObject *self)
990{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000991 int have_lineno = 0;
Victor Stinner6237daf2010-04-28 17:26:19 +0000992 PyObject *filename;
993 PyObject *result;
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +0000994 /* Below, we always ignore overflow errors, just printing -1.
995 Still, we cannot allow an OverflowError to be raised, so
996 we need to call PyLong_AsLongAndOverflow. */
997 int overflow;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000998
999 /* XXX -- do all the additional formatting with filename and
1000 lineno here */
1001
Neal Norwitzed2b7392007-08-26 04:51:10 +00001002 if (self->filename && PyUnicode_Check(self->filename)) {
Victor Stinner6237daf2010-04-28 17:26:19 +00001003 filename = my_basename(self->filename);
1004 if (filename == NULL)
1005 return NULL;
1006 } else {
1007 filename = NULL;
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001008 }
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001009 have_lineno = (self->lineno != NULL) && PyLong_CheckExact(self->lineno);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001010
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001011 if (!filename && !have_lineno)
Thomas Heller519a0422007-11-15 20:48:54 +00001012 return PyObject_Str(self->msg ? self->msg : Py_None);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001013
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001014 if (filename && have_lineno)
Victor Stinner6237daf2010-04-28 17:26:19 +00001015 result = PyUnicode_FromFormat("%S (%U, line %ld)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001016 self->msg ? self->msg : Py_None,
Victor Stinner6237daf2010-04-28 17:26:19 +00001017 filename,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001018 PyLong_AsLongAndOverflow(self->lineno, &overflow));
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001019 else if (filename)
Victor Stinner6237daf2010-04-28 17:26:19 +00001020 result = PyUnicode_FromFormat("%S (%U)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001021 self->msg ? self->msg : Py_None,
Victor Stinner6237daf2010-04-28 17:26:19 +00001022 filename);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001023 else /* only have_lineno */
Victor Stinner6237daf2010-04-28 17:26:19 +00001024 result = PyUnicode_FromFormat("%S (line %ld)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001025 self->msg ? self->msg : Py_None,
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001026 PyLong_AsLongAndOverflow(self->lineno, &overflow));
Victor Stinner6237daf2010-04-28 17:26:19 +00001027 Py_XDECREF(filename);
1028 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001029}
1030
1031static PyMemberDef SyntaxError_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +00001032 {"msg", T_OBJECT, offsetof(PySyntaxErrorObject, msg), 0,
1033 PyDoc_STR("exception msg")},
1034 {"filename", T_OBJECT, offsetof(PySyntaxErrorObject, filename), 0,
1035 PyDoc_STR("exception filename")},
1036 {"lineno", T_OBJECT, offsetof(PySyntaxErrorObject, lineno), 0,
1037 PyDoc_STR("exception lineno")},
1038 {"offset", T_OBJECT, offsetof(PySyntaxErrorObject, offset), 0,
1039 PyDoc_STR("exception offset")},
1040 {"text", T_OBJECT, offsetof(PySyntaxErrorObject, text), 0,
1041 PyDoc_STR("exception text")},
1042 {"print_file_and_line", T_OBJECT,
1043 offsetof(PySyntaxErrorObject, print_file_and_line), 0,
1044 PyDoc_STR("exception print_file_and_line")},
1045 {NULL} /* Sentinel */
1046};
1047
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001048ComplexExtendsException(PyExc_Exception, SyntaxError, SyntaxError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001049 SyntaxError_dealloc, 0, SyntaxError_members,
1050 SyntaxError_str, "Invalid syntax.");
1051
1052
1053/*
1054 * IndentationError extends SyntaxError
1055 */
1056MiddlingExtendsException(PyExc_SyntaxError, IndentationError, SyntaxError,
1057 "Improper indentation.");
1058
1059
1060/*
1061 * TabError extends IndentationError
1062 */
1063MiddlingExtendsException(PyExc_IndentationError, TabError, SyntaxError,
1064 "Improper mixture of spaces and tabs.");
1065
1066
1067/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001068 * LookupError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001069 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001070SimpleExtendsException(PyExc_Exception, LookupError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001071 "Base class for lookup errors.");
1072
1073
1074/*
1075 * IndexError extends LookupError
1076 */
1077SimpleExtendsException(PyExc_LookupError, IndexError,
1078 "Sequence index out of range.");
1079
1080
1081/*
1082 * KeyError extends LookupError
1083 */
1084static PyObject *
1085KeyError_str(PyBaseExceptionObject *self)
1086{
1087 /* If args is a tuple of exactly one item, apply repr to args[0].
1088 This is done so that e.g. the exception raised by {}[''] prints
1089 KeyError: ''
1090 rather than the confusing
1091 KeyError
1092 alone. The downside is that if KeyError is raised with an explanatory
1093 string, that string will be displayed in quotes. Too bad.
1094 If args is anything else, use the default BaseException__str__().
1095 */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001096 if (PyTuple_GET_SIZE(self->args) == 1) {
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001097 return PyObject_Repr(PyTuple_GET_ITEM(self->args, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001098 }
1099 return BaseException_str(self);
1100}
1101
1102ComplexExtendsException(PyExc_LookupError, KeyError, BaseException,
1103 0, 0, 0, KeyError_str, "Mapping key not found.");
1104
1105
1106/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001107 * ValueError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001108 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001109SimpleExtendsException(PyExc_Exception, ValueError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001110 "Inappropriate argument value (of correct type).");
1111
1112/*
1113 * UnicodeError extends ValueError
1114 */
1115
1116SimpleExtendsException(PyExc_ValueError, UnicodeError,
1117 "Unicode related error.");
1118
Thomas Wouters477c8d52006-05-27 19:21:47 +00001119static PyObject *
Guido van Rossum98297ee2007-11-06 21:34:58 +00001120get_string(PyObject *attr, const char *name)
Walter Dörwald612344f2007-05-04 19:28:21 +00001121{
1122 if (!attr) {
1123 PyErr_Format(PyExc_TypeError, "%.200s attribute not set", name);
1124 return NULL;
1125 }
1126
Christian Heimes72b710a2008-05-26 13:28:38 +00001127 if (!PyBytes_Check(attr)) {
Walter Dörwald612344f2007-05-04 19:28:21 +00001128 PyErr_Format(PyExc_TypeError, "%.200s attribute must be bytes", name);
1129 return NULL;
1130 }
1131 Py_INCREF(attr);
1132 return attr;
1133}
1134
1135static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00001136get_unicode(PyObject *attr, const char *name)
1137{
1138 if (!attr) {
1139 PyErr_Format(PyExc_TypeError, "%.200s attribute not set", name);
1140 return NULL;
1141 }
1142
1143 if (!PyUnicode_Check(attr)) {
1144 PyErr_Format(PyExc_TypeError,
1145 "%.200s attribute must be unicode", name);
1146 return NULL;
1147 }
1148 Py_INCREF(attr);
1149 return attr;
1150}
1151
Walter Dörwaldd2034312007-05-18 16:29:38 +00001152static int
1153set_unicodefromstring(PyObject **attr, const char *value)
1154{
1155 PyObject *obj = PyUnicode_FromString(value);
1156 if (!obj)
1157 return -1;
1158 Py_CLEAR(*attr);
1159 *attr = obj;
1160 return 0;
1161}
1162
Thomas Wouters477c8d52006-05-27 19:21:47 +00001163PyObject *
1164PyUnicodeEncodeError_GetEncoding(PyObject *exc)
1165{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001166 return get_unicode(((PyUnicodeErrorObject *)exc)->encoding, "encoding");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001167}
1168
1169PyObject *
1170PyUnicodeDecodeError_GetEncoding(PyObject *exc)
1171{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001172 return get_unicode(((PyUnicodeErrorObject *)exc)->encoding, "encoding");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001173}
1174
1175PyObject *
1176PyUnicodeEncodeError_GetObject(PyObject *exc)
1177{
1178 return get_unicode(((PyUnicodeErrorObject *)exc)->object, "object");
1179}
1180
1181PyObject *
1182PyUnicodeDecodeError_GetObject(PyObject *exc)
1183{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001184 return get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001185}
1186
1187PyObject *
1188PyUnicodeTranslateError_GetObject(PyObject *exc)
1189{
1190 return get_unicode(((PyUnicodeErrorObject *)exc)->object, "object");
1191}
1192
1193int
1194PyUnicodeEncodeError_GetStart(PyObject *exc, Py_ssize_t *start)
1195{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001196 Py_ssize_t size;
1197 PyObject *obj = get_unicode(((PyUnicodeErrorObject *)exc)->object,
1198 "object");
1199 if (!obj)
1200 return -1;
1201 *start = ((PyUnicodeErrorObject *)exc)->start;
1202 size = PyUnicode_GET_SIZE(obj);
1203 if (*start<0)
1204 *start = 0; /*XXX check for values <0*/
1205 if (*start>=size)
1206 *start = size-1;
1207 Py_DECREF(obj);
1208 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001209}
1210
1211
1212int
1213PyUnicodeDecodeError_GetStart(PyObject *exc, Py_ssize_t *start)
1214{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001215 Py_ssize_t size;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001216 PyObject *obj = get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001217 if (!obj)
1218 return -1;
Christian Heimes72b710a2008-05-26 13:28:38 +00001219 size = PyBytes_GET_SIZE(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001220 *start = ((PyUnicodeErrorObject *)exc)->start;
1221 if (*start<0)
1222 *start = 0;
1223 if (*start>=size)
1224 *start = size-1;
1225 Py_DECREF(obj);
1226 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001227}
1228
1229
1230int
1231PyUnicodeTranslateError_GetStart(PyObject *exc, Py_ssize_t *start)
1232{
1233 return PyUnicodeEncodeError_GetStart(exc, start);
1234}
1235
1236
1237int
1238PyUnicodeEncodeError_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
1246PyUnicodeDecodeError_SetStart(PyObject *exc, Py_ssize_t start)
1247{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001248 ((PyUnicodeErrorObject *)exc)->start = start;
1249 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001250}
1251
1252
1253int
1254PyUnicodeTranslateError_SetStart(PyObject *exc, Py_ssize_t start)
1255{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001256 ((PyUnicodeErrorObject *)exc)->start = start;
1257 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001258}
1259
1260
1261int
1262PyUnicodeEncodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
1263{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001264 Py_ssize_t size;
1265 PyObject *obj = get_unicode(((PyUnicodeErrorObject *)exc)->object,
1266 "object");
1267 if (!obj)
1268 return -1;
1269 *end = ((PyUnicodeErrorObject *)exc)->end;
1270 size = PyUnicode_GET_SIZE(obj);
1271 if (*end<1)
1272 *end = 1;
1273 if (*end>size)
1274 *end = size;
1275 Py_DECREF(obj);
1276 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001277}
1278
1279
1280int
1281PyUnicodeDecodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
1282{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001283 Py_ssize_t size;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001284 PyObject *obj = get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001285 if (!obj)
1286 return -1;
Christian Heimes72b710a2008-05-26 13:28:38 +00001287 size = PyBytes_GET_SIZE(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001288 *end = ((PyUnicodeErrorObject *)exc)->end;
1289 if (*end<1)
1290 *end = 1;
1291 if (*end>size)
1292 *end = size;
1293 Py_DECREF(obj);
1294 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001295}
1296
1297
1298int
1299PyUnicodeTranslateError_GetEnd(PyObject *exc, Py_ssize_t *start)
1300{
1301 return PyUnicodeEncodeError_GetEnd(exc, start);
1302}
1303
1304
1305int
1306PyUnicodeEncodeError_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
1312
1313int
1314PyUnicodeDecodeError_SetEnd(PyObject *exc, Py_ssize_t end)
1315{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001316 ((PyUnicodeErrorObject *)exc)->end = end;
1317 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001318}
1319
1320
1321int
1322PyUnicodeTranslateError_SetEnd(PyObject *exc, Py_ssize_t end)
1323{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001324 ((PyUnicodeErrorObject *)exc)->end = end;
1325 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001326}
1327
1328PyObject *
1329PyUnicodeEncodeError_GetReason(PyObject *exc)
1330{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001331 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001332}
1333
1334
1335PyObject *
1336PyUnicodeDecodeError_GetReason(PyObject *exc)
1337{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001338 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001339}
1340
1341
1342PyObject *
1343PyUnicodeTranslateError_GetReason(PyObject *exc)
1344{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001345 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001346}
1347
1348
1349int
1350PyUnicodeEncodeError_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
1357int
1358PyUnicodeDecodeError_SetReason(PyObject *exc, const char *reason)
1359{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001360 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1361 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001362}
1363
1364
1365int
1366PyUnicodeTranslateError_SetReason(PyObject *exc, const char *reason)
1367{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001368 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1369 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001370}
1371
1372
Thomas Wouters477c8d52006-05-27 19:21:47 +00001373static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001374UnicodeError_clear(PyUnicodeErrorObject *self)
1375{
1376 Py_CLEAR(self->encoding);
1377 Py_CLEAR(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001378 Py_CLEAR(self->reason);
1379 return BaseException_clear((PyBaseExceptionObject *)self);
1380}
1381
1382static void
1383UnicodeError_dealloc(PyUnicodeErrorObject *self)
1384{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001385 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001386 UnicodeError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +00001387 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001388}
1389
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001390static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001391UnicodeError_traverse(PyUnicodeErrorObject *self, visitproc visit, void *arg)
1392{
1393 Py_VISIT(self->encoding);
1394 Py_VISIT(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001395 Py_VISIT(self->reason);
1396 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1397}
1398
1399static PyMemberDef UnicodeError_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +00001400 {"encoding", T_OBJECT, offsetof(PyUnicodeErrorObject, encoding), 0,
1401 PyDoc_STR("exception encoding")},
1402 {"object", T_OBJECT, offsetof(PyUnicodeErrorObject, object), 0,
1403 PyDoc_STR("exception object")},
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001404 {"start", T_PYSSIZET, offsetof(PyUnicodeErrorObject, start), 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001405 PyDoc_STR("exception start")},
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001406 {"end", T_PYSSIZET, offsetof(PyUnicodeErrorObject, end), 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001407 PyDoc_STR("exception end")},
1408 {"reason", T_OBJECT, offsetof(PyUnicodeErrorObject, reason), 0,
1409 PyDoc_STR("exception reason")},
1410 {NULL} /* Sentinel */
1411};
1412
1413
1414/*
1415 * UnicodeEncodeError extends UnicodeError
1416 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001417
1418static int
1419UnicodeEncodeError_init(PyObject *self, PyObject *args, PyObject *kwds)
1420{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001421 PyUnicodeErrorObject *err;
1422
Thomas Wouters477c8d52006-05-27 19:21:47 +00001423 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1424 return -1;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001425
1426 err = (PyUnicodeErrorObject *)self;
1427
1428 Py_CLEAR(err->encoding);
1429 Py_CLEAR(err->object);
1430 Py_CLEAR(err->reason);
1431
1432 if (!PyArg_ParseTuple(args, "O!O!nnO!",
1433 &PyUnicode_Type, &err->encoding,
1434 &PyUnicode_Type, &err->object,
1435 &err->start,
1436 &err->end,
1437 &PyUnicode_Type, &err->reason)) {
1438 err->encoding = err->object = err->reason = NULL;
1439 return -1;
1440 }
1441
1442 Py_INCREF(err->encoding);
1443 Py_INCREF(err->object);
1444 Py_INCREF(err->reason);
1445
1446 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001447}
1448
1449static PyObject *
1450UnicodeEncodeError_str(PyObject *self)
1451{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001452 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00001453 PyObject *result = NULL;
1454 PyObject *reason_str = NULL;
1455 PyObject *encoding_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001456
Eric Smith0facd772010-02-24 15:42:29 +00001457 /* Get reason and encoding as strings, which they might not be if
1458 they've been modified after we were contructed. */
1459 reason_str = PyObject_Str(uself->reason);
1460 if (reason_str == NULL)
1461 goto done;
1462 encoding_str = PyObject_Str(uself->encoding);
1463 if (encoding_str == NULL)
1464 goto done;
1465
1466 if (uself->start < PyUnicode_GET_SIZE(uself->object) && uself->end == uself->start+1) {
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001467 int badchar = (int)PyUnicode_AS_UNICODE(uself->object)[uself->start];
Walter Dörwald787b03b2007-06-05 13:29:29 +00001468 const char *fmt;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001469 if (badchar <= 0xff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00001470 fmt = "'%U' codec can't encode character '\\x%02x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001471 else if (badchar <= 0xffff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00001472 fmt = "'%U' codec can't encode character '\\u%04x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001473 else
Walter Dörwald32a4c712007-06-20 09:25:34 +00001474 fmt = "'%U' codec can't encode character '\\U%08x' in position %zd: %U";
Eric Smith0facd772010-02-24 15:42:29 +00001475 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00001476 fmt,
Eric Smith0facd772010-02-24 15:42:29 +00001477 encoding_str,
Walter Dörwald787b03b2007-06-05 13:29:29 +00001478 badchar,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001479 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00001480 reason_str);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001481 }
Eric Smith0facd772010-02-24 15:42:29 +00001482 else {
1483 result = PyUnicode_FromFormat(
1484 "'%U' codec can't encode characters in position %zd-%zd: %U",
1485 encoding_str,
1486 uself->start,
1487 uself->end-1,
1488 reason_str);
1489 }
1490done:
1491 Py_XDECREF(reason_str);
1492 Py_XDECREF(encoding_str);
1493 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001494}
1495
1496static PyTypeObject _PyExc_UnicodeEncodeError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001497 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00001498 "UnicodeEncodeError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00001499 sizeof(PyUnicodeErrorObject), 0,
1500 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1501 (reprfunc)UnicodeEncodeError_str, 0, 0, 0,
1502 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001503 PyDoc_STR("Unicode encoding error."), (traverseproc)UnicodeError_traverse,
1504 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001505 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001506 (initproc)UnicodeEncodeError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001507};
1508PyObject *PyExc_UnicodeEncodeError = (PyObject *)&_PyExc_UnicodeEncodeError;
1509
1510PyObject *
1511PyUnicodeEncodeError_Create(
1512 const char *encoding, const Py_UNICODE *object, Py_ssize_t length,
1513 Py_ssize_t start, Py_ssize_t end, const char *reason)
1514{
Victor Stinner7eeb5b52010-06-07 19:57:46 +00001515 return PyObject_CallFunction(PyExc_UnicodeEncodeError, "su#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001516 encoding, object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001517}
1518
1519
1520/*
1521 * UnicodeDecodeError extends UnicodeError
1522 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001523
1524static int
1525UnicodeDecodeError_init(PyObject *self, PyObject *args, PyObject *kwds)
1526{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001527 PyUnicodeErrorObject *ude;
1528 const char *data;
1529 Py_ssize_t size;
1530
Thomas Wouters477c8d52006-05-27 19:21:47 +00001531 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1532 return -1;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001533
1534 ude = (PyUnicodeErrorObject *)self;
1535
1536 Py_CLEAR(ude->encoding);
1537 Py_CLEAR(ude->object);
1538 Py_CLEAR(ude->reason);
1539
1540 if (!PyArg_ParseTuple(args, "O!OnnO!",
1541 &PyUnicode_Type, &ude->encoding,
1542 &ude->object,
1543 &ude->start,
1544 &ude->end,
1545 &PyUnicode_Type, &ude->reason)) {
1546 ude->encoding = ude->object = ude->reason = NULL;
1547 return -1;
1548 }
1549
Christian Heimes72b710a2008-05-26 13:28:38 +00001550 if (!PyBytes_Check(ude->object)) {
Guido van Rossum98297ee2007-11-06 21:34:58 +00001551 if (PyObject_AsReadBuffer(ude->object, (const void **)&data, &size)) {
1552 ude->encoding = ude->object = ude->reason = NULL;
1553 return -1;
1554 }
Christian Heimes72b710a2008-05-26 13:28:38 +00001555 ude->object = PyBytes_FromStringAndSize(data, size);
Guido van Rossum98297ee2007-11-06 21:34:58 +00001556 }
1557 else {
1558 Py_INCREF(ude->object);
1559 }
1560
1561 Py_INCREF(ude->encoding);
1562 Py_INCREF(ude->reason);
1563
1564 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001565}
1566
1567static PyObject *
1568UnicodeDecodeError_str(PyObject *self)
1569{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001570 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00001571 PyObject *result = NULL;
1572 PyObject *reason_str = NULL;
1573 PyObject *encoding_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001574
Eric Smith0facd772010-02-24 15:42:29 +00001575 /* Get reason and encoding as strings, which they might not be if
1576 they've been modified after we were contructed. */
1577 reason_str = PyObject_Str(uself->reason);
1578 if (reason_str == NULL)
1579 goto done;
1580 encoding_str = PyObject_Str(uself->encoding);
1581 if (encoding_str == NULL)
1582 goto done;
1583
1584 if (uself->start < PyBytes_GET_SIZE(uself->object) && uself->end == uself->start+1) {
Christian Heimes72b710a2008-05-26 13:28:38 +00001585 int byte = (int)(PyBytes_AS_STRING(((PyUnicodeErrorObject *)self)->object)[uself->start]&0xff);
Eric Smith0facd772010-02-24 15:42:29 +00001586 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00001587 "'%U' codec can't decode byte 0x%02x in position %zd: %U",
Eric Smith0facd772010-02-24 15:42:29 +00001588 encoding_str,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001589 byte,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001590 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00001591 reason_str);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001592 }
Eric Smith0facd772010-02-24 15:42:29 +00001593 else {
1594 result = PyUnicode_FromFormat(
1595 "'%U' codec can't decode bytes in position %zd-%zd: %U",
1596 encoding_str,
1597 uself->start,
1598 uself->end-1,
1599 reason_str
1600 );
1601 }
1602done:
1603 Py_XDECREF(reason_str);
1604 Py_XDECREF(encoding_str);
1605 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001606}
1607
1608static PyTypeObject _PyExc_UnicodeDecodeError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001609 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00001610 "UnicodeDecodeError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00001611 sizeof(PyUnicodeErrorObject), 0,
1612 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1613 (reprfunc)UnicodeDecodeError_str, 0, 0, 0,
1614 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001615 PyDoc_STR("Unicode decoding error."), (traverseproc)UnicodeError_traverse,
1616 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001617 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001618 (initproc)UnicodeDecodeError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001619};
1620PyObject *PyExc_UnicodeDecodeError = (PyObject *)&_PyExc_UnicodeDecodeError;
1621
1622PyObject *
1623PyUnicodeDecodeError_Create(
1624 const char *encoding, const char *object, Py_ssize_t length,
1625 Py_ssize_t start, Py_ssize_t end, const char *reason)
1626{
Victor Stinner7eeb5b52010-06-07 19:57:46 +00001627 return PyObject_CallFunction(PyExc_UnicodeDecodeError, "sy#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001628 encoding, object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001629}
1630
1631
1632/*
1633 * UnicodeTranslateError extends UnicodeError
1634 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001635
1636static int
1637UnicodeTranslateError_init(PyUnicodeErrorObject *self, PyObject *args,
1638 PyObject *kwds)
1639{
1640 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1641 return -1;
1642
1643 Py_CLEAR(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001644 Py_CLEAR(self->reason);
1645
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001646 if (!PyArg_ParseTuple(args, "O!nnO!",
Thomas Wouters477c8d52006-05-27 19:21:47 +00001647 &PyUnicode_Type, &self->object,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001648 &self->start,
1649 &self->end,
Walter Dörwaldd2034312007-05-18 16:29:38 +00001650 &PyUnicode_Type, &self->reason)) {
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001651 self->object = self->reason = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001652 return -1;
1653 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001654
Thomas Wouters477c8d52006-05-27 19:21:47 +00001655 Py_INCREF(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001656 Py_INCREF(self->reason);
1657
1658 return 0;
1659}
1660
1661
1662static PyObject *
1663UnicodeTranslateError_str(PyObject *self)
1664{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001665 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00001666 PyObject *result = NULL;
1667 PyObject *reason_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001668
Eric Smith0facd772010-02-24 15:42:29 +00001669 /* Get reason as a string, which it might not be if it's been
1670 modified after we were contructed. */
1671 reason_str = PyObject_Str(uself->reason);
1672 if (reason_str == NULL)
1673 goto done;
1674
1675 if (uself->start < PyUnicode_GET_SIZE(uself->object) && uself->end == uself->start+1) {
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001676 int badchar = (int)PyUnicode_AS_UNICODE(uself->object)[uself->start];
Walter Dörwald787b03b2007-06-05 13:29:29 +00001677 const char *fmt;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001678 if (badchar <= 0xff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00001679 fmt = "can't translate character '\\x%02x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001680 else if (badchar <= 0xffff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00001681 fmt = "can't translate character '\\u%04x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001682 else
Walter Dörwald32a4c712007-06-20 09:25:34 +00001683 fmt = "can't translate character '\\U%08x' in position %zd: %U";
Benjamin Petersonc5f4e1e2010-02-25 01:22:28 +00001684 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00001685 fmt,
1686 badchar,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001687 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00001688 reason_str
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001689 );
Eric Smith0facd772010-02-24 15:42:29 +00001690 } else {
1691 result = PyUnicode_FromFormat(
1692 "can't translate characters in position %zd-%zd: %U",
1693 uself->start,
1694 uself->end-1,
1695 reason_str
1696 );
Thomas Wouters477c8d52006-05-27 19:21:47 +00001697 }
Eric Smith0facd772010-02-24 15:42:29 +00001698done:
1699 Py_XDECREF(reason_str);
1700 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001701}
1702
1703static PyTypeObject _PyExc_UnicodeTranslateError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001704 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00001705 "UnicodeTranslateError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00001706 sizeof(PyUnicodeErrorObject), 0,
1707 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1708 (reprfunc)UnicodeTranslateError_str, 0, 0, 0,
1709 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters89f507f2006-12-13 04:49:30 +00001710 PyDoc_STR("Unicode translation error."), (traverseproc)UnicodeError_traverse,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001711 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
1712 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001713 (initproc)UnicodeTranslateError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001714};
1715PyObject *PyExc_UnicodeTranslateError = (PyObject *)&_PyExc_UnicodeTranslateError;
1716
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001717/* Deprecated. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001718PyObject *
1719PyUnicodeTranslateError_Create(
1720 const Py_UNICODE *object, Py_ssize_t length,
1721 Py_ssize_t start, Py_ssize_t end, const char *reason)
1722{
1723 return PyObject_CallFunction(PyExc_UnicodeTranslateError, "u#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001724 object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001725}
Thomas Wouters477c8d52006-05-27 19:21:47 +00001726
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001727PyObject *
1728_PyUnicodeTranslateError_Create(
1729 PyObject *object,
1730 Py_ssize_t start, Py_ssize_t end, const char *reason)
1731{
1732 return PyObject_CallFunction(PyExc_UnicodeTranslateError, "Ons",
1733 object, start, end, reason);
1734}
Thomas Wouters477c8d52006-05-27 19:21:47 +00001735
1736/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001737 * AssertionError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001738 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001739SimpleExtendsException(PyExc_Exception, AssertionError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001740 "Assertion failed.");
1741
1742
1743/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001744 * ArithmeticError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001745 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001746SimpleExtendsException(PyExc_Exception, ArithmeticError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001747 "Base class for arithmetic errors.");
1748
1749
1750/*
1751 * FloatingPointError extends ArithmeticError
1752 */
1753SimpleExtendsException(PyExc_ArithmeticError, FloatingPointError,
1754 "Floating point operation failed.");
1755
1756
1757/*
1758 * OverflowError extends ArithmeticError
1759 */
1760SimpleExtendsException(PyExc_ArithmeticError, OverflowError,
1761 "Result too large to be represented.");
1762
1763
1764/*
1765 * ZeroDivisionError extends ArithmeticError
1766 */
1767SimpleExtendsException(PyExc_ArithmeticError, ZeroDivisionError,
1768 "Second argument to a division or modulo operation was zero.");
1769
1770
1771/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001772 * SystemError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001773 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001774SimpleExtendsException(PyExc_Exception, SystemError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001775 "Internal error in the Python interpreter.\n"
1776 "\n"
1777 "Please report this to the Python maintainer, along with the traceback,\n"
1778 "the Python version, and the hardware/OS platform and version.");
1779
1780
1781/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001782 * ReferenceError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001783 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001784SimpleExtendsException(PyExc_Exception, ReferenceError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001785 "Weak ref proxy used after referent went away.");
1786
1787
1788/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001789 * MemoryError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001790 */
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00001791
1792#define MEMERRORS_SAVE 16
1793static PyBaseExceptionObject *memerrors_freelist = NULL;
1794static int memerrors_numfree = 0;
1795
1796static PyObject *
1797MemoryError_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1798{
1799 PyBaseExceptionObject *self;
1800
1801 if (type != (PyTypeObject *) PyExc_MemoryError)
1802 return BaseException_new(type, args, kwds);
1803 if (memerrors_freelist == NULL)
1804 return BaseException_new(type, args, kwds);
1805 /* Fetch object from freelist and revive it */
1806 self = memerrors_freelist;
1807 self->args = PyTuple_New(0);
1808 /* This shouldn't happen since the empty tuple is persistent */
1809 if (self->args == NULL)
1810 return NULL;
1811 memerrors_freelist = (PyBaseExceptionObject *) self->dict;
1812 memerrors_numfree--;
1813 self->dict = NULL;
1814 _Py_NewReference((PyObject *)self);
1815 _PyObject_GC_TRACK(self);
1816 return (PyObject *)self;
1817}
1818
1819static void
1820MemoryError_dealloc(PyBaseExceptionObject *self)
1821{
1822 _PyObject_GC_UNTRACK(self);
1823 BaseException_clear(self);
1824 if (memerrors_numfree >= MEMERRORS_SAVE)
1825 Py_TYPE(self)->tp_free((PyObject *)self);
1826 else {
1827 self->dict = (PyObject *) memerrors_freelist;
1828 memerrors_freelist = self;
1829 memerrors_numfree++;
1830 }
1831}
1832
1833static void
1834preallocate_memerrors(void)
1835{
1836 /* We create enough MemoryErrors and then decref them, which will fill
1837 up the freelist. */
1838 int i;
1839 PyObject *errors[MEMERRORS_SAVE];
1840 for (i = 0; i < MEMERRORS_SAVE; i++) {
1841 errors[i] = MemoryError_new((PyTypeObject *) PyExc_MemoryError,
1842 NULL, NULL);
1843 if (!errors[i])
1844 Py_FatalError("Could not preallocate MemoryError object");
1845 }
1846 for (i = 0; i < MEMERRORS_SAVE; i++) {
1847 Py_DECREF(errors[i]);
1848 }
1849}
1850
1851static void
1852free_preallocated_memerrors(void)
1853{
1854 while (memerrors_freelist != NULL) {
1855 PyObject *self = (PyObject *) memerrors_freelist;
1856 memerrors_freelist = (PyBaseExceptionObject *) memerrors_freelist->dict;
1857 Py_TYPE(self)->tp_free((PyObject *)self);
1858 }
1859}
1860
1861
1862static PyTypeObject _PyExc_MemoryError = {
1863 PyVarObject_HEAD_INIT(NULL, 0)
1864 "MemoryError",
1865 sizeof(PyBaseExceptionObject),
1866 0, (destructor)MemoryError_dealloc, 0, 0, 0, 0, 0, 0, 0,
1867 0, 0, 0, 0, 0, 0, 0,
1868 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
1869 PyDoc_STR("Out of memory."), (traverseproc)BaseException_traverse,
1870 (inquiry)BaseException_clear, 0, 0, 0, 0, 0, 0, 0, &_PyExc_Exception,
1871 0, 0, 0, offsetof(PyBaseExceptionObject, dict),
1872 (initproc)BaseException_init, 0, MemoryError_new
1873};
1874PyObject *PyExc_MemoryError = (PyObject *) &_PyExc_MemoryError;
1875
Thomas Wouters477c8d52006-05-27 19:21:47 +00001876
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001877/*
1878 * BufferError extends Exception
1879 */
1880SimpleExtendsException(PyExc_Exception, BufferError, "Buffer error.");
1881
Thomas Wouters477c8d52006-05-27 19:21:47 +00001882
1883/* Warning category docstrings */
1884
1885/*
1886 * Warning extends Exception
1887 */
1888SimpleExtendsException(PyExc_Exception, Warning,
1889 "Base class for warning categories.");
1890
1891
1892/*
1893 * UserWarning extends Warning
1894 */
1895SimpleExtendsException(PyExc_Warning, UserWarning,
1896 "Base class for warnings generated by user code.");
1897
1898
1899/*
1900 * DeprecationWarning extends Warning
1901 */
1902SimpleExtendsException(PyExc_Warning, DeprecationWarning,
1903 "Base class for warnings about deprecated features.");
1904
1905
1906/*
1907 * PendingDeprecationWarning extends Warning
1908 */
1909SimpleExtendsException(PyExc_Warning, PendingDeprecationWarning,
1910 "Base class for warnings about features which will be deprecated\n"
1911 "in the future.");
1912
1913
1914/*
1915 * SyntaxWarning extends Warning
1916 */
1917SimpleExtendsException(PyExc_Warning, SyntaxWarning,
1918 "Base class for warnings about dubious syntax.");
1919
1920
1921/*
1922 * RuntimeWarning extends Warning
1923 */
1924SimpleExtendsException(PyExc_Warning, RuntimeWarning,
1925 "Base class for warnings about dubious runtime behavior.");
1926
1927
1928/*
1929 * FutureWarning extends Warning
1930 */
1931SimpleExtendsException(PyExc_Warning, FutureWarning,
1932 "Base class for warnings about constructs that will change semantically\n"
1933 "in the future.");
1934
1935
1936/*
1937 * ImportWarning extends Warning
1938 */
1939SimpleExtendsException(PyExc_Warning, ImportWarning,
1940 "Base class for warnings about probable mistakes in module imports");
1941
1942
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001943/*
1944 * UnicodeWarning extends Warning
1945 */
1946SimpleExtendsException(PyExc_Warning, UnicodeWarning,
1947 "Base class for warnings about Unicode related problems, mostly\n"
1948 "related to conversion problems.");
1949
Georg Brandl08be72d2010-10-24 15:11:22 +00001950
Guido van Rossum98297ee2007-11-06 21:34:58 +00001951/*
1952 * BytesWarning extends Warning
1953 */
1954SimpleExtendsException(PyExc_Warning, BytesWarning,
1955 "Base class for warnings about bytes and buffer related problems, mostly\n"
1956 "related to conversion from str or comparing to str.");
1957
1958
Georg Brandl08be72d2010-10-24 15:11:22 +00001959/*
1960 * ResourceWarning extends Warning
1961 */
1962SimpleExtendsException(PyExc_Warning, ResourceWarning,
1963 "Base class for warnings about resource usage.");
1964
1965
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001966
Thomas Wouters89d996e2007-09-08 17:39:28 +00001967/* Pre-computed RuntimeError instance for when recursion depth is reached.
1968 Meant to be used when normalizing the exception for exceeding the recursion
1969 depth will cause its own infinite recursion.
1970*/
1971PyObject *PyExc_RecursionErrorInst = NULL;
1972
Thomas Wouters477c8d52006-05-27 19:21:47 +00001973#define PRE_INIT(TYPE) if (PyType_Ready(&_PyExc_ ## TYPE) < 0) \
1974 Py_FatalError("exceptions bootstrapping error.");
1975
1976#define POST_INIT(TYPE) Py_INCREF(PyExc_ ## TYPE); \
Thomas Wouters477c8d52006-05-27 19:21:47 +00001977 if (PyDict_SetItemString(bdict, # TYPE, PyExc_ ## TYPE)) \
1978 Py_FatalError("Module dictionary insertion problem.");
1979
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001980
Martin v. Löwis1a214512008-06-11 05:26:20 +00001981void
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001982_PyExc_Init(void)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001983{
Neal Norwitz2633c692007-02-26 22:22:47 +00001984 PyObject *bltinmod, *bdict;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001985
1986 PRE_INIT(BaseException)
1987 PRE_INIT(Exception)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001988 PRE_INIT(TypeError)
1989 PRE_INIT(StopIteration)
1990 PRE_INIT(GeneratorExit)
1991 PRE_INIT(SystemExit)
1992 PRE_INIT(KeyboardInterrupt)
1993 PRE_INIT(ImportError)
1994 PRE_INIT(EnvironmentError)
1995 PRE_INIT(IOError)
1996 PRE_INIT(OSError)
1997#ifdef MS_WINDOWS
1998 PRE_INIT(WindowsError)
1999#endif
2000#ifdef __VMS
2001 PRE_INIT(VMSError)
2002#endif
2003 PRE_INIT(EOFError)
2004 PRE_INIT(RuntimeError)
2005 PRE_INIT(NotImplementedError)
2006 PRE_INIT(NameError)
2007 PRE_INIT(UnboundLocalError)
2008 PRE_INIT(AttributeError)
2009 PRE_INIT(SyntaxError)
2010 PRE_INIT(IndentationError)
2011 PRE_INIT(TabError)
2012 PRE_INIT(LookupError)
2013 PRE_INIT(IndexError)
2014 PRE_INIT(KeyError)
2015 PRE_INIT(ValueError)
2016 PRE_INIT(UnicodeError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002017 PRE_INIT(UnicodeEncodeError)
2018 PRE_INIT(UnicodeDecodeError)
2019 PRE_INIT(UnicodeTranslateError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002020 PRE_INIT(AssertionError)
2021 PRE_INIT(ArithmeticError)
2022 PRE_INIT(FloatingPointError)
2023 PRE_INIT(OverflowError)
2024 PRE_INIT(ZeroDivisionError)
2025 PRE_INIT(SystemError)
2026 PRE_INIT(ReferenceError)
Neal Norwitzfaa54a32007-08-19 04:23:20 +00002027 PRE_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002028 PRE_INIT(MemoryError)
Benjamin Peterson2b968d62008-07-05 23:38:30 +00002029 PRE_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002030 PRE_INIT(Warning)
2031 PRE_INIT(UserWarning)
2032 PRE_INIT(DeprecationWarning)
2033 PRE_INIT(PendingDeprecationWarning)
2034 PRE_INIT(SyntaxWarning)
2035 PRE_INIT(RuntimeWarning)
2036 PRE_INIT(FutureWarning)
2037 PRE_INIT(ImportWarning)
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002038 PRE_INIT(UnicodeWarning)
Guido van Rossum98297ee2007-11-06 21:34:58 +00002039 PRE_INIT(BytesWarning)
Georg Brandl08be72d2010-10-24 15:11:22 +00002040 PRE_INIT(ResourceWarning)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002041
Georg Brandl1a3284e2007-12-02 09:40:06 +00002042 bltinmod = PyImport_ImportModule("builtins");
Thomas Wouters477c8d52006-05-27 19:21:47 +00002043 if (bltinmod == NULL)
2044 Py_FatalError("exceptions bootstrapping error.");
2045 bdict = PyModule_GetDict(bltinmod);
2046 if (bdict == NULL)
2047 Py_FatalError("exceptions bootstrapping error.");
2048
2049 POST_INIT(BaseException)
2050 POST_INIT(Exception)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002051 POST_INIT(TypeError)
2052 POST_INIT(StopIteration)
2053 POST_INIT(GeneratorExit)
2054 POST_INIT(SystemExit)
2055 POST_INIT(KeyboardInterrupt)
2056 POST_INIT(ImportError)
2057 POST_INIT(EnvironmentError)
2058 POST_INIT(IOError)
2059 POST_INIT(OSError)
2060#ifdef MS_WINDOWS
2061 POST_INIT(WindowsError)
2062#endif
2063#ifdef __VMS
2064 POST_INIT(VMSError)
2065#endif
2066 POST_INIT(EOFError)
2067 POST_INIT(RuntimeError)
2068 POST_INIT(NotImplementedError)
2069 POST_INIT(NameError)
2070 POST_INIT(UnboundLocalError)
2071 POST_INIT(AttributeError)
2072 POST_INIT(SyntaxError)
2073 POST_INIT(IndentationError)
2074 POST_INIT(TabError)
2075 POST_INIT(LookupError)
2076 POST_INIT(IndexError)
2077 POST_INIT(KeyError)
2078 POST_INIT(ValueError)
2079 POST_INIT(UnicodeError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002080 POST_INIT(UnicodeEncodeError)
2081 POST_INIT(UnicodeDecodeError)
2082 POST_INIT(UnicodeTranslateError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002083 POST_INIT(AssertionError)
2084 POST_INIT(ArithmeticError)
2085 POST_INIT(FloatingPointError)
2086 POST_INIT(OverflowError)
2087 POST_INIT(ZeroDivisionError)
2088 POST_INIT(SystemError)
2089 POST_INIT(ReferenceError)
Neal Norwitzfaa54a32007-08-19 04:23:20 +00002090 POST_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002091 POST_INIT(MemoryError)
Benjamin Peterson2b968d62008-07-05 23:38:30 +00002092 POST_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002093 POST_INIT(Warning)
2094 POST_INIT(UserWarning)
2095 POST_INIT(DeprecationWarning)
2096 POST_INIT(PendingDeprecationWarning)
2097 POST_INIT(SyntaxWarning)
2098 POST_INIT(RuntimeWarning)
2099 POST_INIT(FutureWarning)
2100 POST_INIT(ImportWarning)
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002101 POST_INIT(UnicodeWarning)
Guido van Rossum98297ee2007-11-06 21:34:58 +00002102 POST_INIT(BytesWarning)
Georg Brandl08be72d2010-10-24 15:11:22 +00002103 POST_INIT(ResourceWarning)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002104
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002105 preallocate_memerrors();
Thomas Wouters477c8d52006-05-27 19:21:47 +00002106
Thomas Wouters89d996e2007-09-08 17:39:28 +00002107 PyExc_RecursionErrorInst = BaseException_new(&_PyExc_RuntimeError, NULL, NULL);
2108 if (!PyExc_RecursionErrorInst)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002109 Py_FatalError("Cannot pre-allocate RuntimeError instance for "
2110 "recursion errors");
Thomas Wouters89d996e2007-09-08 17:39:28 +00002111 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002112 PyBaseExceptionObject *err_inst =
2113 (PyBaseExceptionObject *)PyExc_RecursionErrorInst;
2114 PyObject *args_tuple;
2115 PyObject *exc_message;
2116 exc_message = PyUnicode_FromString("maximum recursion depth exceeded");
2117 if (!exc_message)
2118 Py_FatalError("cannot allocate argument for RuntimeError "
2119 "pre-allocation");
2120 args_tuple = PyTuple_Pack(1, exc_message);
2121 if (!args_tuple)
2122 Py_FatalError("cannot allocate tuple for RuntimeError "
2123 "pre-allocation");
2124 Py_DECREF(exc_message);
2125 if (BaseException_init(err_inst, args_tuple, NULL))
2126 Py_FatalError("init of pre-allocated RuntimeError failed");
2127 Py_DECREF(args_tuple);
Thomas Wouters89d996e2007-09-08 17:39:28 +00002128 }
2129
Thomas Wouters477c8d52006-05-27 19:21:47 +00002130 Py_DECREF(bltinmod);
2131}
2132
2133void
2134_PyExc_Fini(void)
2135{
Benjamin Peterson78565b22009-06-28 19:19:51 +00002136 Py_CLEAR(PyExc_RecursionErrorInst);
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002137 free_preallocated_memerrors();
Thomas Wouters477c8d52006-05-27 19:21:47 +00002138}