blob: 35a8b66e01265f9473569eb9ba196b6483a98b77 [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
Antoine Pitrou6b4883d2011-10-12 02:54:14 +020013/* Compatibility aliases */
14PyObject *PyExc_EnvironmentError = NULL;
15PyObject *PyExc_IOError = NULL;
16#ifdef MS_WINDOWS
17PyObject *PyExc_WindowsError = NULL;
18#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +020019
20/* The dict map from errno codes to OSError subclasses */
21static PyObject *errnomap = NULL;
22
23
Thomas Wouters477c8d52006-05-27 19:21:47 +000024/* NOTE: If the exception class hierarchy changes, don't forget to update
25 * Lib/test/exception_hierarchy.txt
26 */
27
Thomas Wouters477c8d52006-05-27 19:21:47 +000028/*
29 * BaseException
30 */
31static PyObject *
32BaseException_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
33{
34 PyBaseExceptionObject *self;
35
36 self = (PyBaseExceptionObject *)type->tp_alloc(type, 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +000037 if (!self)
38 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +000039 /* the dict is created on the fly in PyObject_GenericSetAttr */
Guido van Rossumebe3e162007-05-17 18:20:34 +000040 self->dict = NULL;
Collin Winter1966f1c2007-09-01 20:26:44 +000041 self->traceback = self->cause = self->context = NULL;
Benjamin Petersond5a1c442012-05-14 22:09:31 -070042 self->suppress_context = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +000043
Richard Oudkerk5562d9d2012-07-28 17:45:28 +010044 if (args) {
45 self->args = args;
46 Py_INCREF(args);
47 return (PyObject *)self;
48 }
49
Thomas Wouters477c8d52006-05-27 19:21:47 +000050 self->args = PyTuple_New(0);
51 if (!self->args) {
52 Py_DECREF(self);
53 return NULL;
54 }
55
Thomas Wouters477c8d52006-05-27 19:21:47 +000056 return (PyObject *)self;
57}
58
59static int
60BaseException_init(PyBaseExceptionObject *self, PyObject *args, PyObject *kwds)
61{
Christian Heimes90aa7642007-12-19 02:45:37 +000062 if (!_PyArg_NoKeywords(Py_TYPE(self)->tp_name, kwds))
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000063 return -1;
64
Serhiy Storchaka576f1322016-01-05 21:27:54 +020065 Py_INCREF(args);
Serhiy Storchakaec397562016-04-06 09:50:03 +030066 Py_XSETREF(self->args, args);
Thomas Wouters477c8d52006-05-27 19:21:47 +000067
Thomas Wouters477c8d52006-05-27 19:21:47 +000068 return 0;
69}
70
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000071static int
Thomas Wouters477c8d52006-05-27 19:21:47 +000072BaseException_clear(PyBaseExceptionObject *self)
73{
74 Py_CLEAR(self->dict);
75 Py_CLEAR(self->args);
Collin Winter828f04a2007-08-31 00:04:24 +000076 Py_CLEAR(self->traceback);
Collin Winter1966f1c2007-09-01 20:26:44 +000077 Py_CLEAR(self->cause);
78 Py_CLEAR(self->context);
Thomas Wouters477c8d52006-05-27 19:21:47 +000079 return 0;
80}
81
82static void
83BaseException_dealloc(PyBaseExceptionObject *self)
84{
Thomas Wouters89f507f2006-12-13 04:49:30 +000085 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +000086 BaseException_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +000087 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +000088}
89
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000090static int
Thomas Wouters477c8d52006-05-27 19:21:47 +000091BaseException_traverse(PyBaseExceptionObject *self, visitproc visit, void *arg)
92{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000093 Py_VISIT(self->dict);
Thomas Wouters477c8d52006-05-27 19:21:47 +000094 Py_VISIT(self->args);
Collin Winter828f04a2007-08-31 00:04:24 +000095 Py_VISIT(self->traceback);
Collin Winter1966f1c2007-09-01 20:26:44 +000096 Py_VISIT(self->cause);
97 Py_VISIT(self->context);
Thomas Wouters477c8d52006-05-27 19:21:47 +000098 return 0;
99}
100
101static PyObject *
102BaseException_str(PyBaseExceptionObject *self)
103{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000104 switch (PyTuple_GET_SIZE(self->args)) {
Thomas Wouters477c8d52006-05-27 19:21:47 +0000105 case 0:
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +0000106 return PyUnicode_FromString("");
Thomas Wouters477c8d52006-05-27 19:21:47 +0000107 case 1:
Thomas Heller519a0422007-11-15 20:48:54 +0000108 return PyObject_Str(PyTuple_GET_ITEM(self->args, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +0000109 default:
Thomas Heller519a0422007-11-15 20:48:54 +0000110 return PyObject_Str(self->args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000111 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000112}
113
114static PyObject *
115BaseException_repr(PyBaseExceptionObject *self)
116{
Serhiy Storchakac6792272013-10-19 21:03:34 +0300117 const char *name;
118 const char *dot;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000119
Serhiy Storchakac6792272013-10-19 21:03:34 +0300120 name = Py_TYPE(self)->tp_name;
121 dot = (const char *) strrchr(name, '.');
Thomas Wouters477c8d52006-05-27 19:21:47 +0000122 if (dot != NULL) name = dot+1;
123
Walter Dörwald7569dfe2007-05-19 21:49:49 +0000124 return PyUnicode_FromFormat("%s%R", name, self->args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000125}
126
127/* Pickling support */
128static PyObject *
129BaseException_reduce(PyBaseExceptionObject *self)
130{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000131 if (self->args && self->dict)
Christian Heimes90aa7642007-12-19 02:45:37 +0000132 return PyTuple_Pack(3, Py_TYPE(self), self->args, self->dict);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000133 else
Christian Heimes90aa7642007-12-19 02:45:37 +0000134 return PyTuple_Pack(2, Py_TYPE(self), self->args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000135}
136
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000137/*
138 * Needed for backward compatibility, since exceptions used to store
139 * all their attributes in the __dict__. Code is taken from cPickle's
140 * load_build function.
141 */
142static PyObject *
143BaseException_setstate(PyObject *self, PyObject *state)
144{
145 PyObject *d_key, *d_value;
146 Py_ssize_t i = 0;
147
148 if (state != Py_None) {
149 if (!PyDict_Check(state)) {
150 PyErr_SetString(PyExc_TypeError, "state is not a dictionary");
151 return NULL;
152 }
153 while (PyDict_Next(state, &i, &d_key, &d_value)) {
154 if (PyObject_SetAttr(self, d_key, d_value) < 0)
155 return NULL;
156 }
157 }
158 Py_RETURN_NONE;
159}
Thomas Wouters477c8d52006-05-27 19:21:47 +0000160
Collin Winter828f04a2007-08-31 00:04:24 +0000161static PyObject *
162BaseException_with_traceback(PyObject *self, PyObject *tb) {
163 if (PyException_SetTraceback(self, tb))
164 return NULL;
165
166 Py_INCREF(self);
167 return self;
168}
169
Georg Brandl76941002008-05-05 21:38:47 +0000170PyDoc_STRVAR(with_traceback_doc,
171"Exception.with_traceback(tb) --\n\
172 set self.__traceback__ to tb and return self.");
173
Thomas Wouters477c8d52006-05-27 19:21:47 +0000174
175static PyMethodDef BaseException_methods[] = {
176 {"__reduce__", (PyCFunction)BaseException_reduce, METH_NOARGS },
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000177 {"__setstate__", (PyCFunction)BaseException_setstate, METH_O },
Georg Brandl76941002008-05-05 21:38:47 +0000178 {"with_traceback", (PyCFunction)BaseException_with_traceback, METH_O,
179 with_traceback_doc},
Thomas Wouters477c8d52006-05-27 19:21:47 +0000180 {NULL, NULL, 0, NULL},
181};
182
Thomas Wouters477c8d52006-05-27 19:21:47 +0000183static PyObject *
184BaseException_get_args(PyBaseExceptionObject *self)
185{
186 if (self->args == NULL) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200187 Py_RETURN_NONE;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000188 }
189 Py_INCREF(self->args);
190 return self->args;
191}
192
193static int
194BaseException_set_args(PyBaseExceptionObject *self, PyObject *val)
195{
196 PyObject *seq;
197 if (val == NULL) {
198 PyErr_SetString(PyExc_TypeError, "args may not be deleted");
199 return -1;
200 }
201 seq = PySequence_Tuple(val);
Benjamin Peterson90b13582012-02-03 19:22:31 -0500202 if (!seq)
203 return -1;
Serhiy Storchaka48842712016-04-06 09:45:48 +0300204 Py_XSETREF(self->args, seq);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000205 return 0;
206}
207
Collin Winter828f04a2007-08-31 00:04:24 +0000208static PyObject *
209BaseException_get_tb(PyBaseExceptionObject *self)
210{
211 if (self->traceback == NULL) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200212 Py_RETURN_NONE;
Collin Winter828f04a2007-08-31 00:04:24 +0000213 }
214 Py_INCREF(self->traceback);
215 return self->traceback;
216}
217
218static int
219BaseException_set_tb(PyBaseExceptionObject *self, PyObject *tb)
220{
221 if (tb == NULL) {
222 PyErr_SetString(PyExc_TypeError, "__traceback__ may not be deleted");
223 return -1;
224 }
225 else if (!(tb == Py_None || PyTraceBack_Check(tb))) {
226 PyErr_SetString(PyExc_TypeError,
227 "__traceback__ must be a traceback or None");
228 return -1;
229 }
230
Serhiy Storchaka37665722016-08-20 21:22:03 +0300231 Py_INCREF(tb);
Serhiy Storchaka48842712016-04-06 09:45:48 +0300232 Py_XSETREF(self->traceback, tb);
Collin Winter828f04a2007-08-31 00:04:24 +0000233 return 0;
234}
235
Georg Brandlab6f2f62009-03-31 04:16:10 +0000236static PyObject *
237BaseException_get_context(PyObject *self) {
238 PyObject *res = PyException_GetContext(self);
Benjamin Peterson90b13582012-02-03 19:22:31 -0500239 if (res)
240 return res; /* new reference already returned above */
Georg Brandlab6f2f62009-03-31 04:16:10 +0000241 Py_RETURN_NONE;
242}
243
244static int
245BaseException_set_context(PyObject *self, PyObject *arg) {
246 if (arg == NULL) {
247 PyErr_SetString(PyExc_TypeError, "__context__ may not be deleted");
248 return -1;
249 } else if (arg == Py_None) {
250 arg = NULL;
251 } else if (!PyExceptionInstance_Check(arg)) {
252 PyErr_SetString(PyExc_TypeError, "exception context must be None "
253 "or derive from BaseException");
254 return -1;
255 } else {
256 /* PyException_SetContext steals this reference */
257 Py_INCREF(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000258 }
Georg Brandlab6f2f62009-03-31 04:16:10 +0000259 PyException_SetContext(self, arg);
260 return 0;
261}
262
263static PyObject *
264BaseException_get_cause(PyObject *self) {
265 PyObject *res = PyException_GetCause(self);
Benjamin Peterson90b13582012-02-03 19:22:31 -0500266 if (res)
267 return res; /* new reference already returned above */
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700268 Py_RETURN_NONE;
Georg Brandlab6f2f62009-03-31 04:16:10 +0000269}
270
271static int
272BaseException_set_cause(PyObject *self, PyObject *arg) {
273 if (arg == NULL) {
274 PyErr_SetString(PyExc_TypeError, "__cause__ may not be deleted");
275 return -1;
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700276 } else if (arg == Py_None) {
277 arg = NULL;
278 } else if (!PyExceptionInstance_Check(arg)) {
279 PyErr_SetString(PyExc_TypeError, "exception cause must be None "
280 "or derive from BaseException");
281 return -1;
282 } else {
283 /* PyException_SetCause steals this reference */
284 Py_INCREF(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000285 }
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700286 PyException_SetCause(self, arg);
287 return 0;
Georg Brandlab6f2f62009-03-31 04:16:10 +0000288}
289
Guido van Rossum360e4b82007-05-14 22:51:27 +0000290
Thomas Wouters477c8d52006-05-27 19:21:47 +0000291static PyGetSetDef BaseException_getset[] = {
Benjamin Peterson23d7f122012-02-19 20:02:57 -0500292 {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict},
Thomas Wouters477c8d52006-05-27 19:21:47 +0000293 {"args", (getter)BaseException_get_args, (setter)BaseException_set_args},
Collin Winter828f04a2007-08-31 00:04:24 +0000294 {"__traceback__", (getter)BaseException_get_tb, (setter)BaseException_set_tb},
Georg Brandlab6f2f62009-03-31 04:16:10 +0000295 {"__context__", (getter)BaseException_get_context,
296 (setter)BaseException_set_context, PyDoc_STR("exception context")},
297 {"__cause__", (getter)BaseException_get_cause,
298 (setter)BaseException_set_cause, PyDoc_STR("exception cause")},
Thomas Wouters477c8d52006-05-27 19:21:47 +0000299 {NULL},
300};
301
302
Collin Winter828f04a2007-08-31 00:04:24 +0000303PyObject *
304PyException_GetTraceback(PyObject *self) {
305 PyBaseExceptionObject *base_self = (PyBaseExceptionObject *)self;
306 Py_XINCREF(base_self->traceback);
307 return base_self->traceback;
308}
309
310
311int
312PyException_SetTraceback(PyObject *self, PyObject *tb) {
313 return BaseException_set_tb((PyBaseExceptionObject *)self, tb);
314}
315
316PyObject *
317PyException_GetCause(PyObject *self) {
318 PyObject *cause = ((PyBaseExceptionObject *)self)->cause;
319 Py_XINCREF(cause);
320 return cause;
321}
322
323/* Steals a reference to cause */
324void
Serhiy Storchaka576f1322016-01-05 21:27:54 +0200325PyException_SetCause(PyObject *self, PyObject *cause)
326{
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700327 ((PyBaseExceptionObject *)self)->suppress_context = 1;
Serhiy Storchakaec397562016-04-06 09:50:03 +0300328 Py_XSETREF(((PyBaseExceptionObject *)self)->cause, cause);
Collin Winter828f04a2007-08-31 00:04:24 +0000329}
330
331PyObject *
332PyException_GetContext(PyObject *self) {
333 PyObject *context = ((PyBaseExceptionObject *)self)->context;
334 Py_XINCREF(context);
335 return context;
336}
337
338/* Steals a reference to context */
339void
Serhiy Storchaka576f1322016-01-05 21:27:54 +0200340PyException_SetContext(PyObject *self, PyObject *context)
341{
Serhiy Storchakaec397562016-04-06 09:50:03 +0300342 Py_XSETREF(((PyBaseExceptionObject *)self)->context, context);
Collin Winter828f04a2007-08-31 00:04:24 +0000343}
344
345
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700346static struct PyMemberDef BaseException_members[] = {
347 {"__suppress_context__", T_BOOL,
Antoine Pitrou32bc80c2012-05-16 12:51:55 +0200348 offsetof(PyBaseExceptionObject, suppress_context)},
349 {NULL}
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700350};
351
352
Thomas Wouters477c8d52006-05-27 19:21:47 +0000353static PyTypeObject _PyExc_BaseException = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000354 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +0000355 "BaseException", /*tp_name*/
Thomas Wouters477c8d52006-05-27 19:21:47 +0000356 sizeof(PyBaseExceptionObject), /*tp_basicsize*/
357 0, /*tp_itemsize*/
358 (destructor)BaseException_dealloc, /*tp_dealloc*/
359 0, /*tp_print*/
360 0, /*tp_getattr*/
361 0, /*tp_setattr*/
Mark Dickinsone94c6792009-02-02 20:36:42 +0000362 0, /* tp_reserved; */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000363 (reprfunc)BaseException_repr, /*tp_repr*/
364 0, /*tp_as_number*/
Brett Cannonba7bf492007-02-27 00:15:55 +0000365 0, /*tp_as_sequence*/
Thomas Wouters477c8d52006-05-27 19:21:47 +0000366 0, /*tp_as_mapping*/
367 0, /*tp_hash */
368 0, /*tp_call*/
369 (reprfunc)BaseException_str, /*tp_str*/
370 PyObject_GenericGetAttr, /*tp_getattro*/
371 PyObject_GenericSetAttr, /*tp_setattro*/
372 0, /*tp_as_buffer*/
Thomas Wouters27d517b2007-02-25 20:39:11 +0000373 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC |
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000374 Py_TPFLAGS_BASE_EXC_SUBCLASS, /*tp_flags*/
Thomas Wouters477c8d52006-05-27 19:21:47 +0000375 PyDoc_STR("Common base class for all exceptions"), /* tp_doc */
376 (traverseproc)BaseException_traverse, /* tp_traverse */
377 (inquiry)BaseException_clear, /* tp_clear */
378 0, /* tp_richcompare */
379 0, /* tp_weaklistoffset */
380 0, /* tp_iter */
381 0, /* tp_iternext */
382 BaseException_methods, /* tp_methods */
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700383 BaseException_members, /* tp_members */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000384 BaseException_getset, /* tp_getset */
385 0, /* tp_base */
386 0, /* tp_dict */
387 0, /* tp_descr_get */
388 0, /* tp_descr_set */
389 offsetof(PyBaseExceptionObject, dict), /* tp_dictoffset */
390 (initproc)BaseException_init, /* tp_init */
391 0, /* tp_alloc */
392 BaseException_new, /* tp_new */
393};
394/* the CPython API expects exceptions to be (PyObject *) - both a hold-over
395from the previous implmentation and also allowing Python objects to be used
396in the API */
397PyObject *PyExc_BaseException = (PyObject *)&_PyExc_BaseException;
398
399/* note these macros omit the last semicolon so the macro invocation may
400 * include it and not look strange.
401 */
402#define SimpleExtendsException(EXCBASE, EXCNAME, EXCDOC) \
403static PyTypeObject _PyExc_ ## EXCNAME = { \
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000404 PyVarObject_HEAD_INIT(NULL, 0) \
Neal Norwitz2633c692007-02-26 22:22:47 +0000405 # EXCNAME, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000406 sizeof(PyBaseExceptionObject), \
407 0, (destructor)BaseException_dealloc, 0, 0, 0, 0, 0, 0, 0, \
408 0, 0, 0, 0, 0, 0, 0, \
409 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
410 PyDoc_STR(EXCDOC), (traverseproc)BaseException_traverse, \
411 (inquiry)BaseException_clear, 0, 0, 0, 0, 0, 0, 0, &_ ## EXCBASE, \
412 0, 0, 0, offsetof(PyBaseExceptionObject, dict), \
413 (initproc)BaseException_init, 0, BaseException_new,\
414}; \
415PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
416
417#define MiddlingExtendsException(EXCBASE, EXCNAME, EXCSTORE, EXCDOC) \
418static PyTypeObject _PyExc_ ## EXCNAME = { \
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000419 PyVarObject_HEAD_INIT(NULL, 0) \
Neal Norwitz2633c692007-02-26 22:22:47 +0000420 # EXCNAME, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000421 sizeof(Py ## EXCSTORE ## Object), \
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000422 0, (destructor)EXCSTORE ## _dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000423 0, 0, 0, 0, 0, \
424 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000425 PyDoc_STR(EXCDOC), (traverseproc)EXCSTORE ## _traverse, \
426 (inquiry)EXCSTORE ## _clear, 0, 0, 0, 0, 0, 0, 0, &_ ## EXCBASE, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000427 0, 0, 0, offsetof(Py ## EXCSTORE ## Object, dict), \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200428 (initproc)EXCSTORE ## _init, 0, 0, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000429}; \
430PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
431
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200432#define ComplexExtendsException(EXCBASE, EXCNAME, EXCSTORE, EXCNEW, \
433 EXCMETHODS, EXCMEMBERS, EXCGETSET, \
434 EXCSTR, EXCDOC) \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000435static PyTypeObject _PyExc_ ## EXCNAME = { \
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000436 PyVarObject_HEAD_INIT(NULL, 0) \
Neal Norwitz2633c692007-02-26 22:22:47 +0000437 # EXCNAME, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000438 sizeof(Py ## EXCSTORE ## Object), 0, \
439 (destructor)EXCSTORE ## _dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
440 (reprfunc)EXCSTR, 0, 0, 0, \
441 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \
442 PyDoc_STR(EXCDOC), (traverseproc)EXCSTORE ## _traverse, \
443 (inquiry)EXCSTORE ## _clear, 0, 0, 0, 0, EXCMETHODS, \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200444 EXCMEMBERS, EXCGETSET, &_ ## EXCBASE, \
Thomas Wouters477c8d52006-05-27 19:21:47 +0000445 0, 0, 0, offsetof(Py ## EXCSTORE ## Object, dict), \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200446 (initproc)EXCSTORE ## _init, 0, EXCNEW,\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000447}; \
448PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME
449
450
451/*
452 * Exception extends BaseException
453 */
454SimpleExtendsException(PyExc_BaseException, Exception,
455 "Common base class for all non-exit exceptions.");
456
457
458/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000459 * TypeError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +0000460 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000461SimpleExtendsException(PyExc_Exception, TypeError,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000462 "Inappropriate argument type.");
463
464
465/*
Yury Selivanov75445082015-05-11 22:57:16 -0400466 * StopAsyncIteration extends Exception
467 */
468SimpleExtendsException(PyExc_Exception, StopAsyncIteration,
469 "Signal the end from iterator.__anext__().");
470
471
472/*
Thomas Wouters477c8d52006-05-27 19:21:47 +0000473 * StopIteration extends Exception
474 */
Nick Coghlan1f7ce622012-01-13 21:43:40 +1000475
476static PyMemberDef StopIteration_members[] = {
477 {"value", T_OBJECT, offsetof(PyStopIterationObject, value), 0,
478 PyDoc_STR("generator return value")},
479 {NULL} /* Sentinel */
480};
481
482static int
483StopIteration_init(PyStopIterationObject *self, PyObject *args, PyObject *kwds)
484{
485 Py_ssize_t size = PyTuple_GET_SIZE(args);
486 PyObject *value;
487
488 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
489 return -1;
490 Py_CLEAR(self->value);
491 if (size > 0)
492 value = PyTuple_GET_ITEM(args, 0);
493 else
494 value = Py_None;
495 Py_INCREF(value);
496 self->value = value;
497 return 0;
498}
499
500static int
501StopIteration_clear(PyStopIterationObject *self)
502{
503 Py_CLEAR(self->value);
504 return BaseException_clear((PyBaseExceptionObject *)self);
505}
506
507static void
508StopIteration_dealloc(PyStopIterationObject *self)
509{
510 _PyObject_GC_UNTRACK(self);
511 StopIteration_clear(self);
512 Py_TYPE(self)->tp_free((PyObject *)self);
513}
514
515static int
516StopIteration_traverse(PyStopIterationObject *self, visitproc visit, void *arg)
517{
518 Py_VISIT(self->value);
519 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
520}
521
Nick Coghlan1f7ce622012-01-13 21:43:40 +1000522ComplexExtendsException(
523 PyExc_Exception, /* base */
524 StopIteration, /* name */
525 StopIteration, /* prefix for *_init, etc */
526 0, /* new */
527 0, /* methods */
528 StopIteration_members, /* members */
529 0, /* getset */
530 0, /* str */
531 "Signal the end from iterator.__next__()."
532);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000533
534
535/*
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000536 * GeneratorExit extends BaseException
Thomas Wouters477c8d52006-05-27 19:21:47 +0000537 */
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000538SimpleExtendsException(PyExc_BaseException, GeneratorExit,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000539 "Request that a generator exit.");
540
541
542/*
543 * SystemExit extends BaseException
544 */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000545
546static int
547SystemExit_init(PySystemExitObject *self, PyObject *args, PyObject *kwds)
548{
549 Py_ssize_t size = PyTuple_GET_SIZE(args);
550
551 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
552 return -1;
553
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000554 if (size == 0)
555 return 0;
Serhiy Storchaka191321d2015-12-27 15:41:34 +0200556 if (size == 1) {
557 Py_INCREF(PyTuple_GET_ITEM(args, 0));
Serhiy Storchaka48842712016-04-06 09:45:48 +0300558 Py_XSETREF(self->code, PyTuple_GET_ITEM(args, 0));
Serhiy Storchaka191321d2015-12-27 15:41:34 +0200559 }
560 else { /* size > 1 */
561 Py_INCREF(args);
Serhiy Storchaka48842712016-04-06 09:45:48 +0300562 Py_XSETREF(self->code, args);
Serhiy Storchaka191321d2015-12-27 15:41:34 +0200563 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000564 return 0;
565}
566
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000567static int
Thomas Wouters477c8d52006-05-27 19:21:47 +0000568SystemExit_clear(PySystemExitObject *self)
569{
570 Py_CLEAR(self->code);
571 return BaseException_clear((PyBaseExceptionObject *)self);
572}
573
574static void
575SystemExit_dealloc(PySystemExitObject *self)
576{
Thomas Wouters89f507f2006-12-13 04:49:30 +0000577 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000578 SystemExit_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +0000579 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000580}
581
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000582static int
Thomas Wouters477c8d52006-05-27 19:21:47 +0000583SystemExit_traverse(PySystemExitObject *self, visitproc visit, void *arg)
584{
585 Py_VISIT(self->code);
586 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
587}
588
589static PyMemberDef SystemExit_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +0000590 {"code", T_OBJECT, offsetof(PySystemExitObject, code), 0,
591 PyDoc_STR("exception code")},
592 {NULL} /* Sentinel */
593};
594
595ComplexExtendsException(PyExc_BaseException, SystemExit, SystemExit,
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200596 0, 0, SystemExit_members, 0, 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000597 "Request to exit from the interpreter.");
598
599/*
600 * KeyboardInterrupt extends BaseException
601 */
602SimpleExtendsException(PyExc_BaseException, KeyboardInterrupt,
603 "Program interrupted by user.");
604
605
606/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000607 * ImportError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +0000608 */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000609
Brett Cannon79ec55e2012-04-12 20:24:54 -0400610static int
611ImportError_init(PyImportErrorObject *self, PyObject *args, PyObject *kwds)
612{
Serhiy Storchaka47dee112016-09-27 20:45:35 +0300613 static char *kwlist[] = {"name", "path", 0};
614 PyObject *empty_tuple;
Brett Cannon79ec55e2012-04-12 20:24:54 -0400615 PyObject *msg = NULL;
616 PyObject *name = NULL;
617 PyObject *path = NULL;
618
Serhiy Storchaka47dee112016-09-27 20:45:35 +0300619 if (BaseException_init((PyBaseExceptionObject *)self, args, NULL) == -1)
Brett Cannon79ec55e2012-04-12 20:24:54 -0400620 return -1;
621
Serhiy Storchaka47dee112016-09-27 20:45:35 +0300622 empty_tuple = PyTuple_New(0);
623 if (!empty_tuple)
624 return -1;
625 if (!PyArg_ParseTupleAndKeywords(empty_tuple, kwds, "|$OO:ImportError", kwlist,
626 &name, &path)) {
627 Py_DECREF(empty_tuple);
628 return -1;
629 }
630 Py_DECREF(empty_tuple);
631
Serhiy Storchakae9e44482016-09-28 07:53:32 +0300632 Py_XINCREF(name);
633 Py_XSETREF(self->name, name);
634
635 Py_XINCREF(path);
636 Py_XSETREF(self->path, path);
637
Serhiy Storchaka47dee112016-09-27 20:45:35 +0300638 if (PyTuple_GET_SIZE(args) == 1) {
639 msg = PyTuple_GET_ITEM(args, 0);
640 Py_INCREF(msg);
Serhiy Storchaka47dee112016-09-27 20:45:35 +0300641 }
Serhiy Storchakae9e44482016-09-28 07:53:32 +0300642 Py_XSETREF(self->msg, msg);
Brett Cannon79ec55e2012-04-12 20:24:54 -0400643
644 return 0;
645}
646
647static int
648ImportError_clear(PyImportErrorObject *self)
649{
650 Py_CLEAR(self->msg);
651 Py_CLEAR(self->name);
652 Py_CLEAR(self->path);
653 return BaseException_clear((PyBaseExceptionObject *)self);
654}
655
656static void
657ImportError_dealloc(PyImportErrorObject *self)
658{
659 _PyObject_GC_UNTRACK(self);
660 ImportError_clear(self);
661 Py_TYPE(self)->tp_free((PyObject *)self);
662}
663
664static int
665ImportError_traverse(PyImportErrorObject *self, visitproc visit, void *arg)
666{
667 Py_VISIT(self->msg);
668 Py_VISIT(self->name);
669 Py_VISIT(self->path);
670 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
671}
672
673static PyObject *
674ImportError_str(PyImportErrorObject *self)
675{
Brett Cannon07c6e712012-08-24 13:05:09 -0400676 if (self->msg && PyUnicode_CheckExact(self->msg)) {
Brett Cannon79ec55e2012-04-12 20:24:54 -0400677 Py_INCREF(self->msg);
678 return self->msg;
679 }
680 else {
681 return BaseException_str((PyBaseExceptionObject *)self);
682 }
683}
684
685static PyMemberDef ImportError_members[] = {
686 {"msg", T_OBJECT, offsetof(PyImportErrorObject, msg), 0,
687 PyDoc_STR("exception message")},
688 {"name", T_OBJECT, offsetof(PyImportErrorObject, name), 0,
689 PyDoc_STR("module name")},
690 {"path", T_OBJECT, offsetof(PyImportErrorObject, path), 0,
691 PyDoc_STR("module path")},
692 {NULL} /* Sentinel */
693};
694
695static PyMethodDef ImportError_methods[] = {
696 {NULL}
697};
698
699ComplexExtendsException(PyExc_Exception, ImportError,
700 ImportError, 0 /* new */,
701 ImportError_methods, ImportError_members,
702 0 /* getset */, ImportError_str,
703 "Import can't find module, or can't find name in "
704 "module.");
Thomas Wouters477c8d52006-05-27 19:21:47 +0000705
706/*
Eric Snowc9432652016-09-07 15:42:32 -0700707 * ModuleNotFoundError extends ImportError
708 */
709
710MiddlingExtendsException(PyExc_ImportError, ModuleNotFoundError, ImportError,
711 "Module not found.");
712
713/*
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200714 * OSError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +0000715 */
716
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200717#ifdef MS_WINDOWS
718#include "errmap.h"
719#endif
720
Thomas Wouters477c8d52006-05-27 19:21:47 +0000721/* Where a function has a single filename, such as open() or some
722 * of the os module functions, PyErr_SetFromErrnoWithFilename() is
723 * called, giving a third argument which is the filename. But, so
724 * that old code using in-place unpacking doesn't break, e.g.:
725 *
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200726 * except OSError, (errno, strerror):
Thomas Wouters477c8d52006-05-27 19:21:47 +0000727 *
728 * we hack args so that it only contains two items. This also
729 * means we need our own __str__() which prints out the filename
730 * when it was supplied.
Larry Hastingsb0827312014-02-09 22:05:19 -0800731 *
732 * (If a function has two filenames, such as rename(), symlink(),
Larry Hastings8f9f0f12014-02-10 03:43:57 -0800733 * or copy(), PyErr_SetFromErrnoWithFilenameObjects() is called,
734 * which allows passing in a second filename.)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000735 */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200736
Antoine Pitroue0e27352011-12-15 14:31:28 +0100737/* This function doesn't cleanup on error, the caller should */
738static int
739oserror_parse_args(PyObject **p_args,
740 PyObject **myerrno, PyObject **strerror,
Larry Hastingsb0827312014-02-09 22:05:19 -0800741 PyObject **filename, PyObject **filename2
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200742#ifdef MS_WINDOWS
Antoine Pitroue0e27352011-12-15 14:31:28 +0100743 , PyObject **winerror
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200744#endif
Antoine Pitroue0e27352011-12-15 14:31:28 +0100745 )
746{
747 Py_ssize_t nargs;
748 PyObject *args = *p_args;
Larry Hastingsb0827312014-02-09 22:05:19 -0800749#ifndef MS_WINDOWS
750 /*
751 * ignored on non-Windows platforms,
752 * but parsed so OSError has a consistent signature
753 */
754 PyObject *_winerror = NULL;
755 PyObject **winerror = &_winerror;
756#endif /* MS_WINDOWS */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000757
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200758 nargs = PyTuple_GET_SIZE(args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000759
Larry Hastingsb0827312014-02-09 22:05:19 -0800760 if (nargs >= 2 && nargs <= 5) {
761 if (!PyArg_UnpackTuple(args, "OSError", 2, 5,
762 myerrno, strerror,
763 filename, winerror, filename2))
Antoine Pitroue0e27352011-12-15 14:31:28 +0100764 return -1;
Larry Hastingsb0827312014-02-09 22:05:19 -0800765#ifdef MS_WINDOWS
Antoine Pitroue0e27352011-12-15 14:31:28 +0100766 if (*winerror && PyLong_Check(*winerror)) {
767 long errcode, winerrcode;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200768 PyObject *newargs;
769 Py_ssize_t i;
770
Antoine Pitroue0e27352011-12-15 14:31:28 +0100771 winerrcode = PyLong_AsLong(*winerror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200772 if (winerrcode == -1 && PyErr_Occurred())
Antoine Pitroue0e27352011-12-15 14:31:28 +0100773 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200774 /* Set errno to the corresponding POSIX errno (overriding
775 first argument). Windows Socket error codes (>= 10000)
776 have the same value as their POSIX counterparts.
777 */
778 if (winerrcode < 10000)
779 errcode = winerror_to_errno(winerrcode);
780 else
781 errcode = winerrcode;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100782 *myerrno = PyLong_FromLong(errcode);
783 if (!*myerrno)
784 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200785 newargs = PyTuple_New(nargs);
786 if (!newargs)
Antoine Pitroue0e27352011-12-15 14:31:28 +0100787 return -1;
788 PyTuple_SET_ITEM(newargs, 0, *myerrno);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200789 for (i = 1; i < nargs; i++) {
790 PyObject *val = PyTuple_GET_ITEM(args, i);
791 Py_INCREF(val);
792 PyTuple_SET_ITEM(newargs, i, val);
793 }
794 Py_DECREF(args);
Antoine Pitroue0e27352011-12-15 14:31:28 +0100795 args = *p_args = newargs;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200796 }
Larry Hastingsb0827312014-02-09 22:05:19 -0800797#endif /* MS_WINDOWS */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200798 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000799
Antoine Pitroue0e27352011-12-15 14:31:28 +0100800 return 0;
801}
Thomas Wouters477c8d52006-05-27 19:21:47 +0000802
Antoine Pitroue0e27352011-12-15 14:31:28 +0100803static int
804oserror_init(PyOSErrorObject *self, PyObject **p_args,
805 PyObject *myerrno, PyObject *strerror,
Larry Hastingsb0827312014-02-09 22:05:19 -0800806 PyObject *filename, PyObject *filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +0100807#ifdef MS_WINDOWS
808 , PyObject *winerror
809#endif
810 )
811{
812 PyObject *args = *p_args;
813 Py_ssize_t nargs = PyTuple_GET_SIZE(args);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000814
815 /* self->filename will remain Py_None otherwise */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200816 if (filename && filename != Py_None) {
Antoine Pitroue0e27352011-12-15 14:31:28 +0100817 if (Py_TYPE(self) == (PyTypeObject *) PyExc_BlockingIOError &&
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200818 PyNumber_Check(filename)) {
819 /* BlockingIOError's 3rd argument can be the number of
820 * characters written.
821 */
822 self->written = PyNumber_AsSsize_t(filename, PyExc_ValueError);
823 if (self->written == -1 && PyErr_Occurred())
Antoine Pitroue0e27352011-12-15 14:31:28 +0100824 return -1;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200825 }
826 else {
827 Py_INCREF(filename);
828 self->filename = filename;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000829
Larry Hastingsb0827312014-02-09 22:05:19 -0800830 if (filename2 && filename2 != Py_None) {
831 Py_INCREF(filename2);
832 self->filename2 = filename2;
833 }
834
835 if (nargs >= 2 && nargs <= 5) {
836 /* filename, filename2, and winerror are removed from the args tuple
837 (for compatibility purposes, see test_exceptions.py) */
Antoine Pitroue0e27352011-12-15 14:31:28 +0100838 PyObject *subslice = PyTuple_GetSlice(args, 0, 2);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200839 if (!subslice)
Antoine Pitroue0e27352011-12-15 14:31:28 +0100840 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000841
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200842 Py_DECREF(args); /* replacing args */
Antoine Pitroue0e27352011-12-15 14:31:28 +0100843 *p_args = args = subslice;
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200844 }
845 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000846 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200847 Py_XINCREF(myerrno);
848 self->myerrno = myerrno;
849
850 Py_XINCREF(strerror);
851 self->strerror = strerror;
852
853#ifdef MS_WINDOWS
854 Py_XINCREF(winerror);
855 self->winerror = winerror;
856#endif
857
Antoine Pitroue0e27352011-12-15 14:31:28 +0100858 /* Steals the reference to args */
Serhiy Storchaka48842712016-04-06 09:45:48 +0300859 Py_XSETREF(self->args, args);
Victor Stinner46ef3192013-11-14 22:31:41 +0100860 *p_args = args = NULL;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100861
862 return 0;
863}
864
865static PyObject *
866OSError_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
867static int
868OSError_init(PyOSErrorObject *self, PyObject *args, PyObject *kwds);
869
870static int
871oserror_use_init(PyTypeObject *type)
872{
Martin Panter7462b6492015-11-02 03:37:02 +0000873 /* When __init__ is defined in an OSError subclass, we want any
Antoine Pitroue0e27352011-12-15 14:31:28 +0100874 extraneous argument to __new__ to be ignored. The only reasonable
875 solution, given __new__ takes a variable number of arguments,
876 is to defer arg parsing and initialization to __init__.
877
Martin Pantere26da7c2016-06-02 10:07:09 +0000878 But when __new__ is overridden as well, it should call our __new__
Antoine Pitroue0e27352011-12-15 14:31:28 +0100879 with the right arguments.
880
881 (see http://bugs.python.org/issue12555#msg148829 )
882 */
883 if (type->tp_init != (initproc) OSError_init &&
884 type->tp_new == (newfunc) OSError_new) {
885 assert((PyObject *) type != PyExc_OSError);
886 return 1;
887 }
888 return 0;
889}
890
891static PyObject *
892OSError_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
893{
894 PyOSErrorObject *self = NULL;
Larry Hastingsb0827312014-02-09 22:05:19 -0800895 PyObject *myerrno = NULL, *strerror = NULL;
896 PyObject *filename = NULL, *filename2 = NULL;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100897#ifdef MS_WINDOWS
898 PyObject *winerror = NULL;
899#endif
900
Victor Stinner46ef3192013-11-14 22:31:41 +0100901 Py_INCREF(args);
902
Antoine Pitroue0e27352011-12-15 14:31:28 +0100903 if (!oserror_use_init(type)) {
904 if (!_PyArg_NoKeywords(type->tp_name, kwds))
Victor Stinner46ef3192013-11-14 22:31:41 +0100905 goto error;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100906
Larry Hastingsb0827312014-02-09 22:05:19 -0800907 if (oserror_parse_args(&args, &myerrno, &strerror,
908 &filename, &filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +0100909#ifdef MS_WINDOWS
910 , &winerror
911#endif
912 ))
913 goto error;
914
915 if (myerrno && PyLong_Check(myerrno) &&
916 errnomap && (PyObject *) type == PyExc_OSError) {
917 PyObject *newtype;
918 newtype = PyDict_GetItem(errnomap, myerrno);
919 if (newtype) {
920 assert(PyType_Check(newtype));
921 type = (PyTypeObject *) newtype;
922 }
923 else if (PyErr_Occurred())
924 goto error;
925 }
926 }
927
928 self = (PyOSErrorObject *) type->tp_alloc(type, 0);
929 if (!self)
930 goto error;
931
932 self->dict = NULL;
933 self->traceback = self->cause = self->context = NULL;
934 self->written = -1;
935
936 if (!oserror_use_init(type)) {
Larry Hastingsb0827312014-02-09 22:05:19 -0800937 if (oserror_init(self, &args, myerrno, strerror, filename, filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +0100938#ifdef MS_WINDOWS
939 , winerror
940#endif
941 ))
942 goto error;
943 }
Antoine Pitrouf87289b2012-06-30 23:37:47 +0200944 else {
945 self->args = PyTuple_New(0);
946 if (self->args == NULL)
947 goto error;
948 }
Antoine Pitroue0e27352011-12-15 14:31:28 +0100949
Victor Stinner46ef3192013-11-14 22:31:41 +0100950 Py_XDECREF(args);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200951 return (PyObject *) self;
952
953error:
954 Py_XDECREF(args);
955 Py_XDECREF(self);
956 return NULL;
957}
958
959static int
Antoine Pitroue0e27352011-12-15 14:31:28 +0100960OSError_init(PyOSErrorObject *self, PyObject *args, PyObject *kwds)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200961{
Larry Hastingsb0827312014-02-09 22:05:19 -0800962 PyObject *myerrno = NULL, *strerror = NULL;
963 PyObject *filename = NULL, *filename2 = NULL;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100964#ifdef MS_WINDOWS
965 PyObject *winerror = NULL;
966#endif
967
968 if (!oserror_use_init(Py_TYPE(self)))
969 /* Everything already done in OSError_new */
970 return 0;
971
972 if (!_PyArg_NoKeywords(Py_TYPE(self)->tp_name, kwds))
973 return -1;
974
975 Py_INCREF(args);
Larry Hastingsb0827312014-02-09 22:05:19 -0800976 if (oserror_parse_args(&args, &myerrno, &strerror, &filename, &filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +0100977#ifdef MS_WINDOWS
978 , &winerror
979#endif
980 ))
981 goto error;
982
Larry Hastingsb0827312014-02-09 22:05:19 -0800983 if (oserror_init(self, &args, myerrno, strerror, filename, filename2
Antoine Pitroue0e27352011-12-15 14:31:28 +0100984#ifdef MS_WINDOWS
985 , winerror
986#endif
987 ))
988 goto error;
989
Thomas Wouters477c8d52006-05-27 19:21:47 +0000990 return 0;
Antoine Pitroue0e27352011-12-15 14:31:28 +0100991
992error:
Serhiy Storchaka37665722016-08-20 21:22:03 +0300993 Py_DECREF(args);
Antoine Pitroue0e27352011-12-15 14:31:28 +0100994 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000995}
996
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000997static int
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200998OSError_clear(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000999{
1000 Py_CLEAR(self->myerrno);
1001 Py_CLEAR(self->strerror);
1002 Py_CLEAR(self->filename);
Larry Hastingsb0827312014-02-09 22:05:19 -08001003 Py_CLEAR(self->filename2);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001004#ifdef MS_WINDOWS
1005 Py_CLEAR(self->winerror);
1006#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00001007 return BaseException_clear((PyBaseExceptionObject *)self);
1008}
1009
1010static void
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001011OSError_dealloc(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001012{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001013 _PyObject_GC_UNTRACK(self);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001014 OSError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +00001015 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001016}
1017
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001018static int
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001019OSError_traverse(PyOSErrorObject *self, visitproc visit,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001020 void *arg)
1021{
1022 Py_VISIT(self->myerrno);
1023 Py_VISIT(self->strerror);
1024 Py_VISIT(self->filename);
Larry Hastingsb0827312014-02-09 22:05:19 -08001025 Py_VISIT(self->filename2);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001026#ifdef MS_WINDOWS
1027 Py_VISIT(self->winerror);
1028#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00001029 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1030}
1031
1032static PyObject *
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001033OSError_str(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001034{
Larry Hastingsb0827312014-02-09 22:05:19 -08001035#define OR_NONE(x) ((x)?(x):Py_None)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001036#ifdef MS_WINDOWS
1037 /* If available, winerror has the priority over myerrno */
Larry Hastingsb0827312014-02-09 22:05:19 -08001038 if (self->winerror && self->filename) {
1039 if (self->filename2) {
1040 return PyUnicode_FromFormat("[WinError %S] %S: %R -> %R",
1041 OR_NONE(self->winerror),
1042 OR_NONE(self->strerror),
1043 self->filename,
1044 self->filename2);
1045 } else {
1046 return PyUnicode_FromFormat("[WinError %S] %S: %R",
1047 OR_NONE(self->winerror),
1048 OR_NONE(self->strerror),
1049 self->filename);
1050 }
1051 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001052 if (self->winerror && self->strerror)
Richard Oudkerk30147712012-08-28 19:33:26 +01001053 return PyUnicode_FromFormat("[WinError %S] %S",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001054 self->winerror ? self->winerror: Py_None,
1055 self->strerror ? self->strerror: Py_None);
1056#endif
Larry Hastingsb0827312014-02-09 22:05:19 -08001057 if (self->filename) {
1058 if (self->filename2) {
1059 return PyUnicode_FromFormat("[Errno %S] %S: %R -> %R",
1060 OR_NONE(self->myerrno),
1061 OR_NONE(self->strerror),
1062 self->filename,
1063 self->filename2);
1064 } else {
1065 return PyUnicode_FromFormat("[Errno %S] %S: %R",
1066 OR_NONE(self->myerrno),
1067 OR_NONE(self->strerror),
1068 self->filename);
1069 }
1070 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001071 if (self->myerrno && self->strerror)
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001072 return PyUnicode_FromFormat("[Errno %S] %S",
Serhiy Storchaka37665722016-08-20 21:22:03 +03001073 self->myerrno, self->strerror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001074 return BaseException_str((PyBaseExceptionObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001075}
1076
Thomas Wouters477c8d52006-05-27 19:21:47 +00001077static PyObject *
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001078OSError_reduce(PyOSErrorObject *self)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001079{
1080 PyObject *args = self->args;
1081 PyObject *res = NULL, *tmp;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001082
Thomas Wouters477c8d52006-05-27 19:21:47 +00001083 /* self->args is only the first two real arguments if there was a
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001084 * file name given to OSError. */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001085 if (PyTuple_GET_SIZE(args) == 2 && self->filename) {
Larry Hastingsb0827312014-02-09 22:05:19 -08001086 Py_ssize_t size = self->filename2 ? 5 : 3;
1087 args = PyTuple_New(size);
Benjamin Peterson90b13582012-02-03 19:22:31 -05001088 if (!args)
1089 return NULL;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001090
1091 tmp = PyTuple_GET_ITEM(self->args, 0);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001092 Py_INCREF(tmp);
1093 PyTuple_SET_ITEM(args, 0, tmp);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001094
1095 tmp = PyTuple_GET_ITEM(self->args, 1);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001096 Py_INCREF(tmp);
1097 PyTuple_SET_ITEM(args, 1, tmp);
1098
1099 Py_INCREF(self->filename);
1100 PyTuple_SET_ITEM(args, 2, self->filename);
Larry Hastingsb0827312014-02-09 22:05:19 -08001101
1102 if (self->filename2) {
1103 /*
1104 * This tuple is essentially used as OSError(*args).
1105 * So, to recreate filename2, we need to pass in
1106 * winerror as well.
1107 */
1108 Py_INCREF(Py_None);
1109 PyTuple_SET_ITEM(args, 3, Py_None);
1110
1111 /* filename2 */
1112 Py_INCREF(self->filename2);
1113 PyTuple_SET_ITEM(args, 4, self->filename2);
1114 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001115 } else
Thomas Wouters477c8d52006-05-27 19:21:47 +00001116 Py_INCREF(args);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001117
1118 if (self->dict)
Christian Heimes90aa7642007-12-19 02:45:37 +00001119 res = PyTuple_Pack(3, Py_TYPE(self), args, self->dict);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001120 else
Christian Heimes90aa7642007-12-19 02:45:37 +00001121 res = PyTuple_Pack(2, Py_TYPE(self), args);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001122 Py_DECREF(args);
1123 return res;
1124}
1125
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001126static PyObject *
1127OSError_written_get(PyOSErrorObject *self, void *context)
1128{
1129 if (self->written == -1) {
1130 PyErr_SetString(PyExc_AttributeError, "characters_written");
1131 return NULL;
1132 }
1133 return PyLong_FromSsize_t(self->written);
1134}
Thomas Wouters477c8d52006-05-27 19:21:47 +00001135
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001136static int
1137OSError_written_set(PyOSErrorObject *self, PyObject *arg, void *context)
1138{
1139 Py_ssize_t n;
1140 n = PyNumber_AsSsize_t(arg, PyExc_ValueError);
1141 if (n == -1 && PyErr_Occurred())
1142 return -1;
1143 self->written = n;
1144 return 0;
1145}
1146
1147static PyMemberDef OSError_members[] = {
1148 {"errno", T_OBJECT, offsetof(PyOSErrorObject, myerrno), 0,
1149 PyDoc_STR("POSIX exception code")},
1150 {"strerror", T_OBJECT, offsetof(PyOSErrorObject, strerror), 0,
1151 PyDoc_STR("exception strerror")},
1152 {"filename", T_OBJECT, offsetof(PyOSErrorObject, filename), 0,
1153 PyDoc_STR("exception filename")},
Larry Hastingsb0827312014-02-09 22:05:19 -08001154 {"filename2", T_OBJECT, offsetof(PyOSErrorObject, filename2), 0,
1155 PyDoc_STR("second exception filename")},
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001156#ifdef MS_WINDOWS
1157 {"winerror", T_OBJECT, offsetof(PyOSErrorObject, winerror), 0,
1158 PyDoc_STR("Win32 exception code")},
1159#endif
1160 {NULL} /* Sentinel */
1161};
1162
1163static PyMethodDef OSError_methods[] = {
1164 {"__reduce__", (PyCFunction)OSError_reduce, METH_NOARGS},
Thomas Wouters477c8d52006-05-27 19:21:47 +00001165 {NULL}
1166};
1167
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001168static PyGetSetDef OSError_getset[] = {
1169 {"characters_written", (getter) OSError_written_get,
1170 (setter) OSError_written_set, NULL},
1171 {NULL}
1172};
1173
1174
1175ComplexExtendsException(PyExc_Exception, OSError,
1176 OSError, OSError_new,
1177 OSError_methods, OSError_members, OSError_getset,
1178 OSError_str,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001179 "Base class for I/O related errors.");
1180
1181
1182/*
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001183 * Various OSError subclasses
Thomas Wouters477c8d52006-05-27 19:21:47 +00001184 */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001185MiddlingExtendsException(PyExc_OSError, BlockingIOError, OSError,
1186 "I/O operation would block.");
1187MiddlingExtendsException(PyExc_OSError, ConnectionError, OSError,
1188 "Connection error.");
1189MiddlingExtendsException(PyExc_OSError, ChildProcessError, OSError,
1190 "Child process error.");
1191MiddlingExtendsException(PyExc_ConnectionError, BrokenPipeError, OSError,
1192 "Broken pipe.");
1193MiddlingExtendsException(PyExc_ConnectionError, ConnectionAbortedError, OSError,
1194 "Connection aborted.");
1195MiddlingExtendsException(PyExc_ConnectionError, ConnectionRefusedError, OSError,
1196 "Connection refused.");
1197MiddlingExtendsException(PyExc_ConnectionError, ConnectionResetError, OSError,
1198 "Connection reset.");
1199MiddlingExtendsException(PyExc_OSError, FileExistsError, OSError,
1200 "File already exists.");
1201MiddlingExtendsException(PyExc_OSError, FileNotFoundError, OSError,
1202 "File not found.");
1203MiddlingExtendsException(PyExc_OSError, IsADirectoryError, OSError,
1204 "Operation doesn't work on directories.");
1205MiddlingExtendsException(PyExc_OSError, NotADirectoryError, OSError,
1206 "Operation only works on directories.");
1207MiddlingExtendsException(PyExc_OSError, InterruptedError, OSError,
1208 "Interrupted by signal.");
1209MiddlingExtendsException(PyExc_OSError, PermissionError, OSError,
1210 "Not enough permissions.");
1211MiddlingExtendsException(PyExc_OSError, ProcessLookupError, OSError,
1212 "Process not found.");
1213MiddlingExtendsException(PyExc_OSError, TimeoutError, OSError,
1214 "Timeout expired.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001215
1216/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001217 * EOFError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001218 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001219SimpleExtendsException(PyExc_Exception, EOFError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001220 "Read beyond end of file.");
1221
1222
1223/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001224 * RuntimeError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001225 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001226SimpleExtendsException(PyExc_Exception, RuntimeError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001227 "Unspecified run-time error.");
1228
Yury Selivanovf488fb42015-07-03 01:04:23 -04001229/*
1230 * RecursionError extends RuntimeError
1231 */
1232SimpleExtendsException(PyExc_RuntimeError, RecursionError,
1233 "Recursion limit exceeded.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001234
1235/*
1236 * NotImplementedError extends RuntimeError
1237 */
1238SimpleExtendsException(PyExc_RuntimeError, NotImplementedError,
1239 "Method or function hasn't been implemented yet.");
1240
1241/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001242 * NameError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001243 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001244SimpleExtendsException(PyExc_Exception, NameError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001245 "Name not found globally.");
1246
1247/*
1248 * UnboundLocalError extends NameError
1249 */
1250SimpleExtendsException(PyExc_NameError, UnboundLocalError,
1251 "Local name referenced but not bound to a value.");
1252
1253/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001254 * AttributeError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001255 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001256SimpleExtendsException(PyExc_Exception, AttributeError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001257 "Attribute not found.");
1258
1259
1260/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001261 * SyntaxError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001262 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001263
Raymond Hettinger7ea386e2016-08-25 21:11:50 -07001264/* Helper function to customize error message for some syntax errors */
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10001265static int _report_missing_parentheses(PySyntaxErrorObject *self);
1266
Thomas Wouters477c8d52006-05-27 19:21:47 +00001267static int
1268SyntaxError_init(PySyntaxErrorObject *self, PyObject *args, PyObject *kwds)
1269{
1270 PyObject *info = NULL;
1271 Py_ssize_t lenargs = PyTuple_GET_SIZE(args);
1272
1273 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1274 return -1;
1275
1276 if (lenargs >= 1) {
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001277 Py_INCREF(PyTuple_GET_ITEM(args, 0));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001278 Py_XSETREF(self->msg, PyTuple_GET_ITEM(args, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001279 }
1280 if (lenargs == 2) {
1281 info = PyTuple_GET_ITEM(args, 1);
1282 info = PySequence_Tuple(info);
Benjamin Peterson90b13582012-02-03 19:22:31 -05001283 if (!info)
1284 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001285
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001286 if (PyTuple_GET_SIZE(info) != 4) {
1287 /* not a very good error message, but it's what Python 2.4 gives */
1288 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
1289 Py_DECREF(info);
1290 return -1;
1291 }
1292
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001293 Py_INCREF(PyTuple_GET_ITEM(info, 0));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001294 Py_XSETREF(self->filename, PyTuple_GET_ITEM(info, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001295
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001296 Py_INCREF(PyTuple_GET_ITEM(info, 1));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001297 Py_XSETREF(self->lineno, PyTuple_GET_ITEM(info, 1));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001298
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001299 Py_INCREF(PyTuple_GET_ITEM(info, 2));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001300 Py_XSETREF(self->offset, PyTuple_GET_ITEM(info, 2));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001301
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02001302 Py_INCREF(PyTuple_GET_ITEM(info, 3));
Serhiy Storchaka48842712016-04-06 09:45:48 +03001303 Py_XSETREF(self->text, PyTuple_GET_ITEM(info, 3));
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001304
1305 Py_DECREF(info);
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10001306
1307 /* Issue #21669: Custom error for 'print' & 'exec' as statements */
1308 if (self->text && PyUnicode_Check(self->text)) {
1309 if (_report_missing_parentheses(self) < 0) {
1310 return -1;
1311 }
1312 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001313 }
1314 return 0;
1315}
1316
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001317static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001318SyntaxError_clear(PySyntaxErrorObject *self)
1319{
1320 Py_CLEAR(self->msg);
1321 Py_CLEAR(self->filename);
1322 Py_CLEAR(self->lineno);
1323 Py_CLEAR(self->offset);
1324 Py_CLEAR(self->text);
1325 Py_CLEAR(self->print_file_and_line);
1326 return BaseException_clear((PyBaseExceptionObject *)self);
1327}
1328
1329static void
1330SyntaxError_dealloc(PySyntaxErrorObject *self)
1331{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001332 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001333 SyntaxError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +00001334 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001335}
1336
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001337static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001338SyntaxError_traverse(PySyntaxErrorObject *self, visitproc visit, void *arg)
1339{
1340 Py_VISIT(self->msg);
1341 Py_VISIT(self->filename);
1342 Py_VISIT(self->lineno);
1343 Py_VISIT(self->offset);
1344 Py_VISIT(self->text);
1345 Py_VISIT(self->print_file_and_line);
1346 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1347}
1348
1349/* This is called "my_basename" instead of just "basename" to avoid name
1350 conflicts with glibc; basename is already prototyped if _GNU_SOURCE is
1351 defined, and Python does define that. */
Victor Stinner6237daf2010-04-28 17:26:19 +00001352static PyObject*
1353my_basename(PyObject *name)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001354{
Victor Stinner6237daf2010-04-28 17:26:19 +00001355 Py_ssize_t i, size, offset;
Victor Stinner31392e72011-10-05 20:14:23 +02001356 int kind;
1357 void *data;
1358
1359 if (PyUnicode_READY(name))
1360 return NULL;
1361 kind = PyUnicode_KIND(name);
1362 data = PyUnicode_DATA(name);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001363 size = PyUnicode_GET_LENGTH(name);
Victor Stinner6237daf2010-04-28 17:26:19 +00001364 offset = 0;
1365 for(i=0; i < size; i++) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001366 if (PyUnicode_READ(kind, data, i) == SEP)
Victor Stinner6237daf2010-04-28 17:26:19 +00001367 offset = i + 1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001368 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001369 if (offset != 0)
1370 return PyUnicode_Substring(name, offset, size);
1371 else {
Victor Stinner6237daf2010-04-28 17:26:19 +00001372 Py_INCREF(name);
1373 return name;
1374 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001375}
1376
1377
1378static PyObject *
1379SyntaxError_str(PySyntaxErrorObject *self)
1380{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001381 int have_lineno = 0;
Victor Stinner6237daf2010-04-28 17:26:19 +00001382 PyObject *filename;
1383 PyObject *result;
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001384 /* Below, we always ignore overflow errors, just printing -1.
1385 Still, we cannot allow an OverflowError to be raised, so
1386 we need to call PyLong_AsLongAndOverflow. */
1387 int overflow;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001388
1389 /* XXX -- do all the additional formatting with filename and
1390 lineno here */
1391
Neal Norwitzed2b7392007-08-26 04:51:10 +00001392 if (self->filename && PyUnicode_Check(self->filename)) {
Victor Stinner6237daf2010-04-28 17:26:19 +00001393 filename = my_basename(self->filename);
1394 if (filename == NULL)
1395 return NULL;
1396 } else {
1397 filename = NULL;
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001398 }
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001399 have_lineno = (self->lineno != NULL) && PyLong_CheckExact(self->lineno);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001400
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001401 if (!filename && !have_lineno)
Thomas Heller519a0422007-11-15 20:48:54 +00001402 return PyObject_Str(self->msg ? self->msg : Py_None);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001403
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001404 if (filename && have_lineno)
Victor Stinner6237daf2010-04-28 17:26:19 +00001405 result = PyUnicode_FromFormat("%S (%U, line %ld)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001406 self->msg ? self->msg : Py_None,
Victor Stinner6237daf2010-04-28 17:26:19 +00001407 filename,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001408 PyLong_AsLongAndOverflow(self->lineno, &overflow));
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001409 else if (filename)
Victor Stinner6237daf2010-04-28 17:26:19 +00001410 result = PyUnicode_FromFormat("%S (%U)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001411 self->msg ? self->msg : Py_None,
Victor Stinner6237daf2010-04-28 17:26:19 +00001412 filename);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001413 else /* only have_lineno */
Victor Stinner6237daf2010-04-28 17:26:19 +00001414 result = PyUnicode_FromFormat("%S (line %ld)",
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001415 self->msg ? self->msg : Py_None,
Martin v. Löwisd1a1d1e2007-12-04 22:10:37 +00001416 PyLong_AsLongAndOverflow(self->lineno, &overflow));
Victor Stinner6237daf2010-04-28 17:26:19 +00001417 Py_XDECREF(filename);
1418 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001419}
1420
1421static PyMemberDef SyntaxError_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +00001422 {"msg", T_OBJECT, offsetof(PySyntaxErrorObject, msg), 0,
1423 PyDoc_STR("exception msg")},
1424 {"filename", T_OBJECT, offsetof(PySyntaxErrorObject, filename), 0,
1425 PyDoc_STR("exception filename")},
1426 {"lineno", T_OBJECT, offsetof(PySyntaxErrorObject, lineno), 0,
1427 PyDoc_STR("exception lineno")},
1428 {"offset", T_OBJECT, offsetof(PySyntaxErrorObject, offset), 0,
1429 PyDoc_STR("exception offset")},
1430 {"text", T_OBJECT, offsetof(PySyntaxErrorObject, text), 0,
1431 PyDoc_STR("exception text")},
1432 {"print_file_and_line", T_OBJECT,
1433 offsetof(PySyntaxErrorObject, print_file_and_line), 0,
1434 PyDoc_STR("exception print_file_and_line")},
1435 {NULL} /* Sentinel */
1436};
1437
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001438ComplexExtendsException(PyExc_Exception, SyntaxError, SyntaxError,
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001439 0, 0, SyntaxError_members, 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001440 SyntaxError_str, "Invalid syntax.");
1441
1442
1443/*
1444 * IndentationError extends SyntaxError
1445 */
1446MiddlingExtendsException(PyExc_SyntaxError, IndentationError, SyntaxError,
1447 "Improper indentation.");
1448
1449
1450/*
1451 * TabError extends IndentationError
1452 */
1453MiddlingExtendsException(PyExc_IndentationError, TabError, SyntaxError,
1454 "Improper mixture of spaces and tabs.");
1455
1456
1457/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001458 * LookupError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001459 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001460SimpleExtendsException(PyExc_Exception, LookupError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001461 "Base class for lookup errors.");
1462
1463
1464/*
1465 * IndexError extends LookupError
1466 */
1467SimpleExtendsException(PyExc_LookupError, IndexError,
1468 "Sequence index out of range.");
1469
1470
1471/*
1472 * KeyError extends LookupError
1473 */
1474static PyObject *
1475KeyError_str(PyBaseExceptionObject *self)
1476{
1477 /* If args is a tuple of exactly one item, apply repr to args[0].
1478 This is done so that e.g. the exception raised by {}[''] prints
1479 KeyError: ''
1480 rather than the confusing
1481 KeyError
1482 alone. The downside is that if KeyError is raised with an explanatory
1483 string, that string will be displayed in quotes. Too bad.
1484 If args is anything else, use the default BaseException__str__().
1485 */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001486 if (PyTuple_GET_SIZE(self->args) == 1) {
Walter Dörwaldf5bec7c2007-05-26 15:03:32 +00001487 return PyObject_Repr(PyTuple_GET_ITEM(self->args, 0));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001488 }
1489 return BaseException_str(self);
1490}
1491
1492ComplexExtendsException(PyExc_LookupError, KeyError, BaseException,
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001493 0, 0, 0, 0, KeyError_str, "Mapping key not found.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001494
1495
1496/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001497 * ValueError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00001498 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001499SimpleExtendsException(PyExc_Exception, ValueError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001500 "Inappropriate argument value (of correct type).");
1501
1502/*
1503 * UnicodeError extends ValueError
1504 */
1505
1506SimpleExtendsException(PyExc_ValueError, UnicodeError,
1507 "Unicode related error.");
1508
Thomas Wouters477c8d52006-05-27 19:21:47 +00001509static PyObject *
Guido van Rossum98297ee2007-11-06 21:34:58 +00001510get_string(PyObject *attr, const char *name)
Walter Dörwald612344f2007-05-04 19:28:21 +00001511{
1512 if (!attr) {
1513 PyErr_Format(PyExc_TypeError, "%.200s attribute not set", name);
1514 return NULL;
1515 }
1516
Christian Heimes72b710a2008-05-26 13:28:38 +00001517 if (!PyBytes_Check(attr)) {
Walter Dörwald612344f2007-05-04 19:28:21 +00001518 PyErr_Format(PyExc_TypeError, "%.200s attribute must be bytes", name);
1519 return NULL;
1520 }
1521 Py_INCREF(attr);
1522 return attr;
1523}
1524
1525static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +00001526get_unicode(PyObject *attr, const char *name)
1527{
1528 if (!attr) {
1529 PyErr_Format(PyExc_TypeError, "%.200s attribute not set", name);
1530 return NULL;
1531 }
1532
1533 if (!PyUnicode_Check(attr)) {
1534 PyErr_Format(PyExc_TypeError,
1535 "%.200s attribute must be unicode", name);
1536 return NULL;
1537 }
1538 Py_INCREF(attr);
1539 return attr;
1540}
1541
Walter Dörwaldd2034312007-05-18 16:29:38 +00001542static int
1543set_unicodefromstring(PyObject **attr, const char *value)
1544{
1545 PyObject *obj = PyUnicode_FromString(value);
1546 if (!obj)
1547 return -1;
Serhiy Storchaka48842712016-04-06 09:45:48 +03001548 Py_XSETREF(*attr, obj);
Walter Dörwaldd2034312007-05-18 16:29:38 +00001549 return 0;
1550}
1551
Thomas Wouters477c8d52006-05-27 19:21:47 +00001552PyObject *
1553PyUnicodeEncodeError_GetEncoding(PyObject *exc)
1554{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001555 return get_unicode(((PyUnicodeErrorObject *)exc)->encoding, "encoding");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001556}
1557
1558PyObject *
1559PyUnicodeDecodeError_GetEncoding(PyObject *exc)
1560{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001561 return get_unicode(((PyUnicodeErrorObject *)exc)->encoding, "encoding");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001562}
1563
1564PyObject *
1565PyUnicodeEncodeError_GetObject(PyObject *exc)
1566{
1567 return get_unicode(((PyUnicodeErrorObject *)exc)->object, "object");
1568}
1569
1570PyObject *
1571PyUnicodeDecodeError_GetObject(PyObject *exc)
1572{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001573 return get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001574}
1575
1576PyObject *
1577PyUnicodeTranslateError_GetObject(PyObject *exc)
1578{
1579 return get_unicode(((PyUnicodeErrorObject *)exc)->object, "object");
1580}
1581
1582int
1583PyUnicodeEncodeError_GetStart(PyObject *exc, Py_ssize_t *start)
1584{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001585 Py_ssize_t size;
1586 PyObject *obj = get_unicode(((PyUnicodeErrorObject *)exc)->object,
1587 "object");
1588 if (!obj)
1589 return -1;
1590 *start = ((PyUnicodeErrorObject *)exc)->start;
Victor Stinner9e30aa52011-11-21 02:49:52 +01001591 size = PyUnicode_GET_LENGTH(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001592 if (*start<0)
1593 *start = 0; /*XXX check for values <0*/
1594 if (*start>=size)
1595 *start = size-1;
1596 Py_DECREF(obj);
1597 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001598}
1599
1600
1601int
1602PyUnicodeDecodeError_GetStart(PyObject *exc, Py_ssize_t *start)
1603{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001604 Py_ssize_t size;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001605 PyObject *obj = get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001606 if (!obj)
1607 return -1;
Christian Heimes72b710a2008-05-26 13:28:38 +00001608 size = PyBytes_GET_SIZE(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001609 *start = ((PyUnicodeErrorObject *)exc)->start;
1610 if (*start<0)
1611 *start = 0;
1612 if (*start>=size)
1613 *start = size-1;
1614 Py_DECREF(obj);
1615 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001616}
1617
1618
1619int
1620PyUnicodeTranslateError_GetStart(PyObject *exc, Py_ssize_t *start)
1621{
1622 return PyUnicodeEncodeError_GetStart(exc, start);
1623}
1624
1625
1626int
1627PyUnicodeEncodeError_SetStart(PyObject *exc, Py_ssize_t start)
1628{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001629 ((PyUnicodeErrorObject *)exc)->start = start;
1630 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001631}
1632
1633
1634int
1635PyUnicodeDecodeError_SetStart(PyObject *exc, Py_ssize_t start)
1636{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001637 ((PyUnicodeErrorObject *)exc)->start = start;
1638 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001639}
1640
1641
1642int
1643PyUnicodeTranslateError_SetStart(PyObject *exc, Py_ssize_t start)
1644{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001645 ((PyUnicodeErrorObject *)exc)->start = start;
1646 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001647}
1648
1649
1650int
1651PyUnicodeEncodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
1652{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001653 Py_ssize_t size;
1654 PyObject *obj = get_unicode(((PyUnicodeErrorObject *)exc)->object,
1655 "object");
1656 if (!obj)
1657 return -1;
1658 *end = ((PyUnicodeErrorObject *)exc)->end;
Victor Stinner9e30aa52011-11-21 02:49:52 +01001659 size = PyUnicode_GET_LENGTH(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001660 if (*end<1)
1661 *end = 1;
1662 if (*end>size)
1663 *end = size;
1664 Py_DECREF(obj);
1665 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001666}
1667
1668
1669int
1670PyUnicodeDecodeError_GetEnd(PyObject *exc, Py_ssize_t *end)
1671{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001672 Py_ssize_t size;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001673 PyObject *obj = get_string(((PyUnicodeErrorObject *)exc)->object, "object");
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001674 if (!obj)
1675 return -1;
Christian Heimes72b710a2008-05-26 13:28:38 +00001676 size = PyBytes_GET_SIZE(obj);
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001677 *end = ((PyUnicodeErrorObject *)exc)->end;
1678 if (*end<1)
1679 *end = 1;
1680 if (*end>size)
1681 *end = size;
1682 Py_DECREF(obj);
1683 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001684}
1685
1686
1687int
1688PyUnicodeTranslateError_GetEnd(PyObject *exc, Py_ssize_t *start)
1689{
1690 return PyUnicodeEncodeError_GetEnd(exc, start);
1691}
1692
1693
1694int
1695PyUnicodeEncodeError_SetEnd(PyObject *exc, Py_ssize_t end)
1696{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001697 ((PyUnicodeErrorObject *)exc)->end = end;
1698 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001699}
1700
1701
1702int
1703PyUnicodeDecodeError_SetEnd(PyObject *exc, Py_ssize_t end)
1704{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001705 ((PyUnicodeErrorObject *)exc)->end = end;
1706 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001707}
1708
1709
1710int
1711PyUnicodeTranslateError_SetEnd(PyObject *exc, Py_ssize_t end)
1712{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001713 ((PyUnicodeErrorObject *)exc)->end = end;
1714 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001715}
1716
1717PyObject *
1718PyUnicodeEncodeError_GetReason(PyObject *exc)
1719{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001720 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001721}
1722
1723
1724PyObject *
1725PyUnicodeDecodeError_GetReason(PyObject *exc)
1726{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001727 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001728}
1729
1730
1731PyObject *
1732PyUnicodeTranslateError_GetReason(PyObject *exc)
1733{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001734 return get_unicode(((PyUnicodeErrorObject *)exc)->reason, "reason");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001735}
1736
1737
1738int
1739PyUnicodeEncodeError_SetReason(PyObject *exc, const char *reason)
1740{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001741 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1742 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001743}
1744
1745
1746int
1747PyUnicodeDecodeError_SetReason(PyObject *exc, const char *reason)
1748{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001749 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1750 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001751}
1752
1753
1754int
1755PyUnicodeTranslateError_SetReason(PyObject *exc, const char *reason)
1756{
Walter Dörwaldd2034312007-05-18 16:29:38 +00001757 return set_unicodefromstring(&((PyUnicodeErrorObject *)exc)->reason,
1758 reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001759}
1760
1761
Thomas Wouters477c8d52006-05-27 19:21:47 +00001762static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001763UnicodeError_clear(PyUnicodeErrorObject *self)
1764{
1765 Py_CLEAR(self->encoding);
1766 Py_CLEAR(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001767 Py_CLEAR(self->reason);
1768 return BaseException_clear((PyBaseExceptionObject *)self);
1769}
1770
1771static void
1772UnicodeError_dealloc(PyUnicodeErrorObject *self)
1773{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001774 _PyObject_GC_UNTRACK(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001775 UnicodeError_clear(self);
Christian Heimes90aa7642007-12-19 02:45:37 +00001776 Py_TYPE(self)->tp_free((PyObject *)self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001777}
1778
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001779static int
Thomas Wouters477c8d52006-05-27 19:21:47 +00001780UnicodeError_traverse(PyUnicodeErrorObject *self, visitproc visit, void *arg)
1781{
1782 Py_VISIT(self->encoding);
1783 Py_VISIT(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001784 Py_VISIT(self->reason);
1785 return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg);
1786}
1787
1788static PyMemberDef UnicodeError_members[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +00001789 {"encoding", T_OBJECT, offsetof(PyUnicodeErrorObject, encoding), 0,
1790 PyDoc_STR("exception encoding")},
1791 {"object", T_OBJECT, offsetof(PyUnicodeErrorObject, object), 0,
1792 PyDoc_STR("exception object")},
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001793 {"start", T_PYSSIZET, offsetof(PyUnicodeErrorObject, start), 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001794 PyDoc_STR("exception start")},
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001795 {"end", T_PYSSIZET, offsetof(PyUnicodeErrorObject, end), 0,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001796 PyDoc_STR("exception end")},
1797 {"reason", T_OBJECT, offsetof(PyUnicodeErrorObject, reason), 0,
1798 PyDoc_STR("exception reason")},
1799 {NULL} /* Sentinel */
1800};
1801
1802
1803/*
1804 * UnicodeEncodeError extends UnicodeError
1805 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001806
1807static int
1808UnicodeEncodeError_init(PyObject *self, PyObject *args, PyObject *kwds)
1809{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001810 PyUnicodeErrorObject *err;
1811
Thomas Wouters477c8d52006-05-27 19:21:47 +00001812 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1813 return -1;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001814
1815 err = (PyUnicodeErrorObject *)self;
1816
1817 Py_CLEAR(err->encoding);
1818 Py_CLEAR(err->object);
1819 Py_CLEAR(err->reason);
1820
Serhiy Storchakaf8d7d412016-10-23 15:12:25 +03001821 if (!PyArg_ParseTuple(args, "UUnnU",
1822 &err->encoding, &err->object,
1823 &err->start, &err->end, &err->reason)) {
1824 err->encoding = err->object = err->reason = NULL;
Martin v. Löwisb09af032011-11-04 11:16:41 +01001825 return -1;
1826 }
1827
Guido van Rossum98297ee2007-11-06 21:34:58 +00001828 Py_INCREF(err->encoding);
1829 Py_INCREF(err->object);
1830 Py_INCREF(err->reason);
1831
1832 return 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001833}
1834
1835static PyObject *
1836UnicodeEncodeError_str(PyObject *self)
1837{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001838 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00001839 PyObject *result = NULL;
1840 PyObject *reason_str = NULL;
1841 PyObject *encoding_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001842
Benjamin Peterson9b09ba12014-04-02 12:15:06 -04001843 if (!uself->object)
1844 /* Not properly initialized. */
1845 return PyUnicode_FromString("");
1846
Eric Smith0facd772010-02-24 15:42:29 +00001847 /* Get reason and encoding as strings, which they might not be if
Martin Pantereb995702016-07-28 01:11:04 +00001848 they've been modified after we were constructed. */
Eric Smith0facd772010-02-24 15:42:29 +00001849 reason_str = PyObject_Str(uself->reason);
1850 if (reason_str == NULL)
1851 goto done;
1852 encoding_str = PyObject_Str(uself->encoding);
1853 if (encoding_str == NULL)
1854 goto done;
1855
Victor Stinnerda1ddf32011-11-20 22:50:23 +01001856 if (uself->start < PyUnicode_GET_LENGTH(uself->object) && uself->end == uself->start+1) {
1857 Py_UCS4 badchar = PyUnicode_ReadChar(uself->object, uself->start);
Walter Dörwald787b03b2007-06-05 13:29:29 +00001858 const char *fmt;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001859 if (badchar <= 0xff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00001860 fmt = "'%U' codec can't encode character '\\x%02x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001861 else if (badchar <= 0xffff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00001862 fmt = "'%U' codec can't encode character '\\u%04x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001863 else
Walter Dörwald32a4c712007-06-20 09:25:34 +00001864 fmt = "'%U' codec can't encode character '\\U%08x' in position %zd: %U";
Eric Smith0facd772010-02-24 15:42:29 +00001865 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00001866 fmt,
Eric Smith0facd772010-02-24 15:42:29 +00001867 encoding_str,
Victor Stinnerda1ddf32011-11-20 22:50:23 +01001868 (int)badchar,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001869 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00001870 reason_str);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001871 }
Eric Smith0facd772010-02-24 15:42:29 +00001872 else {
1873 result = PyUnicode_FromFormat(
1874 "'%U' codec can't encode characters in position %zd-%zd: %U",
1875 encoding_str,
1876 uself->start,
1877 uself->end-1,
1878 reason_str);
1879 }
1880done:
1881 Py_XDECREF(reason_str);
1882 Py_XDECREF(encoding_str);
1883 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001884}
1885
1886static PyTypeObject _PyExc_UnicodeEncodeError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001887 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00001888 "UnicodeEncodeError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00001889 sizeof(PyUnicodeErrorObject), 0,
1890 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1891 (reprfunc)UnicodeEncodeError_str, 0, 0, 0,
1892 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001893 PyDoc_STR("Unicode encoding error."), (traverseproc)UnicodeError_traverse,
1894 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001895 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001896 (initproc)UnicodeEncodeError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001897};
1898PyObject *PyExc_UnicodeEncodeError = (PyObject *)&_PyExc_UnicodeEncodeError;
1899
1900PyObject *
1901PyUnicodeEncodeError_Create(
1902 const char *encoding, const Py_UNICODE *object, Py_ssize_t length,
1903 Py_ssize_t start, Py_ssize_t end, const char *reason)
1904{
Victor Stinner7eeb5b52010-06-07 19:57:46 +00001905 return PyObject_CallFunction(PyExc_UnicodeEncodeError, "su#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001906 encoding, object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001907}
1908
1909
1910/*
1911 * UnicodeDecodeError extends UnicodeError
1912 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001913
1914static int
1915UnicodeDecodeError_init(PyObject *self, PyObject *args, PyObject *kwds)
1916{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001917 PyUnicodeErrorObject *ude;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001918
Thomas Wouters477c8d52006-05-27 19:21:47 +00001919 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
1920 return -1;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001921
1922 ude = (PyUnicodeErrorObject *)self;
1923
1924 Py_CLEAR(ude->encoding);
1925 Py_CLEAR(ude->object);
1926 Py_CLEAR(ude->reason);
1927
Serhiy Storchakaf8d7d412016-10-23 15:12:25 +03001928 if (!PyArg_ParseTuple(args, "UOnnU",
1929 &ude->encoding, &ude->object,
1930 &ude->start, &ude->end, &ude->reason)) {
Guido van Rossum98297ee2007-11-06 21:34:58 +00001931 ude->encoding = ude->object = ude->reason = NULL;
1932 return -1;
1933 }
1934
Guido van Rossum98297ee2007-11-06 21:34:58 +00001935 Py_INCREF(ude->encoding);
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001936 Py_INCREF(ude->object);
Guido van Rossum98297ee2007-11-06 21:34:58 +00001937 Py_INCREF(ude->reason);
1938
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001939 if (!PyBytes_Check(ude->object)) {
1940 Py_buffer view;
1941 if (PyObject_GetBuffer(ude->object, &view, PyBUF_SIMPLE) != 0)
1942 goto error;
Serhiy Storchaka48842712016-04-06 09:45:48 +03001943 Py_XSETREF(ude->object, PyBytes_FromStringAndSize(view.buf, view.len));
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001944 PyBuffer_Release(&view);
1945 if (!ude->object)
1946 goto error;
1947 }
Guido van Rossum98297ee2007-11-06 21:34:58 +00001948 return 0;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001949
1950error:
1951 Py_CLEAR(ude->encoding);
1952 Py_CLEAR(ude->object);
1953 Py_CLEAR(ude->reason);
1954 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001955}
1956
1957static PyObject *
1958UnicodeDecodeError_str(PyObject *self)
1959{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001960 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00001961 PyObject *result = NULL;
1962 PyObject *reason_str = NULL;
1963 PyObject *encoding_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001964
Benjamin Peterson9b09ba12014-04-02 12:15:06 -04001965 if (!uself->object)
1966 /* Not properly initialized. */
1967 return PyUnicode_FromString("");
1968
Eric Smith0facd772010-02-24 15:42:29 +00001969 /* Get reason and encoding as strings, which they might not be if
Martin Pantereb995702016-07-28 01:11:04 +00001970 they've been modified after we were constructed. */
Eric Smith0facd772010-02-24 15:42:29 +00001971 reason_str = PyObject_Str(uself->reason);
1972 if (reason_str == NULL)
1973 goto done;
1974 encoding_str = PyObject_Str(uself->encoding);
1975 if (encoding_str == NULL)
1976 goto done;
1977
1978 if (uself->start < PyBytes_GET_SIZE(uself->object) && uself->end == uself->start+1) {
Christian Heimes72b710a2008-05-26 13:28:38 +00001979 int byte = (int)(PyBytes_AS_STRING(((PyUnicodeErrorObject *)self)->object)[uself->start]&0xff);
Eric Smith0facd772010-02-24 15:42:29 +00001980 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00001981 "'%U' codec can't decode byte 0x%02x in position %zd: %U",
Eric Smith0facd772010-02-24 15:42:29 +00001982 encoding_str,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001983 byte,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00001984 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00001985 reason_str);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001986 }
Eric Smith0facd772010-02-24 15:42:29 +00001987 else {
1988 result = PyUnicode_FromFormat(
1989 "'%U' codec can't decode bytes in position %zd-%zd: %U",
1990 encoding_str,
1991 uself->start,
1992 uself->end-1,
1993 reason_str
1994 );
1995 }
1996done:
1997 Py_XDECREF(reason_str);
1998 Py_XDECREF(encoding_str);
1999 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002000}
2001
2002static PyTypeObject _PyExc_UnicodeDecodeError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002003 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00002004 "UnicodeDecodeError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00002005 sizeof(PyUnicodeErrorObject), 0,
2006 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2007 (reprfunc)UnicodeDecodeError_str, 0, 0, 0,
2008 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002009 PyDoc_STR("Unicode decoding error."), (traverseproc)UnicodeError_traverse,
2010 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002011 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002012 (initproc)UnicodeDecodeError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002013};
2014PyObject *PyExc_UnicodeDecodeError = (PyObject *)&_PyExc_UnicodeDecodeError;
2015
2016PyObject *
2017PyUnicodeDecodeError_Create(
2018 const char *encoding, const char *object, Py_ssize_t length,
2019 Py_ssize_t start, Py_ssize_t end, const char *reason)
2020{
Victor Stinner7eeb5b52010-06-07 19:57:46 +00002021 return PyObject_CallFunction(PyExc_UnicodeDecodeError, "sy#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002022 encoding, object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002023}
2024
2025
2026/*
2027 * UnicodeTranslateError extends UnicodeError
2028 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002029
2030static int
2031UnicodeTranslateError_init(PyUnicodeErrorObject *self, PyObject *args,
2032 PyObject *kwds)
2033{
2034 if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
2035 return -1;
2036
2037 Py_CLEAR(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002038 Py_CLEAR(self->reason);
2039
Serhiy Storchakaf8d7d412016-10-23 15:12:25 +03002040 if (!PyArg_ParseTuple(args, "UnnU",
2041 &self->object,
2042 &self->start, &self->end, &self->reason)) {
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002043 self->object = self->reason = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002044 return -1;
2045 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002046
Thomas Wouters477c8d52006-05-27 19:21:47 +00002047 Py_INCREF(self->object);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002048 Py_INCREF(self->reason);
2049
2050 return 0;
2051}
2052
2053
2054static PyObject *
2055UnicodeTranslateError_str(PyObject *self)
2056{
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002057 PyUnicodeErrorObject *uself = (PyUnicodeErrorObject *)self;
Eric Smith0facd772010-02-24 15:42:29 +00002058 PyObject *result = NULL;
2059 PyObject *reason_str = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002060
Benjamin Peterson9b09ba12014-04-02 12:15:06 -04002061 if (!uself->object)
2062 /* Not properly initialized. */
2063 return PyUnicode_FromString("");
2064
Eric Smith0facd772010-02-24 15:42:29 +00002065 /* Get reason as a string, which it might not be if it's been
Martin Pantereb995702016-07-28 01:11:04 +00002066 modified after we were constructed. */
Eric Smith0facd772010-02-24 15:42:29 +00002067 reason_str = PyObject_Str(uself->reason);
2068 if (reason_str == NULL)
2069 goto done;
2070
Victor Stinner53b33e72011-11-21 01:17:27 +01002071 if (uself->start < PyUnicode_GET_LENGTH(uself->object) && uself->end == uself->start+1) {
2072 Py_UCS4 badchar = PyUnicode_ReadChar(uself->object, uself->start);
Walter Dörwald787b03b2007-06-05 13:29:29 +00002073 const char *fmt;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002074 if (badchar <= 0xff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00002075 fmt = "can't translate character '\\x%02x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002076 else if (badchar <= 0xffff)
Walter Dörwald32a4c712007-06-20 09:25:34 +00002077 fmt = "can't translate character '\\u%04x' in position %zd: %U";
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002078 else
Walter Dörwald32a4c712007-06-20 09:25:34 +00002079 fmt = "can't translate character '\\U%08x' in position %zd: %U";
Benjamin Petersonc5f4e1e2010-02-25 01:22:28 +00002080 result = PyUnicode_FromFormat(
Walter Dörwald787b03b2007-06-05 13:29:29 +00002081 fmt,
Victor Stinner53b33e72011-11-21 01:17:27 +01002082 (int)badchar,
Guido van Rossum7eaf8222007-06-18 17:58:50 +00002083 uself->start,
Eric Smith0facd772010-02-24 15:42:29 +00002084 reason_str
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002085 );
Eric Smith0facd772010-02-24 15:42:29 +00002086 } else {
2087 result = PyUnicode_FromFormat(
2088 "can't translate characters in position %zd-%zd: %U",
2089 uself->start,
2090 uself->end-1,
2091 reason_str
2092 );
Thomas Wouters477c8d52006-05-27 19:21:47 +00002093 }
Eric Smith0facd772010-02-24 15:42:29 +00002094done:
2095 Py_XDECREF(reason_str);
2096 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002097}
2098
2099static PyTypeObject _PyExc_UnicodeTranslateError = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002100 PyVarObject_HEAD_INIT(NULL, 0)
Neal Norwitz2633c692007-02-26 22:22:47 +00002101 "UnicodeTranslateError",
Thomas Wouters477c8d52006-05-27 19:21:47 +00002102 sizeof(PyUnicodeErrorObject), 0,
2103 (destructor)UnicodeError_dealloc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2104 (reprfunc)UnicodeTranslateError_str, 0, 0, 0,
2105 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
Thomas Wouters89f507f2006-12-13 04:49:30 +00002106 PyDoc_STR("Unicode translation error."), (traverseproc)UnicodeError_traverse,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002107 (inquiry)UnicodeError_clear, 0, 0, 0, 0, 0, UnicodeError_members,
2108 0, &_PyExc_UnicodeError, 0, 0, 0, offsetof(PyUnicodeErrorObject, dict),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002109 (initproc)UnicodeTranslateError_init, 0, BaseException_new,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002110};
2111PyObject *PyExc_UnicodeTranslateError = (PyObject *)&_PyExc_UnicodeTranslateError;
2112
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002113/* Deprecated. */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002114PyObject *
2115PyUnicodeTranslateError_Create(
2116 const Py_UNICODE *object, Py_ssize_t length,
2117 Py_ssize_t start, Py_ssize_t end, const char *reason)
2118{
2119 return PyObject_CallFunction(PyExc_UnicodeTranslateError, "u#nns",
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002120 object, length, start, end, reason);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002121}
Thomas Wouters477c8d52006-05-27 19:21:47 +00002122
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002123PyObject *
2124_PyUnicodeTranslateError_Create(
2125 PyObject *object,
2126 Py_ssize_t start, Py_ssize_t end, const char *reason)
2127{
Victor Stinner69598d42014-04-04 20:59:44 +02002128 return PyObject_CallFunction(PyExc_UnicodeTranslateError, "Onns",
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002129 object, start, end, reason);
2130}
Thomas Wouters477c8d52006-05-27 19:21:47 +00002131
2132/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002133 * AssertionError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002134 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002135SimpleExtendsException(PyExc_Exception, AssertionError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002136 "Assertion failed.");
2137
2138
2139/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002140 * ArithmeticError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002141 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002142SimpleExtendsException(PyExc_Exception, ArithmeticError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002143 "Base class for arithmetic errors.");
2144
2145
2146/*
2147 * FloatingPointError extends ArithmeticError
2148 */
2149SimpleExtendsException(PyExc_ArithmeticError, FloatingPointError,
2150 "Floating point operation failed.");
2151
2152
2153/*
2154 * OverflowError extends ArithmeticError
2155 */
2156SimpleExtendsException(PyExc_ArithmeticError, OverflowError,
2157 "Result too large to be represented.");
2158
2159
2160/*
2161 * ZeroDivisionError extends ArithmeticError
2162 */
2163SimpleExtendsException(PyExc_ArithmeticError, ZeroDivisionError,
2164 "Second argument to a division or modulo operation was zero.");
2165
2166
2167/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002168 * SystemError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002169 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002170SimpleExtendsException(PyExc_Exception, SystemError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002171 "Internal error in the Python interpreter.\n"
2172 "\n"
2173 "Please report this to the Python maintainer, along with the traceback,\n"
2174 "the Python version, and the hardware/OS platform and version.");
2175
2176
2177/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002178 * ReferenceError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002179 */
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002180SimpleExtendsException(PyExc_Exception, ReferenceError,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002181 "Weak ref proxy used after referent went away.");
2182
2183
2184/*
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002185 * MemoryError extends Exception
Thomas Wouters477c8d52006-05-27 19:21:47 +00002186 */
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002187
2188#define MEMERRORS_SAVE 16
2189static PyBaseExceptionObject *memerrors_freelist = NULL;
2190static int memerrors_numfree = 0;
2191
2192static PyObject *
2193MemoryError_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2194{
2195 PyBaseExceptionObject *self;
2196
2197 if (type != (PyTypeObject *) PyExc_MemoryError)
2198 return BaseException_new(type, args, kwds);
2199 if (memerrors_freelist == NULL)
2200 return BaseException_new(type, args, kwds);
2201 /* Fetch object from freelist and revive it */
2202 self = memerrors_freelist;
2203 self->args = PyTuple_New(0);
2204 /* This shouldn't happen since the empty tuple is persistent */
2205 if (self->args == NULL)
2206 return NULL;
2207 memerrors_freelist = (PyBaseExceptionObject *) self->dict;
2208 memerrors_numfree--;
2209 self->dict = NULL;
2210 _Py_NewReference((PyObject *)self);
2211 _PyObject_GC_TRACK(self);
2212 return (PyObject *)self;
2213}
2214
2215static void
2216MemoryError_dealloc(PyBaseExceptionObject *self)
2217{
2218 _PyObject_GC_UNTRACK(self);
2219 BaseException_clear(self);
2220 if (memerrors_numfree >= MEMERRORS_SAVE)
2221 Py_TYPE(self)->tp_free((PyObject *)self);
2222 else {
2223 self->dict = (PyObject *) memerrors_freelist;
2224 memerrors_freelist = self;
2225 memerrors_numfree++;
2226 }
2227}
2228
2229static void
2230preallocate_memerrors(void)
2231{
2232 /* We create enough MemoryErrors and then decref them, which will fill
2233 up the freelist. */
2234 int i;
2235 PyObject *errors[MEMERRORS_SAVE];
2236 for (i = 0; i < MEMERRORS_SAVE; i++) {
2237 errors[i] = MemoryError_new((PyTypeObject *) PyExc_MemoryError,
2238 NULL, NULL);
2239 if (!errors[i])
2240 Py_FatalError("Could not preallocate MemoryError object");
2241 }
2242 for (i = 0; i < MEMERRORS_SAVE; i++) {
2243 Py_DECREF(errors[i]);
2244 }
2245}
2246
2247static void
2248free_preallocated_memerrors(void)
2249{
2250 while (memerrors_freelist != NULL) {
2251 PyObject *self = (PyObject *) memerrors_freelist;
2252 memerrors_freelist = (PyBaseExceptionObject *) memerrors_freelist->dict;
2253 Py_TYPE(self)->tp_free((PyObject *)self);
2254 }
2255}
2256
2257
2258static PyTypeObject _PyExc_MemoryError = {
2259 PyVarObject_HEAD_INIT(NULL, 0)
2260 "MemoryError",
2261 sizeof(PyBaseExceptionObject),
2262 0, (destructor)MemoryError_dealloc, 0, 0, 0, 0, 0, 0, 0,
2263 0, 0, 0, 0, 0, 0, 0,
2264 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
2265 PyDoc_STR("Out of memory."), (traverseproc)BaseException_traverse,
2266 (inquiry)BaseException_clear, 0, 0, 0, 0, 0, 0, 0, &_PyExc_Exception,
2267 0, 0, 0, offsetof(PyBaseExceptionObject, dict),
2268 (initproc)BaseException_init, 0, MemoryError_new
2269};
2270PyObject *PyExc_MemoryError = (PyObject *) &_PyExc_MemoryError;
2271
Thomas Wouters477c8d52006-05-27 19:21:47 +00002272
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002273/*
2274 * BufferError extends Exception
2275 */
2276SimpleExtendsException(PyExc_Exception, BufferError, "Buffer error.");
2277
Thomas Wouters477c8d52006-05-27 19:21:47 +00002278
2279/* Warning category docstrings */
2280
2281/*
2282 * Warning extends Exception
2283 */
2284SimpleExtendsException(PyExc_Exception, Warning,
2285 "Base class for warning categories.");
2286
2287
2288/*
2289 * UserWarning extends Warning
2290 */
2291SimpleExtendsException(PyExc_Warning, UserWarning,
2292 "Base class for warnings generated by user code.");
2293
2294
2295/*
2296 * DeprecationWarning extends Warning
2297 */
2298SimpleExtendsException(PyExc_Warning, DeprecationWarning,
2299 "Base class for warnings about deprecated features.");
2300
2301
2302/*
2303 * PendingDeprecationWarning extends Warning
2304 */
2305SimpleExtendsException(PyExc_Warning, PendingDeprecationWarning,
2306 "Base class for warnings about features which will be deprecated\n"
2307 "in the future.");
2308
2309
2310/*
2311 * SyntaxWarning extends Warning
2312 */
2313SimpleExtendsException(PyExc_Warning, SyntaxWarning,
2314 "Base class for warnings about dubious syntax.");
2315
2316
2317/*
2318 * RuntimeWarning extends Warning
2319 */
2320SimpleExtendsException(PyExc_Warning, RuntimeWarning,
2321 "Base class for warnings about dubious runtime behavior.");
2322
2323
2324/*
2325 * FutureWarning extends Warning
2326 */
2327SimpleExtendsException(PyExc_Warning, FutureWarning,
2328 "Base class for warnings about constructs that will change semantically\n"
2329 "in the future.");
2330
2331
2332/*
2333 * ImportWarning extends Warning
2334 */
2335SimpleExtendsException(PyExc_Warning, ImportWarning,
2336 "Base class for warnings about probable mistakes in module imports");
2337
2338
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002339/*
2340 * UnicodeWarning extends Warning
2341 */
2342SimpleExtendsException(PyExc_Warning, UnicodeWarning,
2343 "Base class for warnings about Unicode related problems, mostly\n"
2344 "related to conversion problems.");
2345
Georg Brandl08be72d2010-10-24 15:11:22 +00002346
Guido van Rossum98297ee2007-11-06 21:34:58 +00002347/*
2348 * BytesWarning extends Warning
2349 */
2350SimpleExtendsException(PyExc_Warning, BytesWarning,
2351 "Base class for warnings about bytes and buffer related problems, mostly\n"
2352 "related to conversion from str or comparing to str.");
2353
2354
Georg Brandl08be72d2010-10-24 15:11:22 +00002355/*
2356 * ResourceWarning extends Warning
2357 */
2358SimpleExtendsException(PyExc_Warning, ResourceWarning,
2359 "Base class for warnings about resource usage.");
2360
2361
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002362
Yury Selivanovf488fb42015-07-03 01:04:23 -04002363/* Pre-computed RecursionError instance for when recursion depth is reached.
Thomas Wouters89d996e2007-09-08 17:39:28 +00002364 Meant to be used when normalizing the exception for exceeding the recursion
2365 depth will cause its own infinite recursion.
2366*/
2367PyObject *PyExc_RecursionErrorInst = NULL;
2368
Antoine Pitrou55f217f2012-01-18 21:23:13 +01002369#define PRE_INIT(TYPE) \
2370 if (!(_PyExc_ ## TYPE.tp_flags & Py_TPFLAGS_READY)) { \
2371 if (PyType_Ready(&_PyExc_ ## TYPE) < 0) \
2372 Py_FatalError("exceptions bootstrapping error."); \
2373 Py_INCREF(PyExc_ ## TYPE); \
2374 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002375
Antoine Pitrou55f217f2012-01-18 21:23:13 +01002376#define POST_INIT(TYPE) \
Thomas Wouters477c8d52006-05-27 19:21:47 +00002377 if (PyDict_SetItemString(bdict, # TYPE, PyExc_ ## TYPE)) \
2378 Py_FatalError("Module dictionary insertion problem.");
2379
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002380#define INIT_ALIAS(NAME, TYPE) Py_INCREF(PyExc_ ## TYPE); \
Antoine Pitrou8b0a74e2012-01-18 21:29:05 +01002381 Py_XDECREF(PyExc_ ## NAME); \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002382 PyExc_ ## NAME = PyExc_ ## TYPE; \
2383 if (PyDict_SetItemString(bdict, # NAME, PyExc_ ## NAME)) \
2384 Py_FatalError("Module dictionary insertion problem.");
2385
2386#define ADD_ERRNO(TYPE, CODE) { \
2387 PyObject *_code = PyLong_FromLong(CODE); \
2388 assert(_PyObject_RealIsSubclass(PyExc_ ## TYPE, PyExc_OSError)); \
2389 if (!_code || PyDict_SetItem(errnomap, _code, PyExc_ ## TYPE)) \
2390 Py_FatalError("errmap insertion problem."); \
Antoine Pitrou8b0a74e2012-01-18 21:29:05 +01002391 Py_DECREF(_code); \
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002392 }
2393
2394#ifdef MS_WINDOWS
Antoine Pitrou7faf7052013-03-31 22:48:04 +02002395#include <winsock2.h>
Brian Curtin401f9f32012-05-13 11:19:23 -05002396/* The following constants were added to errno.h in VS2010 but have
2397 preferred WSA equivalents. */
2398#undef EADDRINUSE
2399#undef EADDRNOTAVAIL
2400#undef EAFNOSUPPORT
2401#undef EALREADY
2402#undef ECONNABORTED
2403#undef ECONNREFUSED
2404#undef ECONNRESET
2405#undef EDESTADDRREQ
2406#undef EHOSTUNREACH
2407#undef EINPROGRESS
2408#undef EISCONN
2409#undef ELOOP
2410#undef EMSGSIZE
2411#undef ENETDOWN
2412#undef ENETRESET
2413#undef ENETUNREACH
2414#undef ENOBUFS
2415#undef ENOPROTOOPT
2416#undef ENOTCONN
2417#undef ENOTSOCK
2418#undef EOPNOTSUPP
2419#undef EPROTONOSUPPORT
2420#undef EPROTOTYPE
2421#undef ETIMEDOUT
2422#undef EWOULDBLOCK
2423
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002424#if defined(WSAEALREADY) && !defined(EALREADY)
2425#define EALREADY WSAEALREADY
2426#endif
2427#if defined(WSAECONNABORTED) && !defined(ECONNABORTED)
2428#define ECONNABORTED WSAECONNABORTED
2429#endif
2430#if defined(WSAECONNREFUSED) && !defined(ECONNREFUSED)
2431#define ECONNREFUSED WSAECONNREFUSED
2432#endif
2433#if defined(WSAECONNRESET) && !defined(ECONNRESET)
2434#define ECONNRESET WSAECONNRESET
2435#endif
2436#if defined(WSAEINPROGRESS) && !defined(EINPROGRESS)
2437#define EINPROGRESS WSAEINPROGRESS
2438#endif
2439#if defined(WSAESHUTDOWN) && !defined(ESHUTDOWN)
2440#define ESHUTDOWN WSAESHUTDOWN
2441#endif
2442#if defined(WSAETIMEDOUT) && !defined(ETIMEDOUT)
2443#define ETIMEDOUT WSAETIMEDOUT
2444#endif
2445#if defined(WSAEWOULDBLOCK) && !defined(EWOULDBLOCK)
2446#define EWOULDBLOCK WSAEWOULDBLOCK
2447#endif
2448#endif /* MS_WINDOWS */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002449
Martin v. Löwis1a214512008-06-11 05:26:20 +00002450void
Brett Cannonfd074152012-04-14 14:10:13 -04002451_PyExc_Init(PyObject *bltinmod)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002452{
Brett Cannonfd074152012-04-14 14:10:13 -04002453 PyObject *bdict;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002454
2455 PRE_INIT(BaseException)
2456 PRE_INIT(Exception)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002457 PRE_INIT(TypeError)
Yury Selivanov75445082015-05-11 22:57:16 -04002458 PRE_INIT(StopAsyncIteration)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002459 PRE_INIT(StopIteration)
2460 PRE_INIT(GeneratorExit)
2461 PRE_INIT(SystemExit)
2462 PRE_INIT(KeyboardInterrupt)
2463 PRE_INIT(ImportError)
Eric Snowc9432652016-09-07 15:42:32 -07002464 PRE_INIT(ModuleNotFoundError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002465 PRE_INIT(OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002466 PRE_INIT(EOFError)
2467 PRE_INIT(RuntimeError)
Yury Selivanovf488fb42015-07-03 01:04:23 -04002468 PRE_INIT(RecursionError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002469 PRE_INIT(NotImplementedError)
2470 PRE_INIT(NameError)
2471 PRE_INIT(UnboundLocalError)
2472 PRE_INIT(AttributeError)
2473 PRE_INIT(SyntaxError)
2474 PRE_INIT(IndentationError)
2475 PRE_INIT(TabError)
2476 PRE_INIT(LookupError)
2477 PRE_INIT(IndexError)
2478 PRE_INIT(KeyError)
2479 PRE_INIT(ValueError)
2480 PRE_INIT(UnicodeError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002481 PRE_INIT(UnicodeEncodeError)
2482 PRE_INIT(UnicodeDecodeError)
2483 PRE_INIT(UnicodeTranslateError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002484 PRE_INIT(AssertionError)
2485 PRE_INIT(ArithmeticError)
2486 PRE_INIT(FloatingPointError)
2487 PRE_INIT(OverflowError)
2488 PRE_INIT(ZeroDivisionError)
2489 PRE_INIT(SystemError)
2490 PRE_INIT(ReferenceError)
Neal Norwitzfaa54a32007-08-19 04:23:20 +00002491 PRE_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002492 PRE_INIT(MemoryError)
Benjamin Peterson2b968d62008-07-05 23:38:30 +00002493 PRE_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002494 PRE_INIT(Warning)
2495 PRE_INIT(UserWarning)
2496 PRE_INIT(DeprecationWarning)
2497 PRE_INIT(PendingDeprecationWarning)
2498 PRE_INIT(SyntaxWarning)
2499 PRE_INIT(RuntimeWarning)
2500 PRE_INIT(FutureWarning)
2501 PRE_INIT(ImportWarning)
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002502 PRE_INIT(UnicodeWarning)
Guido van Rossum98297ee2007-11-06 21:34:58 +00002503 PRE_INIT(BytesWarning)
Georg Brandl08be72d2010-10-24 15:11:22 +00002504 PRE_INIT(ResourceWarning)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002505
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002506 /* OSError subclasses */
2507 PRE_INIT(ConnectionError);
2508
2509 PRE_INIT(BlockingIOError);
2510 PRE_INIT(BrokenPipeError);
2511 PRE_INIT(ChildProcessError);
2512 PRE_INIT(ConnectionAbortedError);
2513 PRE_INIT(ConnectionRefusedError);
2514 PRE_INIT(ConnectionResetError);
2515 PRE_INIT(FileExistsError);
2516 PRE_INIT(FileNotFoundError);
2517 PRE_INIT(IsADirectoryError);
2518 PRE_INIT(NotADirectoryError);
2519 PRE_INIT(InterruptedError);
2520 PRE_INIT(PermissionError);
2521 PRE_INIT(ProcessLookupError);
2522 PRE_INIT(TimeoutError);
2523
Thomas Wouters477c8d52006-05-27 19:21:47 +00002524 bdict = PyModule_GetDict(bltinmod);
2525 if (bdict == NULL)
2526 Py_FatalError("exceptions bootstrapping error.");
2527
2528 POST_INIT(BaseException)
2529 POST_INIT(Exception)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002530 POST_INIT(TypeError)
Yury Selivanov75445082015-05-11 22:57:16 -04002531 POST_INIT(StopAsyncIteration)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002532 POST_INIT(StopIteration)
2533 POST_INIT(GeneratorExit)
2534 POST_INIT(SystemExit)
2535 POST_INIT(KeyboardInterrupt)
2536 POST_INIT(ImportError)
Eric Snowc9432652016-09-07 15:42:32 -07002537 POST_INIT(ModuleNotFoundError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002538 POST_INIT(OSError)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002539 INIT_ALIAS(EnvironmentError, OSError)
2540 INIT_ALIAS(IOError, OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002541#ifdef MS_WINDOWS
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002542 INIT_ALIAS(WindowsError, OSError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002543#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00002544 POST_INIT(EOFError)
2545 POST_INIT(RuntimeError)
Yury Selivanovf488fb42015-07-03 01:04:23 -04002546 POST_INIT(RecursionError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002547 POST_INIT(NotImplementedError)
2548 POST_INIT(NameError)
2549 POST_INIT(UnboundLocalError)
2550 POST_INIT(AttributeError)
2551 POST_INIT(SyntaxError)
2552 POST_INIT(IndentationError)
2553 POST_INIT(TabError)
2554 POST_INIT(LookupError)
2555 POST_INIT(IndexError)
2556 POST_INIT(KeyError)
2557 POST_INIT(ValueError)
2558 POST_INIT(UnicodeError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002559 POST_INIT(UnicodeEncodeError)
2560 POST_INIT(UnicodeDecodeError)
2561 POST_INIT(UnicodeTranslateError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002562 POST_INIT(AssertionError)
2563 POST_INIT(ArithmeticError)
2564 POST_INIT(FloatingPointError)
2565 POST_INIT(OverflowError)
2566 POST_INIT(ZeroDivisionError)
2567 POST_INIT(SystemError)
2568 POST_INIT(ReferenceError)
Neal Norwitzfaa54a32007-08-19 04:23:20 +00002569 POST_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002570 POST_INIT(MemoryError)
Benjamin Peterson2b968d62008-07-05 23:38:30 +00002571 POST_INIT(BufferError)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002572 POST_INIT(Warning)
2573 POST_INIT(UserWarning)
2574 POST_INIT(DeprecationWarning)
2575 POST_INIT(PendingDeprecationWarning)
2576 POST_INIT(SyntaxWarning)
2577 POST_INIT(RuntimeWarning)
2578 POST_INIT(FutureWarning)
2579 POST_INIT(ImportWarning)
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002580 POST_INIT(UnicodeWarning)
Guido van Rossum98297ee2007-11-06 21:34:58 +00002581 POST_INIT(BytesWarning)
Georg Brandl08be72d2010-10-24 15:11:22 +00002582 POST_INIT(ResourceWarning)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002583
Antoine Pitrouac456a12012-01-18 21:35:21 +01002584 if (!errnomap) {
2585 errnomap = PyDict_New();
2586 if (!errnomap)
2587 Py_FatalError("Cannot allocate map from errnos to OSError subclasses");
2588 }
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002589
2590 /* OSError subclasses */
2591 POST_INIT(ConnectionError);
2592
2593 POST_INIT(BlockingIOError);
2594 ADD_ERRNO(BlockingIOError, EAGAIN);
2595 ADD_ERRNO(BlockingIOError, EALREADY);
2596 ADD_ERRNO(BlockingIOError, EINPROGRESS);
2597 ADD_ERRNO(BlockingIOError, EWOULDBLOCK);
2598 POST_INIT(BrokenPipeError);
2599 ADD_ERRNO(BrokenPipeError, EPIPE);
Berker Peksaga787e5f2016-07-30 14:14:12 +03002600#ifdef ESHUTDOWN
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002601 ADD_ERRNO(BrokenPipeError, ESHUTDOWN);
Berker Peksaga787e5f2016-07-30 14:14:12 +03002602#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002603 POST_INIT(ChildProcessError);
2604 ADD_ERRNO(ChildProcessError, ECHILD);
2605 POST_INIT(ConnectionAbortedError);
2606 ADD_ERRNO(ConnectionAbortedError, ECONNABORTED);
2607 POST_INIT(ConnectionRefusedError);
2608 ADD_ERRNO(ConnectionRefusedError, ECONNREFUSED);
2609 POST_INIT(ConnectionResetError);
2610 ADD_ERRNO(ConnectionResetError, ECONNRESET);
2611 POST_INIT(FileExistsError);
2612 ADD_ERRNO(FileExistsError, EEXIST);
2613 POST_INIT(FileNotFoundError);
2614 ADD_ERRNO(FileNotFoundError, ENOENT);
2615 POST_INIT(IsADirectoryError);
2616 ADD_ERRNO(IsADirectoryError, EISDIR);
2617 POST_INIT(NotADirectoryError);
2618 ADD_ERRNO(NotADirectoryError, ENOTDIR);
2619 POST_INIT(InterruptedError);
2620 ADD_ERRNO(InterruptedError, EINTR);
2621 POST_INIT(PermissionError);
2622 ADD_ERRNO(PermissionError, EACCES);
2623 ADD_ERRNO(PermissionError, EPERM);
2624 POST_INIT(ProcessLookupError);
2625 ADD_ERRNO(ProcessLookupError, ESRCH);
2626 POST_INIT(TimeoutError);
2627 ADD_ERRNO(TimeoutError, ETIMEDOUT);
2628
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002629 preallocate_memerrors();
Thomas Wouters477c8d52006-05-27 19:21:47 +00002630
Antoine Pitrou1c7ade52012-01-18 16:13:31 +01002631 if (!PyExc_RecursionErrorInst) {
Yury Selivanovf488fb42015-07-03 01:04:23 -04002632 PyExc_RecursionErrorInst = BaseException_new(&_PyExc_RecursionError, NULL, NULL);
Antoine Pitrou1c7ade52012-01-18 16:13:31 +01002633 if (!PyExc_RecursionErrorInst)
Yury Selivanovf488fb42015-07-03 01:04:23 -04002634 Py_FatalError("Cannot pre-allocate RecursionError instance for "
Antoine Pitrou1c7ade52012-01-18 16:13:31 +01002635 "recursion errors");
2636 else {
2637 PyBaseExceptionObject *err_inst =
2638 (PyBaseExceptionObject *)PyExc_RecursionErrorInst;
2639 PyObject *args_tuple;
2640 PyObject *exc_message;
2641 exc_message = PyUnicode_FromString("maximum recursion depth exceeded");
2642 if (!exc_message)
Yury Selivanovf488fb42015-07-03 01:04:23 -04002643 Py_FatalError("cannot allocate argument for RecursionError "
Antoine Pitrou1c7ade52012-01-18 16:13:31 +01002644 "pre-allocation");
2645 args_tuple = PyTuple_Pack(1, exc_message);
2646 if (!args_tuple)
Yury Selivanovf488fb42015-07-03 01:04:23 -04002647 Py_FatalError("cannot allocate tuple for RecursionError "
Antoine Pitrou1c7ade52012-01-18 16:13:31 +01002648 "pre-allocation");
2649 Py_DECREF(exc_message);
2650 if (BaseException_init(err_inst, args_tuple, NULL))
Yury Selivanovf488fb42015-07-03 01:04:23 -04002651 Py_FatalError("init of pre-allocated RecursionError failed");
Antoine Pitrou1c7ade52012-01-18 16:13:31 +01002652 Py_DECREF(args_tuple);
2653 }
Thomas Wouters89d996e2007-09-08 17:39:28 +00002654 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002655}
2656
2657void
2658_PyExc_Fini(void)
2659{
Benjamin Peterson78565b22009-06-28 19:19:51 +00002660 Py_CLEAR(PyExc_RecursionErrorInst);
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00002661 free_preallocated_memerrors();
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002662 Py_CLEAR(errnomap);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002663}
Nick Coghlan8b097b42013-11-13 23:49:21 +10002664
2665/* Helper to do the equivalent of "raise X from Y" in C, but always using
2666 * the current exception rather than passing one in.
2667 *
2668 * We currently limit this to *only* exceptions that use the BaseException
2669 * tp_init and tp_new methods, since we can be reasonably sure we can wrap
2670 * those correctly without losing data and without losing backwards
2671 * compatibility.
2672 *
2673 * We also aim to rule out *all* exceptions that might be storing additional
2674 * state, whether by having a size difference relative to BaseException,
2675 * additional arguments passed in during construction or by having a
2676 * non-empty instance dict.
2677 *
2678 * We need to be very careful with what we wrap, since changing types to
2679 * a broader exception type would be backwards incompatible for
2680 * existing codecs, and with different init or new method implementations
2681 * may either not support instantiation with PyErr_Format or lose
2682 * information when instantiated that way.
2683 *
2684 * XXX (ncoghlan): This could be made more comprehensive by exploiting the
2685 * fact that exceptions are expected to support pickling. If more builtin
2686 * exceptions (e.g. AttributeError) start to be converted to rich
2687 * exceptions with additional attributes, that's probably a better approach
2688 * to pursue over adding special cases for particular stateful subclasses.
2689 *
2690 * Returns a borrowed reference to the new exception (if any), NULL if the
2691 * existing exception was left in place.
2692 */
2693PyObject *
2694_PyErr_TrySetFromCause(const char *format, ...)
2695{
2696 PyObject* msg_prefix;
2697 PyObject *exc, *val, *tb;
2698 PyTypeObject *caught_type;
Christian Heimes6a3db252013-11-14 01:47:14 +01002699 PyObject **dictptr;
Nick Coghlan8b097b42013-11-13 23:49:21 +10002700 PyObject *instance_args;
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002701 Py_ssize_t num_args, caught_type_size, base_exc_size;
Nick Coghlan8b097b42013-11-13 23:49:21 +10002702 PyObject *new_exc, *new_val, *new_tb;
2703 va_list vargs;
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002704 int same_basic_size;
Nick Coghlan8b097b42013-11-13 23:49:21 +10002705
Nick Coghlan8b097b42013-11-13 23:49:21 +10002706 PyErr_Fetch(&exc, &val, &tb);
Benjamin Peterson079c9982013-11-13 23:25:01 -05002707 caught_type = (PyTypeObject *)exc;
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002708 /* Ensure type info indicates no extra state is stored at the C level
2709 * and that the type can be reinstantiated using PyErr_Format
2710 */
2711 caught_type_size = caught_type->tp_basicsize;
2712 base_exc_size = _PyExc_BaseException.tp_basicsize;
2713 same_basic_size = (
2714 caught_type_size == base_exc_size ||
2715 (PyType_SUPPORTS_WEAKREFS(caught_type) &&
Victor Stinner12174a52014-08-15 23:17:38 +02002716 (caught_type_size == base_exc_size + (Py_ssize_t)sizeof(PyObject *))
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002717 )
2718 );
Benjamin Peterson079c9982013-11-13 23:25:01 -05002719 if (caught_type->tp_init != (initproc)BaseException_init ||
Nick Coghlan8b097b42013-11-13 23:49:21 +10002720 caught_type->tp_new != BaseException_new ||
Nick Coghlanf1de55f2013-11-19 22:33:10 +10002721 !same_basic_size ||
Benjamin Peterson079c9982013-11-13 23:25:01 -05002722 caught_type->tp_itemsize != _PyExc_BaseException.tp_itemsize) {
Nick Coghlan8b097b42013-11-13 23:49:21 +10002723 /* We can't be sure we can wrap this safely, since it may contain
2724 * more state than just the exception type. Accordingly, we just
2725 * leave it alone.
2726 */
2727 PyErr_Restore(exc, val, tb);
2728 return NULL;
2729 }
2730
2731 /* Check the args are empty or contain a single string */
2732 PyErr_NormalizeException(&exc, &val, &tb);
Benjamin Peterson079c9982013-11-13 23:25:01 -05002733 instance_args = ((PyBaseExceptionObject *)val)->args;
Nick Coghlan8b097b42013-11-13 23:49:21 +10002734 num_args = PyTuple_GET_SIZE(instance_args);
Benjamin Peterson079c9982013-11-13 23:25:01 -05002735 if (num_args > 1 ||
Nick Coghlan8b097b42013-11-13 23:49:21 +10002736 (num_args == 1 &&
Benjamin Peterson079c9982013-11-13 23:25:01 -05002737 !PyUnicode_CheckExact(PyTuple_GET_ITEM(instance_args, 0)))) {
Nick Coghlan8b097b42013-11-13 23:49:21 +10002738 /* More than 1 arg, or the one arg we do have isn't a string
2739 */
2740 PyErr_Restore(exc, val, tb);
2741 return NULL;
2742 }
2743
2744 /* Ensure the instance dict is also empty */
Christian Heimes6a3db252013-11-14 01:47:14 +01002745 dictptr = _PyObject_GetDictPtr(val);
Benjamin Peterson079c9982013-11-13 23:25:01 -05002746 if (dictptr != NULL && *dictptr != NULL &&
2747 PyObject_Length(*dictptr) > 0) {
Nick Coghlan8b097b42013-11-13 23:49:21 +10002748 /* While we could potentially copy a non-empty instance dictionary
2749 * to the replacement exception, for now we take the more
2750 * conservative path of leaving exceptions with attributes set
2751 * alone.
2752 */
2753 PyErr_Restore(exc, val, tb);
2754 return NULL;
2755 }
2756
2757 /* For exceptions that we can wrap safely, we chain the original
2758 * exception to a new one of the exact same type with an
2759 * error message that mentions the additional details and the
2760 * original exception.
2761 *
2762 * It would be nice to wrap OSError and various other exception
2763 * types as well, but that's quite a bit trickier due to the extra
2764 * state potentially stored on OSError instances.
2765 */
Nick Coghlan77b286b2014-01-27 00:53:38 +10002766 /* Ensure the traceback is set correctly on the existing exception */
2767 if (tb != NULL) {
2768 PyException_SetTraceback(val, tb);
2769 Py_DECREF(tb);
2770 }
Benjamin Petersone109ee82013-11-13 23:49:49 -05002771
Christian Heimes507eabd2013-11-14 01:39:35 +01002772#ifdef HAVE_STDARG_PROTOTYPES
2773 va_start(vargs, format);
2774#else
2775 va_start(vargs);
2776#endif
Nick Coghlan8b097b42013-11-13 23:49:21 +10002777 msg_prefix = PyUnicode_FromFormatV(format, vargs);
Christian Heimes507eabd2013-11-14 01:39:35 +01002778 va_end(vargs);
Benjamin Petersone109ee82013-11-13 23:49:49 -05002779 if (msg_prefix == NULL) {
Nick Coghlan4b9b9362013-11-16 00:34:13 +10002780 Py_DECREF(exc);
Benjamin Petersone109ee82013-11-13 23:49:49 -05002781 Py_DECREF(val);
Nick Coghlan8b097b42013-11-13 23:49:21 +10002782 return NULL;
Benjamin Petersone109ee82013-11-13 23:49:49 -05002783 }
Nick Coghlan8b097b42013-11-13 23:49:21 +10002784
2785 PyErr_Format(exc, "%U (%s: %S)",
2786 msg_prefix, Py_TYPE(val)->tp_name, val);
Nick Coghlan4b9b9362013-11-16 00:34:13 +10002787 Py_DECREF(exc);
Benjamin Petersone109ee82013-11-13 23:49:49 -05002788 Py_DECREF(msg_prefix);
Nick Coghlan8b097b42013-11-13 23:49:21 +10002789 PyErr_Fetch(&new_exc, &new_val, &new_tb);
2790 PyErr_NormalizeException(&new_exc, &new_val, &new_tb);
2791 PyException_SetCause(new_val, val);
2792 PyErr_Restore(new_exc, new_val, new_tb);
2793 return new_val;
2794}
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10002795
2796
2797/* To help with migration from Python 2, SyntaxError.__init__ applies some
2798 * heuristics to try to report a more meaningful exception when print and
2799 * exec are used like statements.
2800 *
2801 * The heuristics are currently expected to detect the following cases:
2802 * - top level statement
2803 * - statement in a nested suite
2804 * - trailing section of a one line complex statement
2805 *
2806 * They're currently known not to trigger:
2807 * - after a semi-colon
2808 *
2809 * The error message can be a bit odd in cases where the "arguments" are
2810 * completely illegal syntactically, but that isn't worth the hassle of
2811 * fixing.
2812 *
2813 * We also can't do anything about cases that are legal Python 3 syntax
2814 * but mean something entirely different from what they did in Python 2
2815 * (omitting the arguments entirely, printing items preceded by a unary plus
2816 * or minus, using the stream redirection syntax).
2817 */
2818
2819static int
2820_check_for_legacy_statements(PySyntaxErrorObject *self, Py_ssize_t start)
2821{
2822 /* Return values:
2823 * -1: an error occurred
2824 * 0: nothing happened
2825 * 1: the check triggered & the error message was changed
2826 */
2827 static PyObject *print_prefix = NULL;
2828 static PyObject *exec_prefix = NULL;
2829 Py_ssize_t text_len = PyUnicode_GET_LENGTH(self->text);
2830 int kind = PyUnicode_KIND(self->text);
2831 void *data = PyUnicode_DATA(self->text);
2832
2833 /* Ignore leading whitespace */
2834 while (start < text_len) {
2835 Py_UCS4 ch = PyUnicode_READ(kind, data, start);
2836 if (!Py_UNICODE_ISSPACE(ch))
2837 break;
2838 start++;
2839 }
2840 /* Checking against an empty or whitespace-only part of the string */
2841 if (start == text_len) {
2842 return 0;
2843 }
2844
2845 /* Check for legacy print statements */
2846 if (print_prefix == NULL) {
2847 print_prefix = PyUnicode_InternFromString("print ");
2848 if (print_prefix == NULL) {
2849 return -1;
2850 }
2851 }
2852 if (PyUnicode_Tailmatch(self->text, print_prefix,
2853 start, text_len, -1)) {
Serhiy Storchaka48842712016-04-06 09:45:48 +03002854 Py_XSETREF(self->msg,
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02002855 PyUnicode_FromString("Missing parentheses in call to 'print'"));
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10002856 return 1;
2857 }
2858
2859 /* Check for legacy exec statements */
2860 if (exec_prefix == NULL) {
2861 exec_prefix = PyUnicode_InternFromString("exec ");
2862 if (exec_prefix == NULL) {
2863 return -1;
2864 }
2865 }
2866 if (PyUnicode_Tailmatch(self->text, exec_prefix,
2867 start, text_len, -1)) {
Serhiy Storchaka48842712016-04-06 09:45:48 +03002868 Py_XSETREF(self->msg,
Serhiy Storchaka4a1e70f2015-12-27 12:36:18 +02002869 PyUnicode_FromString("Missing parentheses in call to 'exec'"));
Nick Coghlan5b1fdc12014-06-16 19:48:02 +10002870 return 1;
2871 }
2872 /* Fall back to the default error message */
2873 return 0;
2874}
2875
2876static int
2877_report_missing_parentheses(PySyntaxErrorObject *self)
2878{
2879 Py_UCS4 left_paren = 40;
2880 Py_ssize_t left_paren_index;
2881 Py_ssize_t text_len = PyUnicode_GET_LENGTH(self->text);
2882 int legacy_check_result = 0;
2883
2884 /* Skip entirely if there is an opening parenthesis */
2885 left_paren_index = PyUnicode_FindChar(self->text, left_paren,
2886 0, text_len, 1);
2887 if (left_paren_index < -1) {
2888 return -1;
2889 }
2890 if (left_paren_index != -1) {
2891 /* Use default error message for any line with an opening paren */
2892 return 0;
2893 }
2894 /* Handle the simple statement case */
2895 legacy_check_result = _check_for_legacy_statements(self, 0);
2896 if (legacy_check_result < 0) {
2897 return -1;
2898
2899 }
2900 if (legacy_check_result == 0) {
2901 /* Handle the one-line complex statement case */
2902 Py_UCS4 colon = 58;
2903 Py_ssize_t colon_index;
2904 colon_index = PyUnicode_FindChar(self->text, colon,
2905 0, text_len, 1);
2906 if (colon_index < -1) {
2907 return -1;
2908 }
2909 if (colon_index >= 0 && colon_index < text_len) {
2910 /* Check again, starting from just after the colon */
2911 if (_check_for_legacy_statements(self, colon_index+1) < 0) {
2912 return -1;
2913 }
2914 }
2915 }
2916 return 0;
2917}